Emacs tmux 和 vim 環境下的多窗口工作環境 - 第二季 窗口旋轉


 

在第一季的部分介紹了怎樣將窗口切割成自己需要的樣子。這一季我們討論一下如何對切割后窗口布局進行旋轉。為什么需要旋轉窗口布局呢?最簡單的答案是:任何一個窗口布局,總有某一個時刻會讓你感覺無法滿足你當前的需要。這時候我們怎么辦?改變窗口總比改變自己要好。既然選擇了改變窗口布局,如何改變就成了下一個問題。如果能有一個傳送門,讓我們直接到達想要的地方,當然要把先回到最初的單窗口模式,然后再重新切割布局要方便的多了。旋轉窗口就是這樣的一個傳送門。

 

讓我們先從常用的多窗口模式開始說起。通常所用的多窗口模式以二窗口、三窗口、四窗口為多。四個以上窗口的環境一方面是比較少用(比較屏幕空間總是有限的,窗口切的太多,每一個窗口能用的面積就很有限了),另一方面,如果真的選擇了如此復雜的窗口布局,一般也應該是經過慎重選擇,專為某一種特定需求而打造的,通常需要重新布局的機會也不會很多。

 

所以在這里我們只討論二窗口、三窗口、四窗口的情況。其中四窗口模式(就是田字形)由於同時具有軸對稱和中心對稱的特點,所以也不存在旋轉的必要。這樣以來,我們需要討論的就只剩下二窗口和三窗口兩種模式了。

 

二窗口模式的旋轉

二窗口的旋轉很容易理解啦。無非就是從橫向轉成豎向,再從豎向轉成橫向。  但是,這里有一個壞消息和一個好消息。壞消息是這樣簡單的事情 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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM