
盡管網上有成打的Vim在線教程,但是要么艱深晦澀,要么太過膚淺。本教程的目標讓每個階段都有斬獲,從理解它的哲學(將和你終身相伴)到超越現在編輯技巧,成為其中的牛人。
簡單來說,本教程的學習方式將使你終身受益。
為什么選擇vim
我相信大多數人可能由於以下三點原因而使用vim:
1、vim無所不在。學習vim你無需擔心到了其他平台需要學習新編輯器。
2、可擴展性。你可以只用它來編輯配置文件,也可以將它當做你的開發平台。
3、功能強大。它的工作方式與自然語言類似。即使一開始你對vim一無所知,經過一段時間的使用學習,很快也會成為牛人。
一句話,我相信一旦你開始學習,你會覺得就像掌握母語還有基礎數學這些基本技能一樣,也能自然而然地掌握vim。好了,在了解這些知識之后,讓我們正式開始vim技術的學習吧。
Approach
Kana大神說過,對vim的掌握有五個層次:

- 層次0: 對vim一無所知
- 層次1: 了解vim的基本使用
- 層次2: 知道可視模式
- 層次3: 知道多種移動動作
- 層次4: 不再需要可視模式
對此我並不了解,不過我認為這種觀點值得我們注意。畢竟,kana是vim大神。在本教程中,我將通過下面四個主要模塊來向你展示vim。
- 基礎介紹:這部分基礎介紹能快速建立起你對vim的正確認知。
- 具體操作: 這塊是干貨。做好准備來享用吧。
- 進階: 這部分我會教你怎樣成為vim牛人。
- 常見問題: 這里會講述一些常見問題解決技巧。
換句話說,如果你已經對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來實現。基本上,通過以下幾步就可以了:
- 安裝Pathogen
- 將你需要的插件git clone 克隆到~/.vim/bundle
- 在配置文件~/.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
不要因為命令很長而感到崩潰。要記住,這些命令跟我們平常說話是一樣的。你可以沒有任何困難地、很隨意地念叨:
我想去商店。
這條命令也是一樣的:
拷貝這一段,下移兩行,再粘貼。
將可視化模式與重復結合
可視化模式還有一個很神奇的地方,對於選中的文本,你可以通過點命令來執行之前緩存的命令。請看下面這個例子:
|
1
2
3
4
5
6
|
foo
bar
thing
other
yetanother
also
|
如果想在每行前面都加個冒號,可以現在第一行foo之前添加,然后可視化模式下選擇之下所有行,執行點命令就可以了。
|
1
2
3
4
5
6
|
:foo
:bar
:thing
:other
:yetanother
:also
|
【注意:要想使用這個功能,必須要在配置文件中添加映射 vnoremap . :norm.<CR>】
BAM!
覺得這功能沒有那么酷炫? 那就想象一下: 你有個六萬行的文件,每行都與例子一樣,需要追加個冒號。你會怎么做?
對整個文件添加分號
0i:j0vG.
wut
大大簡化了我們的操作,大殺器一枚。步驟如下:
- 走到第一行行首並插入一個冒號(0i:)
- 走到下一行定位到行首位置(j0,注意之前是插入模式,需要先回到普通模式)
- 選中當前行到文件末尾的內容(vG)
- 給選中的內容添加冒號(.)
這樣對六萬行文件的操作就全部完成了。你甚至不需要去記一些亂七八糟的口訣——就像學騎單車會摔倒一樣,摔着摔着你就會了。相信我。
使用宏
有些人會覺得宏很可怕,其實不然。宏只用來完成這樣一件事: 記錄你做的一切,在你需要的時候幫你再做一次。下面是一個簡單總結:
- qa: 開始記錄接下來要執行的動作,並命名為a
- q: 停止記錄
- @a :將宏代表的動作再執行一次
很簡單啊是不是?你可以保存多個宏,比如說宏a、宏b、宏c等等。當你需要的時候執行@a或者@c之類的就可以了。
什么場景下使用宏?
你可能會問:
既然可視化模式與點命令的結合已經這么強大了,我們為什么還要使用宏呢?
問得好,不過答案挺復雜。宏可以做你所做的一切,來看看這樣一個流程
- 在當前行搜索“widget”
- 找到最后一個匹配到的單詞並添加–maker
- 走到行首並添加一個分號
- 走到行末再添加一個點號
- 如果行末有空格則刪除
這么一堆工作,咱們還是假設文件有六萬行,試着在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”> ,回車試試?
總結
通過本教程我希望大家能明白以下兩點:
- vim 是可以學會的
- vim 很強大
上面介紹的那些vim基礎用法,即便你只喜歡其中一部分,我想可能也會加深你對編輯文本的熱情——這可不是小事。你對操作的編輯器越熟練,思維也就越發散,我想這是堪比史詩級的大事了。
更為重要的是,這也是為什么要求你得精通你選擇的編輯器。只有精通編輯器,不被編輯器的操作所阻滯,當你腦內思緒奔騰時,你才能激揚文字跟緊思緒跳躍的步伐。
或者,你也可以將這一切都拋開,成為那些被人所取笑的人——不管怎樣,我希望本教程能對你有用。
轉載地址:http://blog.jobbole.com/86132/
