Vim入門教程

巽離發表於2015-04-21

儘管網上有成打的Vim線上教程,但是要麼艱深晦澀,要麼太過膚淺。本教程的目標讓每個階段都有斬獲,從理解它的哲學(將和你終身相伴)到超越現在編輯技巧,成為其中的牛人。

簡單來說,本教程的學習方式將使你終身受益。

為什麼選擇vim

我相信大多數人可能由於以下三點原因而使用vim:

1、vim無所不在。學習vim你無需擔心到了其他平臺需要學習新編輯器。

2、可擴充套件性。你可以只用它來編輯配置檔案,也可以將它當做你的開發平臺。

3、功能強大。它的工作方式與自然語言類似。即使一開始你對vim一無所知,經過一段時間的使用學習,很快也會成為牛人。

一句話,我相信一旦你開始學習,你會覺得就像掌握母語還有基礎數學這些基本技能一樣,也能自然而然地掌握vim。好了,在瞭解這些知識之後,讓我們正式開始vim技術的學習吧。

Approach

Kana大神說過,對vim的掌握有五個層次:

  • 層次0: 對vim一無所知
  • 層次1: 瞭解vim的基本使用
  • 層次2: 知道可視模式
  • 層次3: 知道多種移動動作
  • 層次4: 不再需要可視模式

對此我並不瞭解,不過我認為這種觀點值得我們注意。畢竟,kana是vim大神。在本教程中,我將通過下面四個主要模組來向你展示vim。

  1. 基礎介紹:這部分基礎介紹能快速建立起你對vim的正確認知。
  2. 具體操作: 這塊是乾貨。做好準備來享用吧。
  3. 進階: 這部分我會教你怎樣成為vim牛人。
  4. 常見問題: 這裡會講述一些常見問題解決技巧。

換句話說,如果你已經對vim有所瞭解的話,建議你從具體操作這部分開始。如果你熟練掌握這部分的話,就直接進入進階開始學功夫。假如你看這篇教程是為了某個具體問題,那麼請進入常見問題章節。

所以呢,建立vim世界觀,vim基本操作,高手進階以及常見問題——這幾部分任君挑選。

配置

我曾說過,不希望這是一本超級vim配置手冊,網上已經有很多這類教程了。本教程的目的在於強化你對vim的理解,幫助你熟練掌握這個工具。不過我們也會稍微介紹一些基本的配置。

首先,我建議你安裝(幾乎)自我管理的vim。我就曾試過Janus(vim的發行版),但是我無法確定它究竟在做什麼,這讓我感到很挫敗。我偏好的配置就像vim自身一樣,簡單而優雅。

為了達到這個目的,我直接將使用者主目錄下的.vim目錄和.vimrc作為配置檔案。

A few key ~/.vimrc changes

./vimrc修改常用鍵

首先呢,我覺得使用<Esc>鍵來退出插入模式實在是太老土了。Vim關注的是效率,如果不是特殊情況,手指儘量不要離開鍵盤中間排。而這種ESC操作實在是沒效率,所以不要用這個。

inoremap jk <ESC>

【注意: 有些人喜歡將<ESC>對映為jj,但是我覺得對映為jk可能更自然一點】

修改leader鍵

反斜槓也同樣存在這種問題,所以就像其它指導文件推薦的那樣,我也喜歡將引導鍵重對映為逗號(,)。

let mapleader = “,”

通過這樣的配置,可以簡化我們接下來的命令執行,比如執行對映的縮寫命令時,只需右手中指往下一格就可以輕鬆輸入逗號,而不需要向上再向右去遠遠地按反斜槓鍵。

重對映CAPSLOCK

大寫鍵不在vim的配置檔案中,不過這個鍵的位置比較好,而它的預設功能我們又常常用不上。對我來說,CAPSLOCK鍵沒啥用處,所以我將它對映為Ctrl鍵(從作業系統層面來設定)。這樣如果我要執行Ctrl-XX操作時只需將左小指左移就可以了。

此外,推薦其他幾項基礎設定,這樣使用更加方便。

filetype plugin indent on

syntax on

set encoding=utf-8

要知道,優化vimrc檔案是一個非常值得花時間去研究的問題,這裡說的幾個建議僅僅是皮毛。推薦檢視我的設定或者閱讀這幾篇引用文章

使用Pathogen管理外掛

【請注意:如果你不熟悉或者並不喜歡外掛,可以跳過這一節。等你下次想通了再來看看。】

遠離Janus

