google linux java wordpress Firefox shell apache centos Ubuntu php Android 编程 云计算 Python mysql nginx 程序员 Windows 开源 微软

無插件Vim編程技巧

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

        瀏覽代碼

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

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

:E

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

无插件Vim编程技巧

        这个界面中,你可以用 j, k 键上下移动,然后回车,进入一个目录,或是找开一个文件。你可以看到上面有一堆命令:

  • 【 – 】 到上級目錄
    【D】刪除文件(大寫)
    【R】改文件名(大寫)
    【s】對文件排序(小寫)
    【x】執行文件
            當然,打開的文件會把現有已打開的文件給沖掉——也就是說你只看到了一個文件。

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

    :cd

    – 改變當前目錄


    :pwd  - 查看當前目錄

            緩沖區

            其實,你用:E 瀏覽打開的文件都沒有被關閉,這些文件都在緩沖區中。你可以用下面的命令來查看緩沖區:

    :ls

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

无插件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编程技巧

       

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

        分屏同步移動

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

:set scb

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

:set scb!

        註:set scb 是 set scrollbind 的簡寫。

        Tab 頁瀏覽目錄

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

:Te  全稱是 :Texplorer

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

无插件Vim编程技巧

       

 我們要在多個 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

        保存會話

        如果你用 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

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

无插件Vim编程技巧

       

 上圖中左邊是我的 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 的輸出取回來,於是我們就有下面的樣子:

无插件Vim编程技巧

    

    然後同上面一樣,你可以用 j,k 鍵移動 quickfix 裏的光標到相應的行,然後按回車定位文件,或是使用【:cn】或【:cp】來移動到定位。(這樣,你會把多個文件打開到緩沖區,別忘了【:ls】來查看緩沖區)

        你看,到這裏,一個小小的 IDE 就這樣產生了,而且,最帥的時,我們連一點插件都沒有裝,也沒有在 .vimrc 文件中配置過什麽。

        關鍵字補全

        我們還是堅持不用任何插件。我們來看看是怎麽個自動補全的。

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

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

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

无插件Vim编程技巧

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

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

无插件Vim编程技巧

 

       與此類似的,還有更多的補齊,都在 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

        對了,以前本站也有一篇小短文《如何在 vim 中得到你最喜愛的 IDE 特性》你也可以看看。

延伸阅读

评论