在第一季的部分介紹了怎樣將視窗切割成自己需要的樣子。這一季我們討論一下如何對切割後視窗布局進行旋轉。為什麼需要旋轉視窗布局呢?最簡單的答案是:任何一個視窗布局,總有某一個時刻會讓你感覺無法滿足你當前的需要。這時候我們怎麼辦?改變視窗總比改變自己要好。既然選擇了改變視窗布局,如何改變就成了下一個問題。如果能有一個傳送門,讓我們直接到達想要的地方,當然要把先回到最初的單視窗模式,然後再重新切割布局要方便的多了。旋轉視窗就是這樣的一個傳送門。
讓我們先從常用的多視窗模式開始說起。通常所用的多視窗模式以二視窗、三視窗、四視窗為多。四個以上視窗的環境一方面是比較少用(比較螢幕空間總是有限的,視窗切的太多,每一個視窗能用的面積就很有限了),另一方面,如果真的選擇了如此複雜的視窗布局,一般也應該是經過謹慎選擇,專為某一種特定需求而打造的,通常需要重新布局的機會也不會很多。
所以在這裡我們只討論二視窗、三視窗、四視窗的情況。其中四視窗模式(就是田字形)由於同時具有軸對稱和中心對稱的特點,所以也不存在旋轉的必要。這樣以來,我們需要討論的就只剩下二視窗和三視窗兩種模式了。
二視窗模式的旋轉
二視窗的旋轉很容易理解啦。無非就是從橫向轉成豎向,再從豎向轉成橫向。 但是,這裡有一個壞訊息和一個好訊息。壞訊息是這樣簡單的事情 Emacs 的原生代碼裡面居然沒有提供直接的支援。在原生 Emacs 裡面只能選擇先使用 Ctrl-x 0 或者 Ctrl-x 1 回到單視窗模式,然後再使用 Ctrl-x 2 或者 Ctrl-x 3 重新切割。在 tmux 和 Vim 裡面,這樣的旋轉是被原生支援的。好訊息是我自己寫了一個 Emacs 擴充函數 change-split-type 來補上這個缺口。同學們在使用的時候可以自己把這個函數綁定到 Ctrl-x 4 c 上面。並且由於這個函數是自適應的,所以無論是從橫向轉成豎向,還是從豎向轉成橫向,都只需要這一個函數,及一個按鍵綁定就足夠了。
在下面的樣本當中仍然遵循第一季中的約定,命令/操作的樣本按如下順序給出 Emacs - tmux - vim
#+BEGIN_EXAMPLE
+--------------------------------+ +----------------+----------------+
| | change-split-type | | |
| a | Ctrl-b Alt-1 | | a |
| | Ctrl-w L | | |
+--------------------------------+ ----------------> | | |
| | | | |
| | | | |
| | | | |
+--------------------------------+ +----------------+----------------+
+---------------+----------------+ +--------------------------------+
| | | change-split-type | |
| a | | Ctrl-b Alt-2 | a |
| | | Ctrl-w K | |
| | | ----------------> +--------------------------------+
| | | | |
| | | | |
| | | | |
+---------------+----------------+ +--------------------------------+
#+END_EXAMPLE
三視窗模式的旋轉
另外,由於視窗旋轉涉及到的問題比較複雜,所以這次我們要把 Eamcs, tmux 和 Vim 分開來講。首先是 Emacs
Emacs 的三視窗旋轉
也許你已經猜到了,三視窗的旋轉在 Emacs 當中也沒有提供原生的支援。好訊息是我也寫了一個 Emacs 擴充函數 change-split-type-3 來解決這個問題。這個函數也是一個自適應函數,不論當前的視窗布局處於所示的那一種模式,這個函數都會將它們順時針旋轉。這樣就不需要使用者自己去小心識別不同的情境,然後再去選擇正確的函數了。這個函數在我的 Emacs 中是綁定在 Ctrl-x 4 C 上的。注意這裡的 C 是大寫,以便與上一個函數相區別。
#+BEGIN_EXAMPLE
+--------------------------------+ +----------------+---------------+
| | change-split-type-3 | | |
| a | Ctrl-x 4 C | | a |
| | | | |
+---------------+----------------+ ----------------> +----------------+ |
| | | | | |
| | | | | |
| | | | | |
+---------------+----------------+ +----------------+---------------+
^ |
| change-split-type-3 | change-split-type-3
| Ctrl-x 4 C | Ctrl-x 4 C
| |
| v
+---------------+----------------+ +----------------+---------------+
| | | change-split-type-3 | | |
| a | | Ctrl-x 4 C | | |
| | | | | |
| +----------------+ <---------------- +----------------+---------------+
| | | | |
| | | | a |
| | | | |
+---------------+----------------+ +--------------------------------+
#+END_EXAMPLE
實際上在 Emacs 這裡還有一個好訊息。既然要自己寫函數,我就索性再寫一個,把旋轉緩衝區的問題也一併解決了。所謂旋轉緩衝區就是保持當前視窗模式不變,將三個視窗當中的編輯緩衝區按照順時針的方向,相互調換。 這個函數的名字是 roll-v-3 。在我的 Emacs 當中被綁定在 Ctrl-x 4 r 按鍵組合上。
#+BEGIN_EXAMPLE
+--------------------------------+ +--------------------------------+
| | roll-v-3 | |
| A | Ctrl-x 4 r | B |
| | | |
+---------------+----------------+ ----------------> +---------------+----------------|
| | | | | |
| B | C | | C | A |
| | | | | |
+---------------+----------------+ +---------------+----------------+
^ |
| roll-v-3 roll-v-3 |
| Ctrl-x 4 r Ctrl-x 4 r |
| |
| +-------------------------------+ |
| | | |
+------------- | C | <------------+
| |
+---------------+---------------+
| | |
| A | B |
| | |
+---------------+---------------+
#+END_EXAMPLE
tmux 的三視窗旋轉
tmux 對三視窗模式提供了原生支援,所以在 tmux 裡面進行三視窗旋轉是最方便的。但是這種支援也是有限度的,大家可以看到在這裡 tmux 比 Emacs 少了一種布局方式。
註: 下面樣本中的 M 代表 Meta 鍵,對應到現代鍵盤上通常是 ALT 鍵
#+BEGIN_EXAMPLE
+----------------+----------------+
Ctrl-b M-3 | | |
+-------------------------------------- | | b |
| | | |
| +---------------------------------> | a +----------------+
| | Ctrl-b M-4 | | |
| | | | c |
v | | | |
+--------------------------------+ +----------------+----------------+
| | ^ |
| a | | |
| | | |
+---------------+----------------+ Ctrl-b M-4 | | Ctrl-b M-5
| | | | |
| b | c | | |
| | | | v
+---------------+----------------+ +----------------+----------------+
| ^ | | |
| | | a | b |
| | Ctrl-b M-3 | | |
| +---------------------------------- +----------------+----------------+
| | |
+-------------------------------------> | c |
Ctrl-b M-5 | |
+---------------------------------+
#+END_EXAMPLE
Vim 的三視窗旋轉
Vim 的視窗旋轉在這裡是最複雜的。首先 Vim 也對視窗的旋轉提供了原生的支援。通過原生支援,可以實現各種各樣的旋轉支援,並且所有這些方式都具有濃鬱的 Vim 色彩。
對於 Vim 的三視窗旋轉需要分成兩部分來介紹。首先是最簡單的一種方式。這種方式嚴格來說不能稱之為“旋轉”,應該叫“對調”才對,但是因為也是可以在三視窗模式下使用的一種操作,所以在這裡就一併介紹了。
#+BEGIN_EXAMPLE
+--------------------------------+ +----------------+----------------+
| | | | |
| a | Ctrl-w J | b | c |
| | -----------------> | | |
+---------------+----------------+ +----------------+----------------+
| | | <----------------- | |
| b | c | Ctrl-w K | a |
| | | | |
+---------------+----------------+ +---------------------------------+
#+END_EXAMPLE
下面要介紹的就是真正的旋轉了。雖然 Vim 原生提供了豐富的多視窗操作支援,但是其中的有些操作並不是非常直接的。從下面的樣本中就能看到,需要一個中間狀態來過渡,才能夠完成。
注1: 在一下樣本中,標有字母 a 的視窗代表當前視窗,也就是游標所在的視窗。
注2:在右下角的旋轉樣本當中,標有字母 b 的視窗代表當前視窗。
#+BEGIN_EXAMPLE
+-----------------+ +-----+-----+-----+ +--------+--------+
| a | Ctrl-w H | | | | Ctrl-w J | b | c |
| | --------------> | | | | --------------> | | |
+--------+--------+ | a | b | c | +--------+--------+
| b | c | <-------------- | | | | <-------------- | a |
| | | Ctrl-w K | | | | Ctrl-w H | |
+--------+--------+ +-----+-----+-----+ +-----------------+
+--------+--------+ +-----------------+ +--------+--------+
| | b | Ctrl-w K | a | Ctrl-w L | b | |
| | | --------------> +-----------------+ -------------> | | |
| a +--------+ | b | +--------+ a |
| | | <-------------- +-----------------+ <------------- | | |
| | c | Ctrl-w H | c | Ctrl-w K | c | |
+--------+--------+ +-----------------+ +--------+--------+
^ |
| Ctrl-w H | Ctrl-w H
| v
+-----------------+ +--------+--------+
| | | | |
| | | | |
+--------+--------+ +--------+--------+
| | | | |
| | a | | b |
+--------+--------+ +-----------------+
#+END_EXAMPLE
註: 關於這一季當中提到的所以 Emacs 擴充函數,請訪問 EmacsWiki