Vim入門教程


 

盡管網上有成打的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基礎用法,即便你只喜歡其中一部分,我想可能也會加深你對編輯文本的熱情——這可不是小事。你對操作的編輯器越熟練,思維也就越發散,我想這是堪比史詩級的大事了。

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

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

 

 

 

轉載地址:http://blog.jobbole.com/86132/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM