最近一段時(shí)間, 看了兩本關(guān)于 vim 的書, 重新學(xué)了一遍 vim, 在感慨 vim 強(qiáng)大的同時(shí), 也為從前的自滿感到汗顏, 我拿起了從前做的關(guān)于 vim 的筆記, 重新梳理了一遍, 作為一個(gè)系列分享到網(wǎng)上, 主要目的是想讓更多 vim 的愛好者能夠掌握更多的操作技巧.
本系列 vim 筆記的目的不是從零教會(huì)你如何操作 vim, 而是作為一本手冊(cè)或者擴(kuò)展你的視野, 讓你知道原來 vim 還能這么用.
希望你能從本系列教程中收獲到你感興趣的部分內(nèi)容!
本系列教程共分為以下四個(gè)部分:
- 神級(jí)編輯器 Vim 使用 - 1.基礎(chǔ)篇
- 神級(jí)編輯器 Vim 使用 - 2.操作篇
- 神級(jí)編輯器 Vim 使用 - 3.插件篇
- 神級(jí)編輯器 Vim 使用 - 4.正則操作篇
- 神級(jí)編輯器 Vim 使用 - 5.最后
vim 是否值得學(xué)習(xí)
網(wǎng)上有很多形容 vim 的學(xué)習(xí)曲線是如何陡峭的說法. 人, 最恐懼未知的事情. 如果有人給你說: 你花一天的時(shí)間找一個(gè)入門教程進(jìn)行學(xué)習(xí)就可以學(xué)會(huì)基礎(chǔ)操作, 你會(huì)學(xué)習(xí) vim 嗎? 絕大部分人都是會(huì)的, 其實(shí)事實(shí)也就是這樣, 如果只是基礎(chǔ)操作的話 1 天時(shí)間絕對(duì)是夠了. 但是絕大多數(shù)人得不到這樣的答案, 所以他們關(guān)上了這扇窗.
在我看來, vim 的學(xué)習(xí)投入與產(chǎn)出的性價(jià)比是很高的, 學(xué)習(xí)了 vim 后你會(huì)有如下的一系列好處:
- vim 基于終端, 熟練掌握 vim 后你對(duì)終端的理解也會(huì)變得更為深刻
- vim 可以聯(lián)合終端中的其他工具共同組成你的工具鏈(譬如
git) - 在
Atom,Sublime,VSCode,NOTEPAD++等工具泛濫的如今, 你可以選擇一個(gè)有著近 40 年歷史的經(jīng)過了時(shí)間考驗(yàn)的編輯器 - 操作遠(yuǎn)程服務(wù)器時(shí)經(jīng)常需要在終端中進(jìn)行文本編輯, vim 可以讓你如履平地
- vim 支持所有平臺(tái), 你可以使用一份配置文件全平臺(tái)通用
- 裝 13
編輯器的切換是有成本的, 而且成本不小. 任何事情做到一半再去做另外的事情絕對(duì)比從一而終的人損失大得多, 因此選擇一個(gè)適合自己的編輯器作為以后的伙伴是一件應(yīng)該慎重的事情, 而使用過 vim 的人很少會(huì)再換用其他的編輯器, 這應(yīng)該能說明很多問題.
有些人持有工具無用論的觀點(diǎn), 認(rèn)為寫好代碼才是一切, 事實(shí)確實(shí)是這樣. 但是難道有人會(huì)拒絕更快速, 更高效的寫完一段優(yōu)雅的代碼嗎? 這兩者并非是魚和熊掌不可兼得, 我們都可以有.
這方面話題比較容易引戰(zhàn), 點(diǎn)到為止, 具體如何交由讀者自行判斷.
Let's go!
安裝
第一步當(dāng)然是安裝, 這里對(duì) MacOS 與 Linux 進(jìn)行安裝示范
MacOS
不同版本安裝
-
系統(tǒng)內(nèi)置
Mac OS 默認(rèn)內(nèi)置 vim, 在沒有安裝任何其他版本 vim 的情況下在終端中輸入
vim --version可看到如下圖:himg+代表含有的功能,-代表不包含的功能. 可以看到系統(tǒng)內(nèi)置Vim的clipboard選項(xiàng)為-, 代表沒有剪貼板功能, 也就是說不會(huì)與系統(tǒng)剪貼板有任何互動(dòng), 即在 vim 中的內(nèi)容無法復(fù)制到另一個(gè)程序中, 無論如何設(shè)置都無法改變. 這是最大的區(qū)別.而且由于是系統(tǒng)內(nèi)置, 所以如果想要手動(dòng)升級(jí)的話沒有可能, 只能等到系統(tǒng)更新的時(shí)候 Apple 更新官方內(nèi)置
vim. -
官方版 Vim, 通過 Homebrew 安裝
在終端輸入
brew install vim可以通過包管理工具Homebrew來安裝官方版本Vim. 安裝完后的 vim 位置在/usr/local/bin/vim(通過系統(tǒng)命令which vim可以知道具體程序的路徑), 而系統(tǒng)自帶的 vim 位置在/usr/bin/vim, 如果要使用通過 Homebrew 安裝的Vim, 則必須將系統(tǒng)識(shí)別的環(huán)境變量PATH順序調(diào)整為/usr/local/bin /usr/bin /bin /usr/sbin /sbin調(diào)整
PATH順序方法: 打開路徑/private/etc/paths(此為隱藏路徑, 需要打開顯示隱藏文件開關(guān)才能看到), 使用任意文本編輯器打開修改并保存. 如下圖:himg這樣設(shè)置之后當(dāng)在終端中輸入 vim 時(shí)系統(tǒng)會(huì)先對(duì)
/usr/local/bin路徑進(jìn)行檢索, 如果此路徑?jīng)]有的話在對(duì)/usr/bin進(jìn)行檢索, 以此類推. 此時(shí)再次驗(yàn)證which vim命令, 如果返回了/usr/local/bin就說明設(shè)置成功. 以后只要是使用vim [filename]即可使用通過Homebrew安裝的vim來打開了.此時(shí)通過
vim --version可看到如下圖himg最大的改變是
clipboard選項(xiàng)變?yōu)榱?+, 而且很多功能也變?yōu)榱?+.通過
Homebrew安裝的vim一切都很好, 我也用了很長(zhǎng)一段時(shí)間, 但是有兩個(gè)問題一直困擾著我:- 使用輸入法插件在插入模式與普通模式切換之間有較大延遲, 例如在退出輸入模式后會(huì)有 2-3 秒的延遲, 在這段延遲中如果我操作了鍵盤任何鍵位, 結(jié)果將被鍵入到輸入法中. 體驗(yàn)極差.
- 速度. 在編輯較長(zhǎng)的
Markdown文件時(shí), 如果開啟了語(yǔ)法渲染以及底部狀態(tài)欄插件的話會(huì)在快速移動(dòng)光標(biāo)過程中有較大延遲. 這種感覺在遇到語(yǔ)法段落結(jié)構(gòu)復(fù)雜, 且光標(biāo)移動(dòng)較快時(shí)最為明顯. 極大的影響了使用感受.
如果
vim一直是這種問題的話也當(dāng)不得 編輯器之神 的稱呼了. 我上網(wǎng)搜索后發(fā)現(xiàn)有很多人都跟我一樣注意到了這一點(diǎn). Mac 終端上的vim速度慢, 卡頓, 在 Linux 下就非常流暢沒有任何延遲. 通過多方查證, 我測(cè)試了 MacVim 在 Mac 系統(tǒng)下的流暢程度. 果然有驚喜. -
MacVim, 通過 Homebrew 安裝
MacVim是vim在 Mac 系統(tǒng)的移植, 其內(nèi)核與官方版本保持一致. 也就是說如果官方版本的vim在 Mac 上能實(shí)現(xiàn)什么功能, 那么MacVim也能實(shí)現(xiàn)相同的功能.通過 Homebrew 安裝的話只需要用到命令
brew install macvim. 安裝完成后在終端使用mvim即可打開MacVim桌面程序.如果想通過終端打開
MacVim的命令行版本, 使用mvim -v [filename]即可.注: 由于通過
Homebrew安裝的絕大部分包都沒有 GUI, 因此Homebrew不會(huì)將包移入/Applications, 這導(dǎo)致了如果想在桌面上雙擊一個(gè)文件來使用MacVim打開很難實(shí)現(xiàn), 而且在 Mac 的LaunchPad里是找不到MacVim的(即使它是一個(gè) GUI 軟件)因此, 有了下一個(gè)解決方法.
-
MacVim, 通過 Homebrew Cask 安裝
Cask是Homebrew的一個(gè)軟件管理程序.Homebrew本身就已經(jīng)是包管理工具了, 其下的Cask又能管理程序, 一層套一層, 真會(huì)玩. 不過Homebrew絕大部分包都是一些環(huán)境, 而不是日常用戶操作的交互式軟件. 而Cask絕大部分包都是 GUI 軟件. 通過Cask我們能安裝絕大部分我們?nèi)粘P枰能浖? 比如 QQ, 音樂, 瀏覽器, 各種工具...通過
brew install cask安裝Cask包. 安裝完成后再通過brew install macvim --cask來安裝MacVim.himg安裝完成后你可以通過終端得知
MacVim自動(dòng)將mvim命令與路徑/usr/local/bin里的vim,gvim,view等命令進(jìn)行了綁定. 這表示在 系統(tǒng)變量PATH為/usr/local/bin第一的時(shí)候, 我們只要是使用vim,gvim,view中的任意一個(gè)都會(huì)打開MacVim桌面端程序.如果此時(shí)還是想用
MacVim以命令行模式打開文件的話可以使用mvim -v或者vim -v或者其他幾個(gè)綁定的命令. 當(dāng)然我為了方便直接在~/.zshrc(我是用的是 zsh) 中設(shè)置了 alias.alias vim='mvim -v'設(shè)置完記得使用
source ~/.zshrc或者重啟終端來重載~/.zshrc
對(duì)比與總結(jié)
通過 MacVim 與 終端 vim 的安裝體驗(yàn)對(duì)比, 總結(jié)了 MacVim 的如下優(yōu)缺點(diǎn)(同樣對(duì)應(yīng) vim 的優(yōu)缺點(diǎn)):
-
優(yōu)點(diǎn)
- 有系統(tǒng)級(jí)別的復(fù)制粘貼撤銷快捷鍵,
- 滾動(dòng)更流暢,
- 輸入法切換速度更快,
- 右側(cè)的導(dǎo)航滑軌也有了作用
-
缺點(diǎn)
- 沒有集成在終端中意味著與終端切換的成本更大
-
總結(jié)
如果必須在 Mac 上使用 vim, 而且對(duì)流暢度要求比較高, 那么就是用 MacVim 吧.
如果絕大多數(shù)工作環(huán)境都在終端上完成, 那么就使用終端
vim.如果要求兼具了以上兩者, 就等待吧, 等官方解決 Mac 系統(tǒng)上的延遲問題
CentOS
在 CentOS 中我們可以使用如下方法安裝 vim
- 源碼編譯
- yum 安裝
- GUI 版 vim 安裝
但是經(jīng)過多次試驗(yàn)之后發(fā)現(xiàn)這三種方法的前兩種都是剪貼板缺失的 vim, 也就意味著不能與系統(tǒng)剪貼板進(jìn)行交互, 因此最好安裝 GUI 版 Vim
sudo yum install vim-X11
調(diào)用 vim 時(shí)使用 vimx 代替 vim
Debian && Ubuntu
安裝 vim-gtk or vim-gnome.
Arch Linux
安裝 install gvim
Vim 模式區(qū)分
模式是 vim 與其他編輯器的最重要區(qū)別之一, 簡(jiǎn)單來說就是同樣一個(gè)界面的同樣操作在不同模式下會(huì)產(chǎn)生不同的效果. 最常用的模式有 Normal Mode, Insert Mode, Visual Mode, 與 Command Line Mode
普通模式(Normal mode)
Vim 默認(rèn)模式, 又稱為命令模式, 可使用 hjkl 進(jìn)行移動(dòng)和簡(jiǎn)單編輯
插入模式(Insert Mode)
該模式下可以盡情地輸入, 普通模式通過 i, a, o, cc 等命令可進(jìn)入插入模式.
可視模式(Visual Mode)
與普通模式類似, 不同的是當(dāng)移動(dòng)時(shí)會(huì)進(jìn)行擴(kuò)展當(dāng)前的選擇區(qū)域. 普通模式按 v(進(jìn)入字符選擇模式) 或 V (進(jìn)入行選擇模式)進(jìn)入該模式
命令行模式(Command Line Mode)
在該模式下可以在窗口的下方輸入一行命令, 然后執(zhí)行. 當(dāng)一條命令執(zhí)行完會(huì)自動(dòng)退出命令模式進(jìn)入普通模式.
命令模式通過輸入 : 進(jìn)行開啟
替換模式(Replace Mode)
新輸入的文本會(huì)替換光標(biāo)所在處的文本, 并使光標(biāo)依次向后移動(dòng).
普通模式下通過按 R 進(jìn)入該模式
Ex Mode
與命令模式相似, 不同的是在該模式下可執(zhí)行多次命令不會(huì)自動(dòng)退出命令模式. 直至輸入 :visual 退出該模式
在普通模式下通過按 Q 可以進(jìn)入該模式
vim 鍵位映射
當(dāng)我們寫了腳本或者不喜歡某些按鍵的觸發(fā)方式, 我們當(dāng)然可以將其改為我們認(rèn)為最適合我們的鍵位, vim 對(duì)按鍵映射做了極為精細(xì)的區(qū)分, 讓我們可以更好地掌控全局.
鍵表
-
<k0>-<k9>: 小鍵盤數(shù)字 0 到 9 -
<S-x>: 大寫 S 配合 x, 意味著 shift+x 組合鍵 -
<C-x>: 大寫 C 配合 x, 意味著 ctrl+x 組合鍵 -
<A-x>: 大寫 A 配合 x, 意味著 alt+x 組合鍵 -
<ESC>: ESC 鍵 -
<BS>: backspace 退格鍵 -
<CR>: ENTER 回車鍵 -
<Space>: 空格鍵 -
<Shift>: shift 鍵 -
<Ctrl>: ctrl 鍵 -
<Alt>: alt 鍵 -
<F1>-<F12>: F1 到 F12 功能鍵
前綴
因?yàn)?vim 有多種模式, 因此我們可以針對(duì)不同的模式設(shè)置不同的快捷鍵映射
map: 用于正常模式, 可是模式, 選擇模式, 操作待決模式nmap: 用于正常模式vmap: 用于可視模式與選擇模式xmap: 用于可視模式smap: 用于選擇模式omap: 用于操作待決模式map!: 用于插入模式與命令行模式imap: 用于插入模式cmap: 用于命令行模式-
nore: 不遞歸, 否則在下面的按鍵映射下按下 i 就等于按下 k, 就等于按下 j, 最后結(jié)果亂套.nnoremap i k nnoremap k j nnoremap j h -
<Leader>: 意思就是在各種快捷鍵的最前面加上<leader>, 避免了二義性. 如下所示, 在普通模式按下##w 時(shí), 就完成了文件的保存工作(如果不進(jìn)行自定義設(shè)置的話, 默認(rèn)的 leader 鍵為反斜杠\)let mapleader="##" nmap `<leader>` w :w<CR>
實(shí)際修改舉例
inoremap ' ''<esc>i " 單引號(hào)補(bǔ)全
// 在普通模式, 快速按下 fw, 就相當(dāng)于輸入了: w<CR>, fw 可以理解成 file\_write.
"文件保存與退出
nmap fw :w `<CR>`
nmap fq :q `<CR>`
nmap fwq :wq `<CR>`