Vim最少必要知識

題圖

一. Vim是什么

都說程序員只用兩種編輯器,一種是編輯器之神Vim,一種是神的編輯器Emacs,可現(xiàn)實生活中,我發(fā)現(xiàn)真正用這兩種編輯器的人很少,所以我開始有點懷疑這句話的真實性。

剛畢業(yè)那會,我對實際的軟件開發(fā)了解甚少,于是糊里糊涂的進(jìn)入了服務(wù)器開發(fā)領(lǐng)域,現(xiàn)在回想起來真是覺得既幸運又后怕。幸運的是,在我完全不了解的情況下竟然選擇了后端開發(fā),后怕的是,既然不了解,就很可能選擇到其他方向,而另一個選擇可能會造就一個完全不同的人生軌跡。雖然從現(xiàn)在的眼光去看軟件開發(fā)的每個方向,都非常有趣和有挑戰(zhàn),但服務(wù)器領(lǐng)域才是我最向往的地方,且它極大程度的滿足了我的好奇心。

不知道為什么,我對很古老的東西很感興趣,服務(wù)器開發(fā)日常面對的是一個終端界面,沒有圖形化的豐富表現(xiàn),只有常規(guī)的字符,讓我著迷的肯定不是它的表現(xiàn)形式,更深層次的講,它更接近于計算機(jī)最開始的樣子,在這種環(huán)境下工作可以幫助我更容易的掌握機(jī)算機(jī)的原理和思想。

區(qū)別于Windows這樣的操作系統(tǒng),Unix/Linux系統(tǒng)的設(shè)計原則是簡約(Kiss原則),可能有點違背直覺,大多數(shù)人認(rèn)為Windows更為容易上手,確實如此,但這并不意味著它的設(shè)計就是簡單的,使用起來就是高效的。而Unix不同,其中的每一個程序都只完成單一的功能,程序之間可以很容易的交互數(shù)據(jù),這樣,通過將不同程序進(jìn)行任意組合,可以創(chuàng)造出任意的功能,既匹配了程序員這一創(chuàng)造性工作,又極大的提升了工作效率。試比較——在同一目錄下,將所有jpg后綴轉(zhuǎn)換為png后綴的操作——在哪個系統(tǒng)上操作更為方便。

Unix設(shè)計原則對于大多數(shù)程序員來說,是一種“信仰”,而Vim也是其中一個具備KISS原則的產(chǎn)品。

所謂程序員只用兩種編輯器,我現(xiàn)在似乎明白為什么使用它們的程序員實際上并不多的原因了,這句話缺少了一個時間的維度,在過去,圖形界面不發(fā)達(dá),人們用計算機(jī)只能使用命令行,在命令行中也只能使用Vim或Emacs編輯器,而隨著時代的變遷,人們更傾向于使用易于上手的圖形化軟件,他們希望速成,不愿意在編輯器上花成本,而逐漸忘卻了Vim或Emacs。時至今日,這句話變成了:

程序員都用兩種編輯器,大多數(shù)人使用圖形化編輯器,少數(shù)人使用Vim或Emacs。

二. 我為什么使用Vim

我為什么會選擇Vim,一是因為Vim可以在所有操作系統(tǒng)及終端中使用,真正做到了“一招鮮,吃遍天”。學(xué)會了Vim,你再也不需要學(xué)習(xí)其他編輯器。

相反,如果你使用IDE的話,可能這輩子要學(xué)習(xí)很多編輯器,例如當(dāng)你使用C/C++時,你可能會用VS/SourceInsignt/SublimeText等,當(dāng)你使用Java時,你可能會換成Eclipse/Android Studio,而當(dāng)你做前端開發(fā)時,你需要學(xué)習(xí)使用WebStorm/Atom等。同時,這些IDE都無法在終端中運行,這時你要編碼和調(diào)試,需要跨越兩個環(huán)境,效率極低,如果你想改變這種現(xiàn)狀,你還得學(xué)習(xí)Vim。

而對于程序員來說,一個順手的開發(fā)環(huán)境決定了他的開發(fā)效率和幸福指數(shù),有時為了一個穩(wěn)定又一致的開發(fā)環(huán)境,我會放棄公司的辦公電腦,取而代之的是背一部幾公斤重的筆記本來來回回。

二是Vim的效率很高,它會想盡一切辦法將你的雙手放在主鍵盤區(qū),甚至不需要碰小鍵盤或鼠標(biāo),更深一層,為了達(dá)到相同的目的,它會讓你盡可能減少按鍵次數(shù)。這樣做都是為了讓你更加專注,集中精力去完成當(dāng)前的工作,而右手經(jīng)常在鼠標(biāo)和鍵盤之間來回切換,無疑是一種“打斷”。

最后一個原因,使用Vim真的很酷,因為Vim學(xué)習(xí)曲線比較陡峭,即便對于程序員同學(xué)來說,它不好用,或是一頭難以馴服的猛獸,所以在這種情況下,如果你可以把它運用自如,你擁有的就是別人從未有過的一種體驗。

三. 至少要掌握的知識

說Vim學(xué)習(xí)曲線陡峭,其實也是相對于其他編輯器來說的,其實也并沒有多陡峭,下面主要從以5個概念,來談一下Vim的最少必要知識,這是我平時使用Vim的過程中,總結(jié)出來的:對于一個新人,至少要知道哪些用法呢?

  1. 模式
  2. 命令
  3. 窗口,Buffer
  4. 配置
  5. 插件

模式

模式是Vim區(qū)別于其他編輯器的首要功能,它要解決的問題是“只使用鍵盤就可以完成所有工作”,你可以想象一下,當(dāng)你在使用電腦時,克制自己不用鼠標(biāo)或觸控板時的感受:你也許會感覺非常無力吧。而當(dāng)你在使用Vim時,這件事情不會給你帶來任何不適,相反如果你適應(yīng)了Vim的模式后,看到別人的右手在鍵盤和鼠標(biāo)之間來回切換,你才會覺得那個人的效率和自己比起來是多么低效。

Vim中的三個模式分別是

  1. 普通模式normal
  2. 插入模式insert
  3. 可視模式visual

普通模式相對于插入模式,它用來控制光標(biāo)移動、復(fù)制/粘貼文本、排版等,并將這些功能映射到指定的快捷鍵中,這樣當(dāng)你輸入一個按鍵,它就會幫你完成以上功能。

<Esc>

<Esc>按鍵幫你從其他模式切換到普通模式,所以當(dāng)蘋果在最新版的macbook pro中取消<esc>按鍵時,一大批Vimer第一個反應(yīng)就是macbook pro不適合開發(fā)者,不過我覺得這應(yīng)該不是什么大問題,在切換到Vim時,肯定會彈出相應(yīng)的虛擬按鍵,只是手感上應(yīng)該會差很多,但如果要追求更好的手感,我推薦你去外接一個機(jī)械鍵盤,真的不一樣。

h/j/k/l

這四個鍵在鍵盤的最中間,當(dāng)你處于普通模式時,h/j/k/l這四個按鍵分別代表了光標(biāo)向左/下/上/右移動一個字符,當(dāng)然你完全不需進(jìn)行刻意的記憶,打開電腦練習(xí)幾次就習(xí)慣了。學(xué)會了這幾個按鍵,你的手指再也不需要移動到小鍵盤上去了。

hjkl

移動

ctrl+f/b/d/u

這四個快捷鍵,可以幫助你翻頁,實現(xiàn)光標(biāo)在文件中快速移動。

  • ctrl+f:向下翻一頁
  • ctrl+b:向上翻一頁
  • ctrl+d:向上翻半頁
  • ctrl+u:向下翻半頁

移動

b/w/e/shift+^/shift+$

普通模式下,h和l每次只能向左或向右移動一個字符,這無疑是非常慢的,下面幾個快捷鍵,可以幫助你在行內(nèi)快速移動

  • b:將光標(biāo)移動到上一個單詞的第一個字符
  • w:將光標(biāo)移動到下一個單詞的第一個字符
  • e:將光標(biāo)移動到下一個單詞的最后一個字符
  • shift+^:將光標(biāo)移動到行首
  • shift+$:將光標(biāo)移動到行尾

移動

f/F'a'

在行內(nèi)快速移動的“升級版”,單引號中的內(nèi)容可以用任意字符代替,例如f'b'/F'b'

  • fa:將光標(biāo)移到右邊的第一個字符a上,繼續(xù)按';'(分號),可以延相同的方向找到下一個a,繼續(xù)按','(逗號),可以延反方向找到下一個a
  • Fa:將光標(biāo)移到左邊的第一個字符a上,繼續(xù)按';'(分號),可以延相同的方向找到下一個a,繼續(xù)按','(逗號),可以延反方向找到下一個a

當(dāng)你熟練使用這個快捷鍵,你就知道我為什么會說:

Vim會盡量減少你敲鍵盤的次數(shù)

移動

H/M/L

這幾個快捷鍵,可以幫你把光標(biāo)移動到屏幕的上方/中間/下方,注意是要打開大寫鎖定或按住shift

  • H(high):將光標(biāo)移動到屏幕上方
  • M(middle):將光標(biāo)移動到屏幕中間
  • L(low):將光標(biāo)移動到屏幕下方

移動

[n]jk

中括號中的n可以用任意數(shù)字代替,例如10j表示將光標(biāo)向下移動10行,而10k則相反

  • [n]j:將光標(biāo)向下移動n行
  • [n]k:將光標(biāo)向上移動n行

移動

[n]G

同[n]jk命令,[n]G命令會幫你把光標(biāo)移動到指定的行數(shù),例如100G,會將光標(biāo)移動到文件的第100行

移動

gg/G

這兩個快捷鍵,會將光標(biāo)移動到文檔的第一行或最后一行

  • gg:將光標(biāo)移動到文檔的第一行
  • G:將光標(biāo)移動到文檔的最后一行

移動

zz

這個快捷鍵會將當(dāng)前光標(biāo)所在行居中

移動

%

該快捷鍵實質(zhì)上是shift+5兩個鍵的組合,可以讓你的光標(biāo)在成對的括號間跳轉(zhuǎn),例如大括號、圓括號、方括號等,該功能在寫代碼時經(jīng)常使用。

移動

*/#/n/N

  • *:在文件中查找光標(biāo)下的單詞(向下),如果要繼續(xù)查找,可以按n向下查找,按N反向查找
  • #:在文件中查找光標(biāo)下的單詞(向上),如果要繼續(xù)查找,可以按n向上查找,按N反向查找

移動

[[、]]、{、}

這套指令也特別容易記憶,因為大括號或花括號的方向即是你的光標(biāo)所移動的方向

  • [[:將光標(biāo)移動到上一個代碼段(或函數(shù))的行首
  • ]]:將光標(biāo)移動到下一個代碼段(或函數(shù))的行首
  • {:將光標(biāo)移動到上一個空行行首
  • }:將光標(biāo)移動到下一個空行行首
關(guān)注光標(biāo)變化

以上是在普通模式中最常用的移動操作,熟練掌握以上操作,Vim便成了你手中的“六脈神劍”,可以任由你“指哪打哪”了。

u/ctrl+r

  • u:撤銷
  • ctrl+r :重做

編輯

y/yy/p/P/"+y/"+p

這幾個命令表示基本的復(fù)制和粘貼

  • y:復(fù)制,比較常用的是先進(jìn)入可視模式,然后按y,復(fù)制所選文本
  • yy:復(fù)制一整行
  • p:從光標(biāo)右邊開始粘貼,注意不能粘貼到Vim外的程序中
  • P:大P,從光標(biāo)左邊開始粘貼
  • "+y:復(fù)制到系統(tǒng)剪貼板,這樣就可以粘貼到Vim外面去了
  • "+p:將Vim外復(fù)制的內(nèi)容粘貼進(jìn)來

+"y/p這種三個鍵的快捷鍵不是很方便,所以我們可以在vim中建立按鍵映射,將它的操作簡化,例如在~/.vimrc(沒有該文件的情況下要手動創(chuàng)建)中加入:

" 定義快捷鍵的前綴,即<Leader>
let mapleader="'"
" 在可視模式下,'+y則為復(fù)制到剪貼板
vnoremap <Leader>y "+y 
" 普通模式下,'+p則為從剪貼板粘貼到Vim
nmap <Leader>p "+p

編輯

a/i/A/I/r/cc/cw

這幾個快捷鍵可以幫助你編輯文本

  • a:從光標(biāo)右邊開始插入,進(jìn)入插入模式
  • i:從光標(biāo)左邊開始插入,進(jìn)入插入模式
  • A:從行尾插入,進(jìn)入插入模式
  • I:從行首插入,進(jìn)入插入模式
  • r:替換光標(biāo)下的字符,不進(jìn)入插入模式,例如rx,將光標(biāo)下的字符替換為x
  • cc:修改光標(biāo)所在行,進(jìn)入插入模式
  • cw:修改光標(biāo)開始以右的單詞,這個組合鍵在編碼的時候也經(jīng)常使用,Vim中的組合鍵由動作+ 范圍組成,如c為修改動作,w為一個單詞的范圍,再如d2j表示:刪除光標(biāo)所在行及下一行,其中d為刪除動作,2j為下兩行

編輯

.

點號鍵可以幫你重復(fù)上次編輯操作,例如你想手動將文件中所有的int轉(zhuǎn)換為int64,只需要:

  1. 進(jìn)入普通模式,將光標(biāo)移到int下
  2. 敲擊*查找int
  3. 敲擊cw替換int,輸入int64
  4. 按ESC繼續(xù)進(jìn)入普通模式
  5. 敲擊n查找下一個int
  6. 敲擊.重復(fù)執(zhí)行替換,然后繼續(xù)執(zhí)行第5步驟

編輯

插入模式?jīng)]什么可說的,在這種模式下和其他編輯器沒有什么區(qū)別,下面說下可視模式

v/V/ctrl+v

v、Vctrl+v進(jìn)入可視模式,在這種模式下你可以自由選擇你需要操作的文本,然后進(jìn)行批量操作

  • v:進(jìn)入可視模式,按[n]hjkl調(diào)整范圍,n代表分別對hjkl做的次數(shù),例如v10l表示選擇光標(biāo)右邊的10個字符
  • V:選擇光標(biāo)下的行,V10j表示選擇光標(biāo)及光標(biāo)下的10行
  • ctrl+v:可以選擇一個塊狀的區(qū)域,這個功能能夠很好的幫你完成塊注釋或塊反注釋

下圖展示了我將某一個代碼塊注釋掉的動作

  • 首先ctrl+v,然后敲擊6j,垂直選擇6行
  • 輸入:s,^,//,|noh將行首替換為注釋符號//,noh是禁止高亮的意思
visual_mode

選擇

命令

在Vim中可以通過輸入命令的方式進(jìn)行交互,在普通模式下,輸入:調(diào)出命令欄——Vim最底部的一欄,命令分為兩種

  1. Vim調(diào)用shell的命令,前面要加一個感嘆號,例如輸入:!pwd執(zhí)行pwd
  2. Vim內(nèi)置或用戶通過插件實現(xiàn)的命令,例如下面的幾個常用命令

:/ :?

查找命令

  • :/id:從當(dāng)前光標(biāo)向下查找文件中的id字符串,為了方便,你可以直接敲擊/id
  • :?id:從當(dāng)前光標(biāo)向上查找文件中的id字符串,為了方便,你可以直接敲擊?id

:%s,Id,ID,g

:s為替換命令,上文可視模式中已經(jīng)展示了批量替換的威力,另外一種比較常用的是全文替換,例如:%s,Id,ID,g表示將全文中的Id替換為ID,g的意思是一行里面如果有多個匹配項,則都進(jìn)行替換,和sed中的替換是一個概念

:q :w :x :e

學(xué)到這里你已經(jīng)掌握了Vim中的基本用法,現(xiàn)在可以退出休息一下了:)

  • :q 退出
  • :w 保存
  • :x 保存并退出
  • :e 編輯文件,不存在則創(chuàng)建,例如:e ~/.vimrc會編輯~/.vimrc這個文件

:help

即便看完了以上內(nèi)容,你可以順使用Vim了,但最好還是瀏覽一遍幫助文檔,這樣當(dāng)你遇到某個問題時,可以通過help進(jìn)行查找。

Window,Buffer

Vim一次可以打開多個文件,同時打開的文件暫存在Buffer對象中,每個打開的文件對應(yīng)一個buffer對象,你可以選擇性的通過打開某個Buffer來顯示對應(yīng)的文件,而一旦該文件顯示出來,用來顯示該文件的窗口被稱為Window,如果你的屏幕夠大,你可以把Vim分成多個窗口,即實現(xiàn)了多個文件同時進(jìn)行編輯的功能,非常方便你編寫代碼。這也是Vim和其他編輯器在理念上不一樣的地方,其他編輯器使用Tab來打開多個文件,雖然Vim也有Tab功能,但Window+Buffer的方式更符合習(xí)慣

:split vsplit ctrl-w+h/j/k/l

這幾個是Vim中操作窗口的命令

  • :split 將光標(biāo)所在的Window分為上下兩個窗口
  • :vsplit 將光標(biāo)所在的Window分為左右兩個窗口
  • ctrl-w h/j/k/l 幫助你在不同窗口間進(jìn)行切換,h/j/k/l分別代表了切換到左/下/上/右窗口

看完了以上內(nèi)容,再看這幅濃縮圖,就會覺得格外清晰

pic

配置

Vim是高度可定制的編輯器,你可以通過配置從而把它打造成一個非常強(qiáng)大的IDE,而所有的配置基本上都在~/.vimrc中完成,非常方便管理,網(wǎng)上講配置的文章和文檔非常多,相信你可以在網(wǎng)上找到你想要的內(nèi)容。

插件

插件本質(zhì)上是配置的一種,而掌握了Vim插件的安裝和使用后,你就可以將Vim運用到實際工作中了,基本的邏輯是,先明確自己的需求,然后在google中搜索對應(yīng)的關(guān)鍵字便可以找到你所需要的插件,這里就介紹一個非常重要的插件

NERDTree

NERDTree插件配合窗口功能非常好用,NERDTree插件可以幫你列出系統(tǒng)中的目錄和文件樹,打開其中文件的同時,還可以幫你進(jìn)行分屏,有了這樣的插件,你應(yīng)該會更得心應(yīng)手。

版權(quán)申明:
此文章首發(fā)于公眾號程序員在深圳,搜索 studycode 即可關(guān)注
本文無需授權(quán)即可轉(zhuǎn)載,甚至無需保留以上版權(quán)聲明

關(guān)注作者:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容