在第一季的部分介紹了怎樣將窗口切割成自己需要的樣子。這一季我們討論一下如何對切割后窗口布局進行旋轉。為什么需要旋轉窗口布局呢?最簡單的答案是:任何一個窗口布局,總有某一個時刻會讓你感覺無法滿足你當前的需要。這時候我們怎么辦?改變窗口總比改變自己要好。既然選擇了改變窗口布局,如何改變就成了下一個問題。如果能有一個傳送門,讓我們直接到達想要的地方,當然要把先回到最初的單窗口模式,然后再重新切割布局要方便的多了。旋轉窗口就是這樣的一個傳送門。
讓我們先從常用的多窗口模式開始說起。通常所用的多窗口模式以二窗口、三窗口、四窗口為多。四個以上窗口的環境一方面是比較少用(比較屏幕空間總是有限的,窗口切的太多,每一個窗口能用的面積就很有限了),另一方面,如果真的選擇了如此復雜的窗口布局,一般也應該是經過慎重選擇,專為某一種特定需求而打造的,通常需要重新布局的機會也不會很多。
所以在這里我們只討論二窗口、三窗口、四窗口的情況。其中四窗口模式(就是田字形)由於同時具有軸對稱和中心對稱的特點,所以也不存在旋轉的必要。這樣以來,我們需要討論的就只剩下二窗口和三窗口兩種模式了。
二窗口模式的旋轉
二窗口的旋轉很容易理解啦。無非就是從橫向轉成豎向,再從豎向轉成橫向。 但是,這里有一個壞消息和一個好消息。壞消息是這樣簡單的事情 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