1. 程式人生 > >Vim 分屏功能+無外掛Vim程式設計技巧

Vim 分屏功能+無外掛Vim程式設計技巧

本篇文章主要教你如何使用 Vim 分屏功能。

vim-windows

分屏啟動Vim

  1. 使用大寫的O引數來垂直分屏。
    vim -On file1 file2 ...
  2. 使用小寫的o引數來水平分屏。
    vim -on file1 file2 ...

註釋: n是數字,表示分成幾個屏。

關閉分屏

  1. 關閉當前視窗。
    Ctrl+W c
  2. 關閉當前視窗,如果只剩最後一個了,則退出Vim。
    Ctrl+W q

分屏

  1. 上下分割當前開啟的檔案。
    Ctrl+W s
  2. 上下分割,並開啟一個新的檔案。
    :sp filename
  3. 左右分割當前開啟的檔案。
    Ctrl+W v
  4. 左右分割,並開啟一個新的檔案。
    :vsp filename

移動游標

Vi中的游標鍵是h, j, k, l,要在各個屏間切換,只需要先按一下Ctrl+W

  1. 把游標移到右邊的屏。
    Ctrl+W l
  2. 把游標移到左邊的屏中。
    Ctrl+W h
  3. 把游標移到上邊的屏中。
    Ctrl+W k
  4. 把游標移到下邊的屏中。
    Ctrl+W j
  5. 把游標移到下一個的屏中。.
    Ctrl+W w

移動分屏

這個功能還是使用了Vim的游標鍵,只不過都是大寫。當然了,如果你的分屏很亂很複雜的話,這個功能可能會出現一些非常奇怪的症狀。

  1. 向右移動。
    Ctrl+W L
  2. 向左移動
    Ctrl+W H
  3. 向上移動
    Ctrl+W K
  4. 向下移動
    Ctrl+W J

螢幕尺寸

下面是改變尺寸的一些操作,主要是高度,對於寬度你可以使用[Ctrl+W <]或是[Ctrl+W >],但這可能需要最新的版本才支援。

  1. 讓所有的屏都有一樣的高度。
    Ctrl+W =
  2. 增加高度。
    Ctrl+W +
  3. 減少高度。
    Ctrl+W -

也許還有其它我不知道的,歡迎你補充。

相信大家看過《簡明Vim教程》也玩了《Vim大冒險》的遊戲了,相信大家對Vim都有一個好的入門了。我在這裡把我日常用Vim程式設計的一些技巧列出來給大家看看,希望對大家有用,另外,也是一個拋磚引玉的過程,也希望大家把你們的技巧跟貼一下,我會更新到這篇文章中。另外,這篇文章裡的這些技巧全都是vim原生態的,不需要你安裝什麼外掛。我的Vim的版本是7.2

瀏覽程式碼

首先,我們先從瀏覽程式碼開始。有時候,我們需要看多個檔案,所以,傳統的做法是,我們開多個tty終端,每個tty裡用Vim開啟一個檔案,然後來回切換。這很沒有什麼效率。我們希望在一個Vim裡開啟多個檔案,甚至瀏覽程式目錄。

瀏覽目錄的命令很簡單:(你也可以直接vim一個目錄)

:E

注意,是大寫。於是,你會看到下面這樣的介面:

這個介面中,你可以用 j, k 鍵上下移動,然後回車,進入一個目錄,或是找開一個檔案。你可以看到上面有一堆命令:

  • 【 – 】 到上級目錄
  • 【D】刪除檔案(大寫)
  • 【R】改檔名(大寫)
  • 【s】對檔案排序(小寫)
  • 【x】執行檔案

當然,開啟的檔案會把現有已開啟的檔案給沖掉——也就是說你只看到了一個檔案。

如果你要改變當前瀏覽的目錄,或是檢視當前瀏覽的目錄,你可以使用和shell一樣的命令:

:cd <dir> – 改變當前目錄

:pwd  – 檢視當前目錄

緩衝區

其實,你用:E 瀏覽開啟的檔案都沒有被關閉,這些檔案都在緩衝區中。你可以用下面的命令來檢視緩衝區:

:ls

於是,在你的Vim下,你會看到如下介面:

你可以看到Vim打開了四個檔案,編號是4,5,6,7,如果你要切換開啟的檔案,這個時候,你不要按回車(按了也沒事,只不過按了就看不到:ls輸出的buffer列表了),你可以使用下面的命令切換檔案(buffer後面的4表示切到4號檔案也就是src/http/ngx_http.c):

:buffer 4

或是:

:buffer src/http/ngx_http.c

注意,

  • 你可以像在Shell中輸入命令按Tab鍵補全一樣補全Vim的命令。
  • 也可以用像gdb一樣用最前面的幾個字元,只要沒有衝突。如:buff

你還可以動用如下命令,快速切換:

:bnext      縮寫 :bn
:bprevious   縮寫 :bp
:blast  縮寫 :bl
:bfirst 縮寫 :bf

上圖中,我們還可以看到5有一個%a,這表示當前檔案,相關的標記如下:

- (非活動的緩衝區)
a (當前被啟用緩衝區)
h (隱藏的緩衝區)
% (當前的緩衝區)
# (交換緩衝區)
= (只讀緩衝區)
+ (已經更改的緩衝區)

視窗分屏瀏覽

相信你在《Vim的視窗分屏》一文中,你已經知道了怎麼拆分視窗了。其實,我更多的不是用拆分視窗的命令,而是用瀏覽檔案的命令來分隔視窗。如:

把當前視窗上下分屏,並在下面進行目錄瀏覽:

:He   全稱為 :Hexplore  (在下邊分屏瀏覽目錄)

如果你要在上面,你就在 :He後面加個 !,

:He!  (在上分屏瀏覽目錄)

如果你要左右分屏的話,你可以這樣:

:Ve 全稱為 :Vexplore (在左邊分屏間瀏覽目錄,要在右邊則是 :Ve!)

下圖是分別用:He 和 :Ve搞出來的同時看三個檔案:

在分屏間的跳轉和切換在《Vim的視窗分屏》一文中提過了:先按Ctrl + W,然後按方向鍵:h j k l

分屏同步移動

要讓兩個分屏中的檔案同步移動,很簡單,你需要到需要同步移動的兩個屏中都輸入如下命令(相當於使用“鐵鎖連環”):

:set scb

如果你需要解開,那麼就輸入下面的命令:

:set scb!

注:set scb 是 set scrollbind 的簡寫。

Tab頁瀏覽目錄

分屏可能會讓你不爽,你可能更喜歡像Chrome這樣的分頁式的瀏覽,那麼你可以用下面的命令:

:Te  全稱是 :Texplorer

下圖中,你可以看到我用Te命令打開了三頁,就在頂端我們可以可以看到有三頁,其中第一頁Tab上的數字3表示那一頁有3個檔案。

我們要在多個Tabe頁中切換,在normal模式下,你可以使用下面三個按鍵(注意沒有冒號):

gt   – 到下一個頁

gT  – 到前一個頁

{i} gt   – i是數字,到指定頁,比如:5 gt 就是到第5頁

你可以以使用 【:tabm {n}】來切換Tab頁。

gvim應該是:Ctrl+PgDn 和 Ctrl+PgUp 來在各個頁中切換。

如果你想看看你現在開啟的視窗和Tab的情況,你可以使用下面的命令:

:tabs

於是你可以看到:

使用如下命令可以關閉tab:(當然,我更喜歡使用傳統的:q, :wq來關閉)

:tabclose [i] – 如果後面指定了數字,那就關閉指定頁,如果沒有就關閉當前頁

最後提一下,如果你在Shell命令列下,你可以使用 vim 的 -p 引數來用Tab頁的方式開啟多個檔案,比如:

vim -p cool.cpp shell.cpp haoel.cpp
vim -p *.cpp

注:如果你想把buffer中的檔案全轉成tab的話,你可以使用下面的命令

:bufdo tab split

儲存會話

如果你用Tab或Window打開了好些檔案的檔案,還設定了各種滾屏同步,或是行號……,那麼,你可以用下面的命令來儲存會話:(你有興趣你可以看看你的 mysession.vim檔案內容,也就是一個批處理檔案)

:mksession ~/.mysession.vim

如果檔案重複,vim預設會報錯,如果你想強行寫入的話,你可以在mksession後加! :

:mksession! ~/.mysession.vim

於是下次,你可以這樣開啟這個會話:

vim -S ~/.mysession.vim

儲存完會話後,你也沒有必要一個一個Tab/Windows的去Close。你可以簡單地使用:

:qa   – 退出全部 

:wqa  -儲存全部並退出全部

Quickfix

假如我們有一個hello.cpp檔案和一個makefile,於是我們可以直接在vim下輸入 :make , 於是就可以make這個hello.cpp檔案,如果出錯了,我們需要按回車返回,這個時候,我們可以使用下面的命令來把出錯顯到在vim的分屏中:

:cw

於是,就會出現下面右邊的那個樣子:(是不是看上去和我一樣很帥?)

上圖中左邊是我的makefile,右邊是我的錯誤百出的原始碼,右邊下面是quickfix窗屏。你可以看到quickfix窗屏指向的第一個錯誤已經定位到我們相就錯誤的檔案行上了。

你可以使用像瀏覽檔案那樣用j, k在quckfix窗屏中上下移動到相應的錯誤上然後按回車,然後就可以在上面的窗屏裡定位到相應的原始檔的程式碼行。但是,如果是這樣的話, 你要定位下一條錯誤還得用Ctrl +W 回到quickfix屏中來然後重複來過。

你可以使用下面的命令而不用回到quickfix中來:

:cp 跳到上一個錯誤

:cn 跳到下一個錯誤

:cl 列出所有錯誤

:cc 顯示錯誤詳細資訊

下面我們來看另一個quickfix的功能。

如果你用過vim的cscope外掛,你就知道cscope可以用來查詢相當的程式碼,但cscope需要事先生成一個數據庫,對一些簡單的查詢,其實,我們用vim的grep命令就可以了,不需要專門為之生成資料庫。vim的grep命令和shell的幾乎一樣。

我們來看個例子:

比如我們正在瀏覽nginx的程式碼,這時,我想看看哪裡用到了nginx的NGX_HTTP_VAR_INDEXED巨集。於是,我可以在vim裡輸入如下的命令:

:grep -r –include=”*.[ch]” NGX_HTTP_VAR_INDEXED src/

上面這個命令意思是遞迴查詢src目錄下所有的.c和.h檔案,其中包括NGX_HTTP_VAR_INDEXED巨集。然後,你就會看到vim到shell裡去執行並找到了相關的檔案,按回車返回vim後,別忘了用 【:cw 】把grep的輸出取回來,於是我們就有下面的樣子:

然後同上面一樣,你可以用 j,k 鍵移動quickfix裡的游標到相應的行,然後按回車定位檔案,或是使用【:cn】或【:cp】來移動到定位。(這樣,你會把多個檔案開啟到緩衝區,別忘了【:ls】來檢視緩衝區)

你看,到這裡,一個小小的IDE就這樣產生了,而且,最帥的時,我們連一點外掛都沒有裝,也沒有在.vimrc檔案中配置過什麼

關鍵字補全

我們還是堅持不用任何外掛。我們來看看是怎麼個自動補全的。

在insert模式下,我們可以按如下快捷鍵:

Ctrl +N】  – 當你按下這它時,你會發現Vim就開始搜尋你這個目錄下的程式碼,搜尋完成了就會出現一個下拉列表(居然是粉紫色的,真是醜死了)

下圖是我輸入了ngx_http_然後按ctrl+n出現的樣子,它已經幫我補全了一個,但是我不想要這個。然後,在Vim的下方我們可以看到狀態變成了“關鍵字補全”,然後後面有^N^P的提示,意思就是告訴你還有一個Ctrl+P.

Ctrl + P】 – 接下來你可以按這個鍵,於是回到原點,然後你可以按上下游標鍵來選擇相應的Word。

對於上面那個例子,我們按下了Ctrl+P後出現下面的這個樣子。我們可以看到,游標回到了一開始我輸入的位置,然後你可以幹兩件事,一個是繼續輸入(這可以幫助過濾關鍵詞),另一個是用“游標鍵”上移或下移來選擇下拉列表中的關鍵字,選好後回車,就補全了。

與此類似的,還有更多的補齊,都在Ctrl +X下面:

  • Ctrl + X 和 Ctrl + D 巨集定義補齊
  • Ctrl + X 和 Ctrl + ] 是Tag 補齊
  • Ctrl + X 和 Ctrl + F 是檔名 補齊
  • Ctrl + X 和 Ctrl + I 也是關鍵詞補齊,但是關鍵後會有個檔名,告訴你這個關鍵詞在哪個檔案中
  • Ctrl + X 和 Ctrl +V 是表示式補齊
  • Ctrl + X 和 Ctrl +L 這可以對整個行補齊,變態吧。

其它技巧

字元相關

【guu 】 – 把一行的文字變成全小寫。或是【Vu】

【gUU】 – 把一行的檔案變成全大寫。或是【VU】

按【v】鍵進入選擇模式,然後移動游標選擇你要的文字,按【u】轉小寫,按【U】轉大寫

【ga】 –  檢視游標處字元的ascii碼

【g8】 – 檢視游標處字元的utf-8編碼

【gf】  – 開啟游標處所指的檔案 (這個命令在打到#include標頭檔案時挺好用的,當然,僅限於有路徑的)

【*】或【#】在當前檔案中搜索當前游標的單詞

縮排相關

【>>】向右給它進當前行 【<<】向左縮排當前行

【=】  – 縮排當前行 (和上面不一樣的是,它會對齊縮排)

【=%】 – 把游標位置移到語句塊的括號上,然後按=%,縮排整個語句塊(%是括號匹配)

【G=gg】 或是 【gg=G】  – 縮排整個檔案(G是到檔案結尾,gg是到檔案開頭)

複製貼上相關

按【v】 鍵進入選擇模式,然後按h,j,k,l移動游標,選擇文字,然後按 【y】 進行復制,按 【p】 進行貼上。

【dd】剪下一行(前面加個數字可以剪下n行),【p】貼上

【yy】複製一行(前面加個數字可以複製n行),【p】貼上

游標移動相關

【Ctrl + O】向後回退你的游標移動

【Ctrl + I 】向前追趕你的游標移動

這兩個快捷鍵很有用,可以在Tab頁和Windows中向前和向後trace你的游標鍵,這也方便你跳轉游標。

讀取Shell命令相關

【:r!date】 插入日期

上面這個命令,:r 是:read的縮寫,!是表明要執行一個shell命令,意思是我要把shell命令的輸出讀到vim裡來。

vim的終級外掛

CentOS下:yum erase emacs

Ubuntu下:apt-get remove emacs

(:wq)

(轉載本站文章請註明作者和出處 酷 殼 – CoolShell.cn ,請勿用於任何商業用途)

——===  ===——