儘管網上有成打的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基礎用法,即便你只喜歡其中一部分,我想可能也會加深你對編輯文字的熱情——這可不是小事。你對操作的編輯器越熟練,思維也就越發散,我想這是堪比史詩級的大事了。
更為重要的是,這也是為什麼要求你得精通你選擇的編輯器。只有精通編輯器,不被編輯器的操作所阻滯,當你腦內思緒奔騰時,你才能激揚文字跟緊思緒跳躍的步伐。
或者,你也可以將這一切都拋開,成為那些被人所取笑的人——不管怎樣,我希望本教程能對你有用。
【如果你喜歡這篇文章,可以去我的地盤看看其他技術指導文章】
引用
- 推薦大家閱讀Drew Neil的這本書《Practical Vim: Edit Text at the Speed of Thought》這是vim愛好者必備書籍。
- 強烈推薦《Your Problem with vim is that you don’t grok vi》,它不光對vim一般用法做了非凡概述,還介紹了一些漂亮的vim技巧。
- 如果你還沒看過Steve Losh的《Coming Home to Vim》,強烈推薦。
- 一定要去看看 Kana 大神的《True Power of Vim》。
- 另外還有Drew的 Vimcasts.org. 這兩者都從實際操作角度讓你認識到vim的強大。
- 如果想要vim簡明命令資源,下載 Vim Quick Reference。
- 當然不要忘了 Vim Wiki,這也是學習vim的重要資源。
- 如果你對vimscript感興趣, 一定去看看Steve Losh的《Learn Vimscript the Hard Way》。這是迄今為止關於vimscript的最好學習資料。
- 還有Openvim的《This is a really well done interactive tutorial》。
- The help 非常棒,不過內容有點多,如果你真的非常想要學好Vim的話,那麼一定要從頭到尾通讀。