對我來說,Janus最能吸引我的地方在於它的外掛管理,不過我可以通過Pathogen來實現。基本上,通過以下幾步就可以了:

  1. 安裝Pathogen
  2. 將你需要的外掛git clone 克隆到~/.vim/bundle
  3. 在配置檔案~/.vimrc中新增execute pathogen#infect()

利用github來實現備份和可移植性

為了備份vim設定,我將整個~/.vim目錄通過git庫儲存在這裡。這樣即便我新裝了系統,也可以很方便的使用git clone https://github.com/danielmiessler/vim獲取我的偏好設定。

也許你也會喜歡這樣做。

簡單一步clone之後,將~/.vimrc軟連線到~/.vim/vimrc就可以了。

Vim即語言

Vim最成功的閃光點莫過於一旦你開始使用它,它就會讓你欲罷不能。Vim就像語言一樣,擁有名詞、動詞、副詞等屬性。

雖然我的這種說法從技術層面可能並不準確,但是卻能幫助你更好地理解vim的工作機制。重申一次,本教程的目的不是為了取代其他教程或幫助手冊——而是為了幫助你理解其他這些文件晦澀難懂的部分。

動詞

所謂動詞指的是我們執行的動作,這些動作可以施加在名詞之上。可以看看下面幾個常見的動作:

  • d: 刪除
  • c: 修改
  • y: 拖拉(拷貝)
  • v: 視覺化選擇 (V for line vs. character)

修飾語

定語用在名詞之前,表明以哪種方式來執行動作。幾個例子:

  • i: 內部
  • a: 周圍
  • NUM: 數字 (e.g.: 1, 2, 10)
  • t: 查詢到指定字元,並跳轉到這個字元的前面
  • f: 查詢到指定字元,並跳轉到字元所處的位置
  • /: 查詢字串 (literal or regex)

名詞

在英語中,名詞用來表示你所操作的物件。它們都是客體。在vim中也是這樣。下面列出vim中的名詞:

  • w: 單詞
  • s: 句子
  • ): 句子 (另一種操作方式)
  • p: 段落
  • }: 段落 (另一種操作方式)
  • t: 標籤 ( HTML/XML)
  • b: 塊 (程式語言)

Nouns as motion

同樣,你也可以將名詞視為移動動作,這意味著你可以用名詞表示在文字的跳轉範圍。我們可以在“移動”章節中看到例子說明。

使用vim語言來組成語句(命令)

好了,現在我們有句子的不同組成部分,該怎樣將這幾部分組成完整的句子呢?就像英語一樣,憑感覺將動詞、修飾語和名片語合起來。

對於下面這些符號,根據顏色的不同來區分句子的不同組成部分:

刪除兩個單詞

d2w

修改所在的句子(刪除當前句子並進入插入模式)

cis

拷貝當前所在的段落

yip

修改當前游標所在位置到下一個括號之間的文字內容

ct<

記住,這裡的“目標”是尖括號,除此之外還可以是任意字元。從語法上來說,使用單個字母”t”來表示這個向前查詢的“目標”,這樣我就可以使用“dt.”表示刪除當前位置到下一個句號之間的內容,”yt;”表示拷貝當前位置到下一個分號之間的內容。

看起來多漂亮!當編輯文字時採用這樣的思維方式可以使得操作更加優雅,符合我們的直覺思維,而且就像其他語言一樣,熟能生巧。

具體操作

現在,在瞭解這些基本操作後,讓我們結合具體操作來更進一步學習。

處理檔案

一些對檔案的基本操作。

  • Vi file :使用vim開啟要編輯的檔案
  • :w :儲存修改
  • :q! : 退出vim,後面加感嘆號表示不儲存修改強制退出
  • :wq: 儲存修改並退出
  • :saveas ~/some/path/: 將檔案儲存到其他位置

【注意:相比較:wq 我更喜歡使用ZZ,因為我覺得不需要輸入冒號我覺得會快一點。也可以使用:x】

  • ZZ: 同:wq

查詢文字

對於任意一款編輯器,查詢文字都是最基本需求。Vim擁有很強大的文字搜尋功能,這一節將著重討論vim的文字搜尋。

搜尋字串

Vim中最基本也是最強大的搜尋方式是”/”命令,在視窗最底端輸入你需要查詢的字串並回車就可以了。

查詢include字串

/include<CR>

查詢結果如下所示,所以匹配結果都被高亮顯示:

搜尋完成後,輸入”n”依次向下查詢,或者”N”向上查詢。如果想要逆向查詢字串也可以使用”?”來代替”/”.

跳轉到指定字元

Vim有一招特別酷,不管你在哪兒,都能查詢特定字元並直接跳轉過去。比如說,我正在編輯HTML檔案,

向前查詢並直接跳轉到<字元

f<

向前查詢並跳轉到<的前一個字元

t<

你可以這麼理解,第一種找出目標(f),直接定位到查詢物件;第二種到達目標(t),向著目標物件前進,定位到目標的前面。

比較怪異的一點是,可以將它們作為命令中的名詞。就比如剛才我在編輯這句時:

修改到下一個”<”之間的內容

ct<

對任意字元都可以這麼做,比如說,句號,尖括號,圓括號,普通字母等等。這樣你就可以查詢文字並跳轉,或者你知道具體位置並直接跳轉。

【注意:當你搜尋指定字元時,可以使用分號跳轉到下一處——不管是t搜尋還是f搜尋。逗號可以用來反向跳轉到上一處。】

搜尋總結

  • /{string}: 搜尋字串
  • t : 跳轉到某一字元前
  • F : 跳轉到某一字元處
  • *:搜尋當前游標位置單詞的其他例項
  • n : 搜尋完成後,跳轉到下一個匹配例項
  • N :搜尋完成後,跳轉到上一條匹配例項
  • ; : 跳轉到指定字元時,使用分號跳轉到下一例項
  • , :跳轉到指定字元時,使用逗號跳轉到上一例項

遊走於文字中

提高編輯效率至關重要的一點是:在文字內的自由移動跳轉。對vim來說,充分利用我們上文所說的vim語言的基本準則,就可以既簡單又優雅地做到。首先,介紹基礎概念。

基本移動動作

我們從鍵盤中間排開始介紹。受過訓練的打字員一般都習慣將右手指放在jkl;這幾個鍵上,就讓我們從這裡開始使用vim。

  • j : 向下移動一行
  • k :向上移動一行
  • h :向左移動一個字元
  • l :向右移動一個字元

剛開始可能使用得不太習慣,不過只需幾分鐘的練習之後,就會習慣成自然,你甚至會想要在word文件裡面也這樣用(順便說一下,word文件不支援)。

總結起來就是:右手食指和中指用來上移下移,右手食指和無名指用來左移右移。

行內移動

你可以在當前行內自由的移動。

  • 0: 移動到行首
  • $: 移動到行末
  • ^: 移動到行首非空字元
  • t”: 跳轉到下一個引號前
  • f”: 跳轉到下一個引號處

【注意: 逗號和分號會重複之前的t和f跳轉】

按單詞移動

除了按行和字元移動外,還可以按單詞移動:

  • w: 先前移動一個單詞
  • b: 向後移動一個單詞
  • e: 移動到當前單詞末尾

當使用大寫字母時,vim會忽略掉單詞間的分隔符,這樣原本被分隔符隔開的多個單詞會因此被視為一個大單詞。

  • W: 向前移動一個大單詞
  • B: 向後移動一個大單詞

這種大寫命令的優勢在我們實際工作中會頻繁地碰到。

按句子或段落移動

  • ):向前移動一條句子
  • }: 向前移動一個段落

在螢幕間移動

  • H:向上移動一屏
  • M:移動到螢幕中間
  • L:移動到螢幕底端
  • gg: 移動到檔案頂端
  • G:移動到檔案結尾
  • ^U: 向上移動半屏
  • ^D: 向下移動半屏
  • ^F: 下一頁
  • ^B: 上一頁

來回跳轉

在普通模式下,可以在兩點間來回跳轉,這在實際操作中非常有用。

  • Ctrl-i: 跳轉到之前所在的位置
  • Ctrl-o: 跳回你實際的位置

其他動作

  • :$line_numberH: 移動到指定行號
  • M: 移動到螢幕中間
  • L: 移動到螢幕底端
  • ^E: 向上滾動一行
  • ^Y: 向下滾動一行
  • ^U: 向上移動半屏
  • ^D: 向下移動半屏
  • ^F: 向下移動一頁
  • ^B: 向上移動一頁

現在將所以移動動作總結到一起:

