vim實用技術(1)

來源:互聯網
上載者:User
Vim 簡介

作為開源世界最重要的編輯器之一(另一個是Emacs),Vim以其強大的功能和可定製能力被眾多開發人員所喜愛。不過,也許就是因為Vim的功能太 強大了,要真正用好Vim並不容易。本文作者在多年的實際使用中逐漸掌握了一些實用技術,在此介紹給大家。--本文並不企圖對Vim作全面而系統的介紹, 但也絕非零星地點到即止;而是希望通過介紹一些重要特性和提供相關參考資訊,引起大家的興趣,去深入挖掘其能力,真正把這一強大的工具用好。

下面首先對Vim做一下最基本的介紹,並給出一些參考資訊,以方便對Vim不熟悉的讀者也能夠理解並自己查閱進一步資訊。

與大部分其它編輯器不同,進入Vim後,預設狀態下鍵入的字元並不會插入到所編輯的檔案之中。Vim的模式(mode,可以簡單地理解為"狀態")概念非常重要。需要知道,Vim有以下幾個模式:

  • 正常(normal)模式,預設的編輯模式;下面如果不加特殊說明,提到的命令都直接在正常模式下輸入;任何其它模式中都可以通過鍵盤上的Esc鍵回到正常模式。
  • 命令(command)模式,用於執行較長、較複雜的命令;在正常模式下輸入":"(一般命令)、"/"(正向搜尋)或"?"(反向搜尋)即可進入該模式;命令模式下的命令要輸入斷行符號鍵(Enter)才算完成。
  • 插入(insert)模式,輸入文本時使用;在正常模式下鍵入"i"(insert)或"a"(append)即可進入插入模式(也有另外一些命令,如"c",也可以進入插入模式,但這些命令有其它的作用)。
  • 可視(visual)模式,用於選定文字區塊;可以在正常模式下輸入"v"(小寫)來按字元選定,輸入"V"(大寫)來按行選定,或輸入"Ctrl-V"來按方塊選定。
  • 選擇(select)模式,與普通的Windows編輯器較為接近的選擇文字區塊的方式;在以可視模式和選擇模式之一選定文字區塊之後,可以使用"Ctrl-G"切換到另一模式--該模式很少在Linux上使用,本文中就不再介紹了。

Vim帶有完整的協助文檔。在當前的Vim 6.4的標準發布中,有一百多章、近六十萬英文詞的協助檔案,進入Vim後輸入":help"(命令模式中輸入的命令要敲斷行符號鍵才結束輸入,下面不再說明 這一點)即可訪問。本文在介紹特性時,對文檔中已經說明得很詳細的內容只會提綱挈領地加以簡短說明和提供應用範例,並提供訪問相應的Vim文檔的命令。

一般的發布版中還常常帶有一個簡單的30分鐘的Vim教程,新手在作業系統的命令列上輸入"vimtutor" 命令即可開始學習。除上面的簡單說明外,本文並不介紹最基本的Vim命令,Vim的新手應該先通過教程熟悉一下Vim,再繼續往下閱讀。

建議所有的Vim使用者經常訪問Vim的主要站台[1]。上面除了基本的發布、安裝、下載等資訊外,最有用的內容是使用者可以上傳自己寫的Vim指令碼 (script)和撰寫自己認為有用的提示(tip),供其他Vim使用者使用。在寫這一段的時候,Vim網站上已有一千三百多個指令碼,提示數剛好超過了一 千。對於序號為nn的指令碼,直接存取的URL是http://www.vim.org/scripts/script.php?script_id= nn;對於序號為nn的提示,直接存取的URL是http://www.vim.org/tips/tip.php?tip_id=nn

不另加說明的話,本文討論的內容適用於Vim版本6(即從6.0到6.4)。建議認真的Vim使用者升級到Vim 6.4,最好是自己編譯升級所有的補丁包。相關資訊網站上都有,此處不再贅述。

中文支援

Vim支援世界上的主要語言,當然也包括中文。如果你用Vim編輯中文,而中文不能正確顯示,那有兩種可能性:一是使用的Vim不完整,不含多位元組語言支援(multi_byte特性);二是某個配置出了問題。

說到多語言支援,最基本的概念有兩個:一是檔案的語言編碼,而是環境的內部編碼。在較老的作業系統中,不管Linux還是Windows,這兩個編 碼都是一樣的,也就意味著,一次只能處理一種編碼的檔案:要麼只能處理西文編碼(Latin1,即ISO-8859-1 [5]),要麼只能處理中文編碼(GB2312 [2])。而在新的作業系統中,這兩者可以是不一樣的。在Linux上,常見的情況是環境的內部編碼使用UTF-8 [6],而UTF-8可以同任何一種語言編碼作無損轉換,這就保證了系統的多語言處理能力。Vim這方面秉承了Unix/Linux的傳統,在內部編碼使 UTF-8的時候,可以同時處理不同意語言編碼的檔案。

以下列出了和語言編碼的相關的設定:

  • 環境變數LANG(使用的語言);
  • 環境變數LC_CTYPE(使用的內部編碼);
  • Vim選項encoding(Vim的內部編碼);
  • Vim選項termencoding(Vim在與螢幕/鍵盤互動時使用的編碼);
  • Vim選項fileencoding(Vim當前編輯的檔案在儲存時的編碼);
  • Vim選項fileencodings(Vim開啟檔案時的嘗試使用的編碼);
  • Vim選項ambiwidth(對"不明寬度"字元的處理方式;Vim 6.1.455後引入)。

如果你的環境只需要處理簡體中文的話,那麼,最簡單的方式就是所有的設定全部使用簡體中文。只需要:設定LANG=zh_CN.GB2312,不設 定LC_CTYPE(預設跟LANG一樣),不設定與編碼相關的Vim選項(預設由LANG和LC_CTYPE決定),也無需設定Vim選項 ambiwidth。也就是說,我們把語言設定為中國(CN)使用的中文(zh),編碼為GB2312(注意:Vim內部並不識別國標GB18030 [3],所以此處只能設GB2312;參看下面關於UTF-8的討論)。

不過,如果按照目前Linux下的慣例,內部編碼一律使用UTF-8的話,會有一些額外的好處,其中之一就是在這種情況下Vim支援同時編輯多種不 同編碼的檔案,如簡體中文和繁體中文(見);另外,此時Vim也可以通過編碼轉換支援GBK [4]和GB18030了。這樣,眾多關於語言編碼的Vim選項就有了用武之地了。下面進一步說明一下這些選項和推薦設定(如果適用的話):

  • encoding=utf-8:不管檔案的編碼如何,不管如何顯示和輸入,Vim內部使用的編碼是UTF-8;這是國際化支援的基礎。
  • termencoding:取決於實際的終端或X Window的設定。舉例來說,如果選擇語言簡體中文登入到X Window,或者正在使用CXTERM [10]的話,那麼該選項應被設為GB2312;如果使用預設的語言(LANG=en_US.UTF-8)登入到X Window,或者使用PuTTY [11]遠端存取Linux機器、並且設定裡的字元編碼(配置中Window-Translation)設為UTF-8的話,該選項就應該設為utf- 8。從Windows下使用PuTTY遠端連線Linux的請特別注意,測試表明,僅在使用UTF-8的情況下,PuTTY才能可靠地支援中文的顯示和輸 入(顯示字型必須設成中文字型)。
  • fileencoding:檔案載入時,該選項被置為Vim認定的檔案編碼,因此,儲存時檔案的編碼不會改變。此處和下面 fileencodings可使用的編碼為libiconv支援的所有幾百種編碼(如果編譯時間包含了iconv特性的話),與中文相關的有gb2312、 gbk、gb18030、hz-gb-2312、iso-2022-cn、big5、cp936、cp950等。如果建立新檔案,你又不希望使用UTF- 8作為檔案編碼時,那麼,你可能需要手工設定該選項,如":set fileencoding=gb2312"。需要注意的一點是,使用"set"來設定該選項的話會改變以後建立檔案的預設編碼,而使用 "setlocal"的話則隻影響當前檔案(參考":help setlocal")。 fileencodings=ucs-bom,utf-8,chinese:Vim會首先判斷檔案的開頭是否是一個Unicode [7]的BOM(byte order mark)字元[8],是的話則把檔案的其餘內容解釋成相應的Unicode序列;否的話再試圖把檔案內容解釋成UTF-8的序列;再失敗的話,則把檔案 解釋為簡體中文(chinese是一個跨平台的簡體中文字元集的別名,Linux下相當於gb2312和euc-cn;此處也可以根據需要以 gb2312、gbk或gb18030等編碼替代)。需要注意的是,該順序不能顛倒,並且在後面再添加其它編碼如big5、latin1也是沒有意義的, 因為Vim不能識別8位元編碼中的錯誤,因此這些編碼後列的編碼永遠不會被用到。
  • ambiwidth=double:把所有的"不明寬度"字元[9]--指的是在Unicode字元集中某些同時在東西方語言中使 用的字元,如省略符號、破折號、書名號和全形引號,在西方文字中通常字元寬度等同於普通ASCII字元,而在東方文字中通常字元寬度等同於兩倍的普通 ASCII字元,因而其寬度"不明"--的寬度置為雙倍字元寬度(中文字元寬度)。此數值只在encoding設為utf-8或某一Unicode編碼時 才有效。需要額外注意的是,如果你通過終端使用Vim的話,需要令終端也將這些字元顯示為雙寬度。比如,XTERM [12]的情況下應該使用選項"-cjk",即使用命令"uxterm -cjk"來啟動使用雙寬度顯示這些字元的Unicode X終端;使用PuTTY遠端連線的話則應在配置的Window-Translation中選中"Treat CJK ambiguous characters as wide"(參見)。

需要設定的選項通常放在使用者的Vim資源設定檔中,即在~/.vimrc檔案中加入:

set encoding=utf-8
set fileencoding=chinese
set fileencodings=ucs-bom,utf-8,chinese
set ambiwidth=double

如果想進一步瞭解這些選項的話,可以使用":help '選項'"查看協助文檔中的相關(英文)資訊。協助中也可以查到這些選項(以及命令)的縮寫:本文中為方便理解,除一些極少有人使用完整拼字的命令如": e(dit)"、":s(ubstitute)"等之外,一般使用完整拼字而不說明或使用縮寫。關於設定檔.vimrc,可以使用":help .vimrc"查看相關資訊。

在使用內部編碼UTF-8的情況下,如需編輯fileencodings之外(其不能自動識別)的檔案,則可以使用以下命令:":e ++enc=編碼 檔案名稱"。詳情可參考":help ++enc"。

滑鼠支援

不管是文本介面還是圖形介面的Vim,都支援滑鼠。不過,在文本介面中,滑鼠支援預設沒有被啟用;這就意味著,在終端上使用滑鼠,所有的功能仍和沒 有使用Vim時相同,並不受Vim影響。要啟用文本介面中的滑鼠支援也很容易,只需要執行一句 ":set mouse=a"即可。

啟用了滑鼠支援之後,Vim主要支援的滑鼠操作有:

  • 單擊移動游標到點擊的位置;
  • 在協助的關鍵字上雙擊顯示該關鍵字相關的協助資訊;
  • 在普通文本上雙擊選中點擊位置的單詞;
  • 拖動滑鼠選中文本;
  • 使用滑鼠滾輪滾動當前緩衝區中的文本;
  • 多視窗編輯時可以拖動視窗分欄的位置。

進一步的資訊可參看":help 'mouse'"、":help mouse-using"和":help scroll-mouse-wheel"。

特別需要值得一提的是,在遠端存取Linux系統時也是可以使用滑鼠的。如果使用X Window系統,自然不必說;而使用SSH遠端連線時,大部分Linux下的終端客戶程式,如XTERM、GNOME-Terminal [13]、較新版本的Konsole [14],以及Windows下的PuTTY,支援滑鼠的使用:你只需簡單地啟動Vim、執行一句":set mouse=a"就可以了(當然,也可以把上面的語句去掉起始的冒號放到.vimrc檔案中)。

空格、定位字元和縮排

對於編寫代碼,縮排是最基本的概念之一。至於縮排是使用空格還是定位字元(Tab),或者縮排是否正好使用一個定位字元來表示,很多程式員,特別是 Windows開發出身的程式員,很容易混淆。幸好,Vim對於這些概念有非常完整的支援,足以應付各種複雜的情況。以下是相關的主要Vim選項:

  • shiftwidth(縮排的空格數);
  • tabstop(定位字元的寬度);
  • expandtab(是否在縮排和遇到Tab鍵時使用空格替代;使用noexpandtab取消設定);
  • softtabstop(軟定位字元寬度,設定為非零數值後使用Tab鍵和Backspace時游標移動的格數等於該數值,但實際插入的字元仍受tabstop和expandtab控制);
  • autoindent(自動縮排,即每行的縮排值與上一行相等;使用noautoindent取消設定);
  • cindent(使用C語言的縮排方式,根據特殊字元如"{"、"}"、":"和語句是否結束等資訊自動調整縮排;在編輯C/C++等類型檔案時會自動設定;使用nocindent取消設定);
  • cinoptions(C語言縮排的具體方式,請參考":help cinoptions-values");
  • paste(粘貼模式,會取消所有上述選項的影響來保證後面的操作--通常是從剪貼簿粘貼代碼--保持原有代碼的風格;使用nopaste取消設定)。

下面給出一些常用的組合:

  • shiftwidth=4 tabstop=4:很多Windows出身的程式員會習慣這樣的設定,讓縮排等於定位字元寬度。
  • shiftwidth=4 tabstop=8:很多Unix程式員的設定,仍使用較常用的4格縮排,但定位字元寬度為標準的8。
  • cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:標準的GNU編碼風格的設定,對Vim預設的C縮排風格作了很多微調,比如,if語句下的"{"、"}"要在"if"後縮排兩格,但 函數定義部分"{"、"}"仍和函數名一行對齊。開源軟體經常使用該種縮排風格。

在編輯代碼時一個很有用的命令是調整代碼縮排,可以很方便地增加(或減少)若干級縮排,並自動根據選項設定使用正確的空格或定位字元。只需要使用 "V"選中你要調整的程式碼,然後鍵入"<"(或">")即可增加(或減少)一級縮排;在鍵入"<"(或">")之前鍵入數字則 可以指定增加(或減少)的縮排級數。

我們要討論的最後一個相關的命令是":retab"。在設定了expandtab選項時,該選項會把所有的定位字元轉換成空格。在沒有設定 expandtab選項時,使用":retab!"可把空白字元轉換成定位字元(可能誤轉換,慎用),使用":retab n"可以把tabstop重設為n,並轉換含定位字元的連續空白字元為適當的定位字元和空格的組合以保證含定位字元的行看起來沒有任何變化。詳細資料請參看": help :retab"。

模式行(modeline)

沒人願意每次都手工輸入一大堆的Tab和縮排設定。可是,放在.vimrc檔案中似乎也不是個好主意:如果我編輯的代碼不止一種風格呢?--考慮一 下,如果你參加開源軟體項目,你能保證你參加的所有項目,還有你公司裡的軟體項目,代碼風格都一樣嗎?--Vim是我用過的第一個支援在檔案中記錄代碼風 格設定的編輯器。這個特性在Vim中叫做模式行,實際上,它所做的是在開啟檔案時根據檔案中的Vim指令設定相關的Vim選項。下面就是一個嵌在C原始碼 中的模式行:

/* vim: set tabstop=4 shiftwidth=4 expandtab: */

模式行有好幾種形式。本文只介紹上面的這種形式(其它形式類似,請自行參考":help modeline"):行首的"/*"和尾部的"*/"告訴C編譯器這是一行注釋,不是代碼的一部分;而Vim可通過後面的"vim:"識別出模式行的開 始(必須出現在行首或前面有一個空白字元);後面則是"set"和空格間隔開的一串Vim選項;":"表示模式行結束。

這種方式非常簡單,功能也非常強大。另外請注意,出於安全的考慮,模式行中的選項隻影響當前檔案(":help modeline-local"),也不能做任何設定選項以外的工作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.