移動命令總結

  • j: move down one line
  • k: move up one line
  • h: move left one character
  • l: move right one character
  • 0: move to the beginning of the line
  • $: move to the end of the line
  • w: move forward one word
  • b: move back one word
  • e: move to the end of your word
  • ): move forward one sentence
  • }: move forward one paragraph
  • :line_number: move to a given line number
  • H: move to the top of the screen
  • M: move to the middle of the screen
  • L: move to the bottom of the screen
  • ^E: scroll up one line
  • ^Y: scroll down one line
  • gg: go to the top of the file
  • G: go to the bottom of the file
  • ^U: move up half a page
  • ^D: move down half a page
  • ^F: move down a page
  • ^B: move up a page
  • Ctrl-i: jump to your previous navigation location
  • Ctrl-o: jump back to where you were

【注意:前面說過我將CAPSLOCK鍵對映到Ctrl,所有這些基於Ctrl的命令,我都可以用CASLOCK來代替】

修改文字

好了,瞭解一堆在文字中移動的命令後,我們可以開始學習對文字的修改了。需要記住這一點:這些移動命令會一直陪伴著我們——它們是vim語言的一部分(它們是上文提到的修飾語)。

Understanding modes

首先我們要弄清楚模式的概念。剛開始說到模式可能有點違反我們的直覺,不過一旦習慣之後就會使用得非常的自然。很多vim指南都從介紹模式開始,不過我發現如果直接從模式開始有點不好理解,從普通模式與插入模式之間的切換入手會好一點。

  • 從普通模式開始。對新手來說vim最讓人鬱悶一點莫過於開啟文件卻不能直接編輯。其實,你也可以輸入一些個東西,不過如果你真這麼做的話你的文件可能會變得一團糟。
  • 普通模式也叫命令列模式,因為通常在這個模式下輸入vim命令。這些命令可以是移動、刪除或者其他操作,之後進入插入模式。
  • 插入模式下可以直接對檔案進行修改,有很多種方式可以從普通模式切換到插入模式。不過不用擔心,雖然方式多樣,只要多加練習就可以熟練使用了。
  • 視覺化模式下可以選擇文字。這個模式看起來與普通模式非常像,不過這個模式下移動操作會改變高亮選擇的區域。你可以逐行選擇也可以逐字元選擇,不管哪種選擇模式下,移動操作都會高亮選擇更多的文字內容。
  • 選中之後,視覺化模式的優勢就體現出來了,我們可以對選中的全部文字做操作,大大提高了效率。
  • Ex模式下,游標處於螢幕最下方,冒號後可以輸入命令。具體內容在後面做介紹。現在只需要知道在這種模式下可以執行一些命令列任務就可以了。

除了上面介紹的模式外vim還有一些其他的模式,不過本教程不做介紹因為它們不是首要任務。

記住vim語言

現在讓我們一起回憶vim語言: 動詞、修飾符、名詞。假設我們從普通模式開始,現在想要切換到插入模式下修改文字。

動詞可以實現這種切換,並且有好幾種選擇。我們可以修改(c),插入(i),或者追加(a),還有其他變種。

基礎修改/插入命令

讓我們從這幾個可選命令開始。

  • i : 從當前游標位置之前插入
  • a : 從當前游標位置之後插入
  • I :從當前行開始位置插入
  • A :從當前行行末插入
  • o : 在當前行下新增一行,並從新行插入
  • O :在當前行上新增一行,並從新行插入
  • r : 替換當前游標所在字元
  • R :替換當前游標的字元,並一直向後替換(替換模式)
  • cm:修改文字,其中m表示移動的動作,比如,一個單詞,一句或者一個段落。
  • C :修改當前所在行
  • ct?: 修改問號前的這條問句內容
  • s:替換當前字元
  • S: 替換整行

修改句子

cis

移動到行首並進入插入模式

I

在當前游標位置之後進入插入模式

a

從上面例子可知,有多種方式可以進入插入模式輸入文字。還有一些簡寫來執行多條操作,比如說刪除並進入刪除模式。

刪除從游標所在位置開始到行末的所有內容,並進入插入模式

C

刪除當前行並進入插入模式

S

修改大小寫

可以通過波浪符來變更大小寫。就像你猜想的那種方式工作:不管你游標所在字元還是可視模式下選擇的文字都可以。

格式化文字

Vim還可以快速格式化文字,比如格式化一整段文字,使用下面這個命令就可以很容易實現:

格式化當前段落

gq ap

gp根據預設的文字寬度testwidth以及引數指定的文字範圍來工作,這意味著對於你指定的任意範圍的文字,gp都可以自動校準寬度,使得文件看起來乾淨又整潔。

【注意: ap表示文字物件”整個段落”的覆蓋範圍】

刪除文字

在瞭解怎樣修改文字後,接下來看看怎樣直接刪除文字。可能你已經知道了,跟前面差不多——只不過實現的動作不同罷了。

基本刪除命令

  • x: 刪除當前游標的字元
  • X:刪除當前游標的前一個字元
  • dm: 根據定義的m來確定刪除範圍,一個單詞或者一句話或者一個段落。
  • dd: 刪除當前行
  • dt. : 刪除當前位置到下一個句號之間的所有內容
  • D: 刪除當前游標位置到本行末的所有內容(對比上面的C,D不會進入插入模式)
  • J: 將上下兩行合併(刪除兩行之間的換行符)

足夠簡單吧?

撤銷與重做

如果一個編輯器連撤銷和重做的功能都沒有,你肯定不會用它。vim就像我們前面注意到的那樣,盡其所能讓我們更順手地操作,撤銷與重做也不例外。

  • u: 撤銷上一個動作
  • Ctrl-r: 重做上一個動作

【注意:記得將CAPSLOCK鍵對映為Ctrl,這樣你才能更方便快速的使用組合鍵。】

這兩個動作都可以重複操作,你可以一直撤銷啊撤銷回到最初儲存點,也可以一直重做啊重做到撤銷前的狀態。

重複動作

Vim所有命令中最強大的那個莫過於點命令,聽起來有點奇怪是不是?解釋一下,通過“.”這個小點可以讓你做一些很棒的事情——重複之前你的任何一個操作。

使用“.”來重複上一次操作

你所做的許多操作可能都有重複的價值。比如進入插入模式新增一些文字內容。你只需執行一次,然後一直執行點命令來重複就可以了。請看下面的例子。

刪除一個單詞

dw

緊接著執行,再刪除5個單詞

5.

多麼給力! 如果結合視覺化模式,發揮的能力更讓你大開眼界。

複製與貼上

快速拷貝與貼上文字同樣也是文字編輯器的必備功能,vim當然也是這方面的高手。

【注意:除了點命令外,&也是一種強大的重複命令,用於重複ex模式下的上一條命令(還記得ex模式嗎?)】

拷貝文字

Vim的拷貝與大家預期的方式可能略有不同。拷貝命令不是大家料想的c。不知你還記不記得,上文提到c表示“修改”,已經被佔用了。Vim用拉取來表示拷貝,簡寫為y。

  • y: 拷貝選中內容
  • yy: 拷貝當前行

記住,這種拷貝動作與你熟悉的那種拷貝並無不同——你只是在目的處複製了一份而已。

剪下文字

剪下很簡單:跟刪除操作差不多。所以呢,剪下實質上就是將刪除的內容挪到緩衝區,然後將這段刪除的內容再貼上就可以了。

貼上文字

貼上跟我們想的一樣——使用p命令。所以呢,如果你執行dd命令刪除了一行,你可以用p貼上回去。

有一點要記住:貼上的起始位置從你當前游標位置之後開始,根據你拷貝的內容,你要麼貼上字元或單詞,要麼貼上行或列。如果想撤銷貼上,使用通用撤銷命令“u”就可以了。

拷貝複製命令總結

  • 從當前行拷貝到下一個命令(名詞)
  • 拷貝當前行的快捷鍵
  • 在當前游標所在行下一行黏貼拷貝或者刪除的內容
  • 在當前游標所在行前一行黏貼拷貝或者刪除的內容

交換兩行的位置

ddp

使用這條命令可以很快速的交換兩行的位置。第一部分刪除你所在的行,第二部分將它貼上回之前所在位置的下面。(ps:文章中用的是above,但是實際上拷貝回下方位置)

拼寫檢查

如果沒有拼寫檢查的話,感覺會很糟糕,還好vim這方面做得很好。當然我們需要先在配置檔案中配置拼寫檢查選項。

在~/.vimrc的某個位置中新增

找出拼寫錯誤

如果在配置檔案中設定了拼寫檢查的選項,那麼拼錯的單詞會自動新增下劃線。你也可以手動輸入:set spell和:set nospell來啟用或禁用。

不管怎麼說,一旦開啟了拼寫檢查,如果存在拼寫錯誤的話,你就可以使用以下命令來跳轉:

跳轉到下一處拼寫錯誤

]s

跳轉到上一處拼寫錯誤

[s

若游標處是錯誤單詞,給出修改建議

z=

將識別的錯誤單詞標記正確

zg

將vim視為正確的單詞標記為錯誤單詞

zw

我習慣在~/.vimrc中新增一些拼寫相關的簡寫命令。首先就是讓修正拼寫錯誤的命令變得簡單:

將拼寫修正標記為<leader>f

在某些情況下,比如說我需要創造性的拼寫一些單詞時,我會使用下面的命令來取消拼寫檢查。想要重新開啟拼寫檢查只要再執行一次這個命令就可以了。

Toggle spelling visuals with <leader>s

nnoremap <leader>s :set spell!

替換

Vim的另一個強大的功能是替換。命令分為三部分,首先指定將要被替換的字串,之後是替換的新字串,最後指定替換範圍。

基本設定為:%s

將每行的foo替換為bar

:%s /foo/bar/g

將當前行中的foo替換為bar

:s /foo/bar/g

【注意: 兩個命令的不同之處在於,單行替換s前少了%】

還有許多其他的選項,不過這些是最基本的。

PS: 前面&命令重複此類操作(:進入ex模式後執行的命令)

進階

太棒了。我們已經討論了大部分文字編輯器的基本功能,以及在vim中如何使用這些功能。現在可以進行高階vim的任務了——請注意,我說的高階進階是對初學者而言,不是Kana這樣的大神級人物。

重複操作

在稍早之前我們討論了“.”點命令的重複功能。有些命令適合使用點命令來重複,有些則不適合,區分這兩種命令很重要。

通常,如果你想要使用“.”(或者如Drew Neil稱之為點命令)實現命令重複,說明你想用點命令快取的命令來做比較細緻的操作。

比如說你要向若干行行末新增一些內容,但是新增的前提是被新增的行包含指定的字串。你可以使用如下方式來實現:

搜尋字串

/delinquent

現在,只要你按下“n”鍵都會跳轉到下一個搜尋到的例項。那麼,從第一個匹配例項開始,我們給它追加文字。

在行末新增文字

A[DO NOT PAY] [Esc]

好,這條命令執行完成了。不過接下來還有12個地方需要你來做。點命令允許我們簡單地重複執行上一條命令,而且我們還需要儲存搜尋結果,可以將這兩條命令結合起來。

跳轉到下一個匹配例項並向行末新增文字

n.

注意,這種方式將動作與快取的命令結合起來,所以我們能按照預期地那樣跳轉並執行命令。

文字物件

文字物件很特殊。這些文字物件的存在使得你可以操作(動詞)更加複雜的物件(名詞)。比起選中某個單詞並刪除、跳轉到句首並刪除句子等簡單操作來說,不管你在何種文字物件的區域內,你都可以對它們執行這些操作。

說是說不清,實踐出真知嘛,我們可以看幾個例子。

單詞文字物件

首先來看基於單詞的物件

  • iw : 單詞內
  • aw :單詞周圍

這些都是目標(名詞),所以我們可以對它們做一些操作,比如說刪除、修改等等。

刪除單詞(包括單詞周圍的空格)

daw

【注意: 物件內部與物件周圍這兩者之間的區別在於單詞旁邊是否有空格】

句子文字物件

  • is: 句子內部
  • as: 句子周圍

句子物件的工作原理與單詞物件是一致的,想象一下,你敲了一大段句子,敲了一半後悔了想要刪掉。你就可以簡單的使用下面這條命令,而不用回到句子開頭來申明刪除整行。

修改整條句子

cis

這條命令殺傷力還是挺大的,它會刪除整條句子並進入插入模式等待你輸入新的內容。

更多物件型別

還有許多其他的物件型別,我只簡單的來介紹一下。

  • 段落 : ip 和ap
  • 單引號 : i’和a’
  • 雙引號: i”和 a”

當我編輯程式碼或者HTML檔案時,時常會用到這些命令。關鍵是如果這些物件文字存在問題,你甚至並不需要處於這些物件內部就可以操作它們;如果游標當前位置在雙引號外面(經測試,跟雙引號處於同一行並在雙引號前面),只需要輸入ci”就可以刪除雙引號內部的所有內容,並將你挪到雙引號中間進入插入模式等待你的輸入。簡直不要太酷。

對其他型別的某些物件同樣適用,比如說各種括號(圓括號、尖括號、大括號)和標籤(html)。

比如說編輯HTML連結時,URL地址一般在雙引號之間,連結文字在標籤中定義;通過vim這兩條命令可以很方便地修改:ci”(修改URL)和cit(修改連結文字)。

文字物件總結

下面列出常見的文字物件:

  • 單詞: iw 和 aw
  • 句子: is 和 as
  • 段落: ip 和 ap
  • 單引號: i’ 和 a’
  • 雙引號: i” 和 a”
  • 反勾號 : i· 和 a
  • 圓括號: i( 和 a(
  • 方括號: i[ 和a[
  • 大括號: i{ 和a{
  • 標籤: it 和at

總的來說,我使用最多的是單詞,雙引號和標籤。

進入視覺化模式

Vim的有許多迷人之處吸引著我們,不過它們相比較視覺化模式的技能來說,還是太弱了。

也許視覺化模式的最強大之處在於:我們前面學到的所有的一切命令,通過結合視覺化模式使用,能力都會大有提升。這是由於在視覺化模式下選中的高亮文字,可以全部作為命令的操作物件。

首先,學會進入視覺化模式並選擇文字。通過“v”進入視覺化模式,有三種選擇。

  • 基於字元選中: v
  • 基於行選中: V
  • 段落選中: Ctrl-v

在容器內部選中文字

有時候你會處於一段文字中,兩頭被,.({[之類的符號所包圍。你可以使用下面的命令來選中這部分的內容:

選中圓括號中的內容

vi(

選中中括號之間的內容

vi[

你還可以加數字限定選擇的層數(比如說你處於巢狀層)

選中兩層大括號之間的所有內容

v2i{

【注意: 你也可以使用va來代替vi。請不要被這些迷惑。它們與我們所知的名詞和動詞沒有什麼不同】

基於字元的視覺化選擇

從基於字元的視覺化開始介紹(從普通模式輸入v進入視覺化模式),在這種模式下你可以選中單個字元、多個字元、單詞等等。相比較行選擇模式來說,我比較少使用這種模式,不過只是相對而言,其實用的也還是挺多的。

這裡最主要的是要理解這一點: 處於視覺化模式中,你的移動動作會修改被高亮選擇的文字。這就意味著,w或)之類的動作也會起作用,它們可以擴充套件當前高亮選擇的範圍。之後,這部分高亮文字就可以作為命令執行的目標。

基於行選擇的視覺化模式

普通模式下輸入V進入這種模式,之後我們會討論在這種模式下的操作。

基於列選擇的視覺化模式

視覺化模式中還可以垂直地選擇文字,這對操作列資料來說很給力。

視覺化模式下對選中文字的執行動作

對這些文字做什麼操作都是你的自由,不過最普遍的操作是刪除、拷貝和貼上。想一下你平常用滑鼠選中一片文字會做什麼操作?

進入視覺化模式,選中兩個以上單詞並拷貝

vwwy

拷貝之後你可以在任何你希望的地方輸入p來貼上。

或者你可以做一些基於行的操作。

進入行選擇模式,刪除幾行文字

Vjjd

你也可以使用文字物件,不過這種操作不太安全,最好別做。

視覺化模式下選中一整個段落

vip

視覺化模式下選中一整段文字並貼上到當前段落之下。

vipyjjp

不要因為命令很長而感到崩潰。要記住,這些命令跟我們平常說話是一樣的。你可以沒有任何困難地、很隨意地念叨:

我想去商店。

這條命令也是一樣的:

拷貝這一段,下移兩行,再貼上。

將視覺化模式與重複結合

視覺化模式還有一個很神奇的地方,對於選中的文字,你可以通過點命令來執行之前快取的命令。請看下面這個例子:

如果想在每行前面都加個冒號,可以現在第一行foo之前新增,然後視覺化模式下選擇之下所有行,執行點命令就可以了。

【注意:要想使用這個功能,必須要在配置檔案中新增對映 vnoremap . :norm.<CR>】

BAM!

覺得這功能沒有那麼酷炫? 那就想象一下: 你有個六萬行的檔案,每行都與例子一樣,需要追加個冒號。你會怎麼做?

對整個檔案新增分號

0i:j0vG.

wut

大大簡化了我們的操作,大殺器一枚。步驟如下:

  1. 走到第一行行首並插入一個冒號(0i:)
  2. 走到下一行定位到行首位置(j0,注意之前是插入模式,需要先回到普通模式)
  3. 選中當前行到檔案末尾的內容(vG)
  4. 給選中的內容新增冒號(.)

這樣對六萬行檔案的操作就全部完成了。你甚至不需要去記一些亂七八糟的口訣——就像學騎單車會摔倒一樣,摔著摔著你就會了。相信我。

使用巨集

有些人會覺得巨集很可怕,其實不然。巨集只用來完成這樣一件事: 記錄你做的一切,在你需要的時候幫你再做一次。下面是一個簡單總結:

  • qa: 開始記錄接下來要執行的動作,並命名為a
  • q: 停止記錄
  • @a :將巨集代表的動作再執行一次

很簡單啊是不是?你可以儲存多個巨集,比如說巨集a、巨集b、巨集c等等。當你需要的時候執行@a或者@c之類的就可以了。

什麼場景下使用巨集?

你可能會問:

既然視覺化模式與點命令的結合已經這麼強大了,我們為什麼還要使用巨集呢?

問得好,不過答案挺複雜。巨集可以做你所做的一切,來看看這樣一個流程

  1. 在當前行搜尋“widget”
  2. 找到最後一個匹配到的單詞並新增–maker
  3. 走到行首並新增一個分號
  4. 走到行末再新增一個點號
  5. 如果行末有空格則刪除

這麼一堆工作,我們們還是假設檔案有六萬行,試著在Microsoft word之類的工具裡完成這些操作,照樣會讓人感到萬分痛苦。

不過在vim中,這都不算事兒,你只需要把這些動作都做一遍(recording模式下),然後對每一行重新執行巨集就可以了。

【注意:如果想要對視覺化選中文字執行巨集的話,可以執行:normal @a(或者其他你所定義的巨集的名字),這條命令會臨時將你切換到普通模式,針對每一行執行巨集命令】

技巧

下面我們來看一些大家經常問的一些問題,總結出來節約大家時間。

刪除行末空格

根據開啟檔案的型別不同,可能需要你對回車符和換行符做一些處理。這裡介紹如何刪除行末那些煩人的Ctrl-M字元。

刪除行末的Ctrl-M字元

:%s/s+$//

修改檔案型別

set ft=unix

set ft=html

set ft=dos

【注意:如果要顯示當前檔案型別,在配置檔案中新增:set filetype,或者在vim中直接執行這條命令就可以了】

包裝文字

借用Surround外掛,我們可以很

  • cs”‘: 將游標所在單詞兩邊的雙引號修改成單引號
  • cs'<q> :做同樣的事,不同的是將單引號修改成<q>
  • ds” : 刪除兩邊的的配對雙引號
  • ysiw[ :在當前單詞兩邊加上中括號
  • ysiw<em>: 給當前單詞(其他文字物件也可)新增強調標籤!!!知道我為什麼這麼激動嗎?因為這個操作可以使用點命令來重複!
  • Visual Mode: 視覺化模式下,選中任意文字,輸入S。vim會帶你跳轉到視窗最底端。這時候你可以輸入任何你想給這段文字打上的標籤,比如說<a href=”/images”> ,回車試試?

總結

通過本教程我希望大家能明白以下兩點:

  1. vim 是可以學會的
  2. vim 很強大

上面介紹的那些vim基礎用法,即便你只喜歡其中一部分,我想可能也會加深你對編輯文字的熱情——這可不是小事。你對操作的編輯器越熟練,思維也就越發散,我想這是堪比史詩級的大事了。

更為重要的是,這也是為什麼要求你得精通你選擇的編輯器。只有精通編輯器,不被編輯器的操作所阻滯,當你腦內思緒奔騰時,你才能激揚文字跟緊思緒跳躍的步伐。

或者,你也可以將這一切都拋開,成為那些被人所取笑的人——不管怎樣,我希望本教程能對你有用。

【如果你喜歡這篇文章,可以去我的地盤看看其他技術指導文章】

引用

  1. 推薦大家閱讀Drew Neil的這本書《Practical Vim: Edit Text at the Speed of Thought》這是vim愛好者必備書籍。
  2. 強烈推薦《Your Problem with vim is that you don’t grok vi》,它不光對vim一般用法做了非凡概述,還介紹了一些漂亮的vim技巧。
  3. 如果你還沒看過Steve Losh的《Coming Home to Vim》,強烈推薦。
  4. 一定要去看看 Kana 大神的《True Power of Vim》。
  5. 另外還有Drew的 Vimcasts.org. 這兩者都從實際操作角度讓你認識到vim的強大。
  6. 如果想要vim簡明命令資源,下載 Vim Quick Reference
  7. 當然不要忘了 Vim Wiki,這也是學習vim的重要資源。
  8. 如果你對vimscript感興趣, 一定去看看Steve Losh的《Learn Vimscript the Hard Way》。這是迄今為止關於vimscript的最好學習資料。
  9. 還有Openvim的《This is a really well done interactive tutorial》。
  10. The help 非常棒,不過內容有點多,如果你真的非常想要學好Vim的話,那麼一定要從頭到尾通讀。