vim 成“神“之路 (一)
文章目錄
- 1. 安裝
- 1.1 linux
- 1.2 MacOs的安裝
- 1.3 Windows的安裝
- 1.4 vim中文幫助文檔安裝
- 2. vim基本概念和基礎(chǔ)命令
- 2.1 基本的鍵位映射如下:
- 2.2 vim模式
- 2.3 vim的選項(xiàng)和基本配置
- 2.3.1 備份和跨會(huì)話(huà)撤銷(xiāo)文件
- 2.3.2 vim中支持鼠標(biāo)
- 3. vim 常用命令 -- 應(yīng)對(duì)稍復(fù)雜任務(wù)
- 3.1 光標(biāo)移動(dòng)
- 3.2 文本修改
- 3.3 文本對(duì)象選擇
- 3.4 文本移動(dòng) -- 更快
- 3.5 重復(fù)操作
- 4. vim 的簡(jiǎn)單定制
- 4.1 vim 的目錄結(jié)構(gòu)
- 4.2 vim 軟件包
- 5. vim 的復(fù)制與粘貼
- 6. vim的模式匹配:正則表達(dá)式
- 6.1 基本的特殊字符
- 6.2 特殊模式項(xiàng)
- 6.3 一些搜索舉例
- 6.3.1 最長(zhǎng)匹配和最短匹配
- 6.3.2 搜索加亮和取消
- 6.3.3 正則表達(dá)式替換
- 6.3.4 替換實(shí)例
哈哈,有點(diǎn)標(biāo)題黨的意思,vim帶你成"神"?還是你通過(guò)vim成了"神"?還是學(xué)習(xí)了vim,感覺(jué)vim就是"神"? 仔細(xì)耐心體驗(yàn)一下vim的"神跡"。
vim 作為程序員三大美德體現(xiàn):懶惰,急切,傲慢 的優(yōu)秀編輯器,已經(jīng)走過(guò)了接近三十個(gè)年頭。
從肯·湯普遜 1978年將unix 操作系統(tǒng)傳播開(kāi)來(lái),到比爾·喬伊 完成第一個(gè)版本的全屏編輯器 vi的開(kāi)發(fā)(在此之前有很多基于行的編輯器ed,em,en ,ex),再到布萊姆·穆勒納爾 持續(xù)維護(hù)了三十年的vi 克隆版本, 最后也就演變成了我們現(xiàn)在使用的vi IMproved – vim。
vim的優(yōu)點(diǎn)如下:
- vim 是一個(gè)完全跨平臺(tái)的編輯器
從開(kāi)始的unix,到 現(xiàn)在最為通用流行的 linux,windows,Macos,再到不經(jīng)常用的操作系統(tǒng)OS/2, BeOS,甚至ios和android也能找到vim的移植版本。 - vim 是一個(gè)高度定制和可擴(kuò)展的編輯器
通過(guò)vim 自身腳本語(yǔ)言(Vim Script)可以擴(kuò)展vim的功能,如果vim 腳本能力還不足,則可以通過(guò)Python ,Perl 等其他通用腳本語(yǔ)言進(jìn)行擴(kuò)展。這樣就能夠非常自由得打造屬于自己的專(zhuān)屬環(huán)境。 - vim 良好的生態(tài)環(huán)境
網(wǎng)絡(luò)上已有的現(xiàn)成的腳本和插件,能夠直接搭建順手的開(kāi)發(fā)環(huán)境。像經(jīng)常用的語(yǔ)法補(bǔ)全,語(yǔ)法檢查等常用功能,都可以在vim下實(shí)現(xiàn),且能夠通過(guò)配置 不需要離開(kāi)vim 編輯器就能完成從寫(xiě)代碼、到編譯運(yùn)行的大部分工作。
有這么多優(yōu)點(diǎn),又是無(wú)數(shù)大佬自己使用的編輯器,那么vim 就需要快速搞起來(lái),來(lái)讓自己的工作效率進(jìn)一步提升,希望這篇成神之路能夠帶給你在vim上足夠多的幫助。
客觀來(lái)講,vim的配置確實(shí)非常繁瑣,甚至復(fù)雜,想要達(dá)到現(xiàn)在vscode ,clion的方便程度確實(shí)會(huì)花費(fèi)不少時(shí)間。但vim的高效是能夠在手指不離開(kāi)鍵盤(pán)的情況下完成任何場(chǎng)景下的編輯工作,手指快速敲擊三個(gè)鍵以?xún)?nèi)就能夠達(dá)到一段文本的增刪改查。
當(dāng)然打造自己的vim 感覺(jué) 就像是公元前1500年前后 印歐語(yǔ)系游牧的蠻族潛心打造的青銅器,青銅戰(zhàn)車(chē) ,馬具馬鞍,戴著他們橫掃了整個(gè)歐亞大陸的古代文明,從尼羅河的埃及文明到地中海的米諾斯文明,到幼發(fā)拉底河和底格里斯河的美索不達(dá)米亞文明,到印度河文明和中國(guó)的商朝(北方的游牧民族)都被精良高效的戰(zhàn)爭(zhēng)民族所取代,顛覆了整個(gè)大陸的格局。
vim所做的就是能夠一統(tǒng)整個(gè)ide的大陸,用靈活的插件搭配強(qiáng)大的快捷操作實(shí)現(xiàn) ,我們只需要在這個(gè)大陸上專(zhuān)注耕耘,建立自己的的偉大帝國(guó)。
先瞅瞅當(dāng)前我的vim 使用上的一些效果:
- 窗口分割
- 自動(dòng)補(bǔ)全
- markdown
- 查看文件歷史修改記錄
這上面僅僅是展示很小很小一部分插件的編輯功能,每一種編輯功能都會(huì)有很多更加方便的細(xì)節(jié)配置。
同時(shí) 本文也只是提供一條道路,希望大家能夠在這條道路上找到適合自己的編輯模式。
最后vim 當(dāng)然也能夠支持閱讀源代碼,只不過(guò)源代碼顯示上不太舒適,這里使用clion這個(gè)老東家也很久了,所以還是不能喜新厭舊呀,用它作為擼源碼的工具 還是很給力,而vim主要用在編輯或者寫(xiě)代碼之上。
vimrc已經(jīng)放置在vim-github,不過(guò)需要vim版本在8.2以上,或者neovim在0.4.4版本才行。
如果能夠看懂vimrc中的簡(jiǎn)單vim script,建議先熟悉一下基本鍵位和操作,熟悉之后會(huì)發(fā)現(xiàn)編輯查看效率 急速飆升,指尖如飛。
1. 安裝
1.1 linux
-
Redhat 和 Centos
查看是否已經(jīng)安裝vim
yum list installed |grep vim如果只有如下這樣的輸出,則說(shuō)明是最小的vim安裝
vim-minimal.x86_64 2:7.4.160-2.el7 @centos7.3-x86_64-base建議使用
sudo yum install vim-enhanced.x86_64安裝增強(qiáng)版的vim。 -
Debian 和 Ubuntu
使用apt進(jìn)行安裝,同時(shí)在這兩種系統(tǒng)下vim有比較多的功能vim vim-athema #適用于老的 X-window 界面 vim-gnome vim-gtk #使用于GTK環(huán)境 vim-gtk3 #適用于GTK環(huán)境 vim-nox #有比較全面的文本界面vim包 vim-tiny #最小功能的vim包安裝可以遵循如下規(guī)則
- 如果系統(tǒng)使用的是GNOME桌面環(huán)境時(shí),安裝
vim-gtk3或vim-gnome - 如果使用的是KDE桌面 ,安裝
vim-gtk - 如果使用文本界面,安裝
vim-nox
可以通過(guò)
apt list --installed|grep vim查看已經(jīng)安裝的vim版本安裝:
sudo apt update sudo apt install vim-gtk3手工編譯安裝,至少加上Python 支持和圖形界面的支持:
./configure --enable-pythoninterp \--enable-python3inerp \--enable-gui=auto #auto可以根據(jù)需要換成gtk3等其他數(shù)值 make -j sudo make install安裝成功之后,通過(guò)
vim --version能夠看到一個(gè)python版本的支持。
- 如果系統(tǒng)使用的是GNOME桌面環(huán)境時(shí),安裝
1.2 MacOs的安裝
直接使用homebrew進(jìn)行安裝
brew install vim
brew install macvim
參考homebrew進(jìn)行mac下的homebrew的安裝
1.3 Windows的安裝
通過(guò)網(wǎng)址https://www.vim.org/download.php#pc下載windows版本的vim.exe,windows下的vim版本還是以32位為主,基本也滿(mǎn)足正常的開(kāi)發(fā)需求了。
安裝過(guò)程中進(jìn)入如下界面:
需要注意如下幾個(gè)選項(xiàng):
- “安裝批處理文件 (Create .bat files)” 對(duì)于使用Vim命令行的開(kāi)發(fā)者來(lái)說(shuō)是剛需,所以需要選擇
- “創(chuàng)建圖標(biāo) (Create icons for vim)” 根據(jù)個(gè)人選擇展開(kāi)
- “創(chuàng)建默認(rèn)配置文件” 去掉這一項(xiàng),可以通過(guò)后面會(huì)說(shuō)到的方式創(chuàng)建配置文件
- “安裝多語(yǔ)言支持” 使得vim的菜單可以支持多語(yǔ)言選項(xiàng)
點(diǎn)擊下一步,修改安裝的文件目錄,安裝完成即可。
這個(gè)時(shí)候會(huì)打開(kāi)一個(gè)默認(rèn)的README文件,輸入:e \_vimrc,輸入如下內(nèi)容:
set enc=utf-8
set nocompatiable
source $VIMRUNTIME/vimrc_example.vim
按ZZ 退出即可
這里說(shuō)一下windows和linux下vim的區(qū)別
- windos下vim配置文件是_vimrc,unix下一般默認(rèn)~/.vimrc
- windos下打開(kāi)的vim文件都成為了_ 開(kāi)頭,如_viminfo
- 打.開(kāi)頭的vim配置目錄.vim,也變成了vimfiles
同時(shí)windos下vim的插件安裝也是比較費(fèi)勁的,其實(shí)希望成為vim"之神"的同學(xué)應(yīng)該以類(lèi)unix環(huán)境為主,至少一個(gè)虛擬機(jī)下安裝ubuntu鏡像也并不會(huì)消耗太多的時(shí)間。
1.4 vim中文幫助文檔安裝
英文版的教程,使用 終端下直接輸入 vimtutor 即可看到,同時(shí)一些網(wǎng)友也翻譯了中文版本的vim幫助文檔,這個(gè)安裝在vim8中也是非常簡(jiǎn)單的。
以類(lèi)unix環(huán)境為例(windows下需要將.vim 改為vimfiles目錄),執(zhí)行如下命令:
cd ~/.vim
mkdir -p pack/my/start/
git clone https://github.com/yianwillis/vimcdoc.git pack/my/start
cd pack/my/start
./vimdoc.sh -i #安裝help.txt的中文幫助文檔
./vimdoc.sh -u # 如果不想要中文版的help信息,則可以卸載掉
進(jìn)入vim,輸入:help 之后可以有如下的效果:
一般類(lèi)unix操作系統(tǒng),可以通過(guò)LANG=zh_CN.UTF-8 vimtutor 來(lái)進(jìn)入一個(gè)中文版本的vim教程
PS:因?yàn)関im使用ctrl鍵會(huì)比較多,建議大家學(xué)習(xí)的時(shí)候?qū)trl映射到之前的CAPS(mac下),或者windows CapsLock下
2. vim基本概念和基礎(chǔ)命令
2.1 基本的鍵位映射如下:
建議大家在看完之前的vim 教程之后在來(lái)熟悉這一塊,保證上面的基本命令都已經(jīng)很熟悉了。
以上圖沒(méi)有說(shuō)明vim的命令行命令
:q!– 不保存退出:wq– 保存退出:s– 替換:!– 執(zhí)行外部unix命令:edit– 一般縮寫(xiě)為:e,編輯文件:w– 寫(xiě)入指定文件:r– 讀文件:help查看幫助信息- 使用
Ctrl + D和Tab鍵將命令補(bǔ)全
2.2 vim模式
- 正常模式(普通模式):缺省的編輯模式,如果不加特殊說(shuō)明,一般提到的特殊命令都直接在正常模式下輸入;任何其他模式都可以通過(guò)鍵盤(pán)上輸入
ESC回到普通模式 - 插入(insert) 模式:輸入文本時(shí)使用,普通模式下鍵入
i(insert)或則a(append)即可進(jìn)入插入模式 - 可視(visual)模式:用于選定文本塊,可以使用
v鍵來(lái)按字符選擇,vim中也提供了按行和塊進(jìn)行選擇的方法 - 命令行(command-line)模式: 用于執(zhí)行較長(zhǎng),較復(fù)雜的命令。普通模式鍵入
:即可進(jìn)入該模式。 使用/或者?開(kāi)始搜索也算作命令行模式。命令行模式下需要輸入回車(chē)才算完成。
再次強(qiáng)調(diào),只要按下ESC,無(wú)論在哪個(gè)模式下,都會(huì)回到普通模式。
這里再次說(shuō)明以下,可以利用好vim命令行下的help幫助文檔,能夠提供非常方便的幫助操作。
2.3 vim的選項(xiàng)和基本配置
隨著持續(xù)不斷得使用vim,它的配置會(huì)不斷得增加,從而應(yīng)對(duì)自己在不同場(chǎng)景的需求。
接下來(lái)看看一些基本的vim配置,之前說(shuō)過(guò)unix系統(tǒng)下的vim配置是.vimrc文件,windows的配置則是_vimrc文件
set enc=utf-8
set nocompatiable
source $VIMRUNTIME/vimrc_example.vim
如之前的一段類(lèi)似于shell 腳本的 配置如上,三行的基本含義如下:
- 設(shè)置編輯文件的編碼格式為utf-8
- 設(shè)置Vim和vi不兼容
- 倒入vim的配置示例(示例中包括一些有用的選項(xiàng):語(yǔ)法高亮,搜索高亮,命令歷史等等)
2.3.1 備份和跨會(huì)話(huà)撤銷(xiāo)文件
vim支持跨會(huì)話(huà)的編輯能力,這個(gè)在目前的編輯器中還沒(méi)有其他的能夠做到的。舉個(gè)例子,編輯完word,將word關(guān)閉,再重新打開(kāi),想要做到撤銷(xiāo)上一次的操作,或者恢復(fù)到之前n次操作,這個(gè)不可能的,vim能夠支持這樣的功能。
基本配置如下兩個(gè):
set backup
set undofile
- 第一個(gè)選項(xiàng)使得我們的每一次編輯都能夠保留上一次的備份文件
- 第二個(gè)選項(xiàng)使得vim重新打開(kāi)一個(gè)文件時(shí)仍然能夠撤銷(xiāo)之前的編輯(undo),還會(huì)保留一個(gè)編輯歷史的文件(undofile)
這個(gè)時(shí)候當(dāng)前目錄下會(huì)出現(xiàn)針對(duì)編輯后文件的些~結(jié)尾的備份文件和.開(kāi)頭的undo文件
這里通常只保留撤銷(xiāo)文件的功能,有了跨會(huì)話(huà)撤銷(xiāo)的能力,基本備份的功能就用不到了,將撤銷(xiāo)的文件放在個(gè)人用戶(hù)目錄下,保證文件的安全和目錄的干凈。
set nobackup
set undodir=~/.vim/undodirset undodir=~\vimfiles\undodir "windos下的形態(tài),目錄符合和unix有差異
為了保證目錄存在,可以再增加如下判斷:
if !isdirectory(&undodir)call mkdir(&undodir, 'p' , 0700)
endif
&undodir是之前設(shè)置的undodir值,mkdir括號(hào)內(nèi)部指定mkdir的命令選項(xiàng) 和 目錄權(quán)限
2.3.2 vim中支持鼠標(biāo)
我們正常使用vim的過(guò)程中,看代碼肯定比寫(xiě)代碼要多, 所以這個(gè)時(shí)候鼠標(biāo)還是比較有必要存在的。而且鼠標(biāo)在非線(xiàn)性跳轉(zhuǎn)上比鍵盤(pán)快很多。
我們?cè)趘im中對(duì)鼠標(biāo)的需求是:
- vim內(nèi)部使用鼠標(biāo)通過(guò)可視模式(visual)選擇內(nèi)容,且僅在vim內(nèi)部使用
- 通過(guò)將vim內(nèi)部的可視模式選擇的文本和外部操作系統(tǒng)進(jìn)行編輯交互(在vim內(nèi)部鼠標(biāo)選擇后復(fù)制,粘貼到外部系統(tǒng)軟件之中)
所以針對(duì)以上兩種的使用需求,vim都需要能夠支持:
if has('mouse')if has('gui_running') || (&term =~ 'xterm' && !has('mac'))set mouse=aelseset mouse=nviendif
endif
3. vim 常用命令 – 應(yīng)對(duì)稍復(fù)雜任務(wù)
3.1 光標(biāo)移動(dòng)
-
基本移動(dòng) :上、下、左、右 –
k,j,h,l; 缺陷是這四個(gè)鍵不能在插入模式下移動(dòng) -
跳轉(zhuǎn)行首:
0, 跳轉(zhuǎn)行尾:$, 跳轉(zhuǎn)到行首到第一個(gè)非空白字符: ^ -
一次移動(dòng)超過(guò)一個(gè)字符:
b/w,B/W
以上含義分別是:words backward, words forward,用來(lái)向后或者向前跳轉(zhuǎn)一個(gè)單詞。大寫(xiě)跳轉(zhuǎn)和小寫(xiě)跳轉(zhuǎn)的唯一區(qū)別就是小寫(xiě)和編程語(yǔ)言的標(biāo)識(shí)符類(lèi)似,認(rèn)為一個(gè)單詞的組成是由字母,數(shù)字和下劃線(xiàn)組成;而大寫(xiě)則認(rèn)為非空格字符都是單詞。 -
根據(jù)單個(gè)字符進(jìn)行選擇:
f/t,F/T
以上含義是:找到下一個(gè)緊接著輸入的字符(如果輸入f/t,F/T之前加上數(shù)字n,那就是下面第n個(gè)),比如找到當(dāng)前行的第二個(gè)d字符,輸入f2d即可。兩者的區(qū)別是f會(huì)包含這個(gè)字符,t不包含這個(gè)字符。大寫(xiě)的F/T則是進(jìn)行反方向的搜索。比如下面字符串
*nc = (struct mg_connection *) data;,光標(biāo)在括號(hào)內(nèi)的第一個(gè)字符s的位置,我想一次刪除括號(hào)內(nèi)所有內(nèi)容,如果不用f/t的話(huà)需要仔細(xì)考慮w的匹配規(guī)則,最后使用c3w,而現(xiàn)在我們只需要使用ct)直接匹配)就可以。 -
文章內(nèi)移動(dòng):
(和)分別是移動(dòng)到上一句和下一句;{和}分別是移動(dòng)到上一段和下一段 -
開(kāi)頭和結(jié)尾跳轉(zhuǎn):
ctrl - Home和ctrl - End跳轉(zhuǎn)到文件的開(kāi)頭和結(jié)尾;gg和G也是分別跳轉(zhuǎn)到文件到開(kāi)頭和結(jié)尾。
只不過(guò)G這里的區(qū)別是跳轉(zhuǎn)到最后一行的第一個(gè)字符,不是最后一個(gè)字符
3.2 文本修改
Vim的基本教程中我們知道c(change),d(delete),i(insert)都能夠?qū)ξ谋具M(jìn)行修改,vim的原則是常用的功能要盡可能按鍵少。因此很多常用的功能在vim中都會(huì)有不同的按鍵,而且大寫(xiě)鍵也會(huì)相應(yīng)得重載相近但稍不同的含義(最后一個(gè)字符的包含與不包含這樣的區(qū)別)。
d加動(dòng)作進(jìn)行刪除:dd刪除整行,D相當(dāng)于d$刪除到行尾c加動(dòng)作進(jìn)行修改:cc修改整行,C相當(dāng)于c$刪除到行尾并進(jìn)行插入s相當(dāng)于cl,向右刪除一個(gè)字符并進(jìn)入插入模式,S相當(dāng)于cc,替換整行i在當(dāng)前字符前進(jìn)入插入模式;I則相當(dāng)于^i把光標(biāo)移動(dòng)到行首非空白字符,進(jìn)入插入模式a在當(dāng)前光標(biāo)所在字符后面進(jìn)入插入模式,A相當(dāng)于$a,把光標(biāo)移動(dòng)到末尾,然后進(jìn)入插入模式o在當(dāng)前行下方插入一個(gè)新行,然后在新行進(jìn)入插入模式;O在當(dāng)前行上方插入一個(gè)新行,并進(jìn)入插入模式r替換光標(biāo)下的字符;R進(jìn)入替換模式,每次按鍵替換一個(gè)字符,直到按下ESC退出替換模式u撤銷(xiāo)最近的一個(gè)動(dòng)作;U撤銷(xiāo)當(dāng)前行的所有修改
這一些按鍵基本能夠讓大部分的編輯任務(wù)在一兩個(gè)按鍵就能完成,不過(guò)需要長(zhǎng)期練習(xí),形成肌肉記憶 。
3.3 文本對(duì)象選擇
這個(gè)功能非常適合程序中的邏輯塊編輯,方便我們?cè)谝话隳J较聦?duì)程序代碼或者文件進(jìn)行隨意自如的修改。
基礎(chǔ)鍵的命令c,,d 是用來(lái)對(duì)文本內(nèi)容進(jìn)行修改,而像a,i,w 這樣的能鍵能夠附加到基礎(chǔ)操作命令之后,對(duì)一段文本進(jìn)行快速修改操作。
針對(duì)文本"coding boy = z_stand" 的修改利用如上鍵可以有如下組合策略。假設(shè)光標(biāo)停在coding 的d上
dwdelete word, 刪除ding,結(jié)果是"co boy = z_stand"diwdelete inside word, 刪除coding,結(jié)果是" boy = z_stand"dawdelete a word,刪除coding, 還有一個(gè)空格。 結(jié)果是"boy = z_stand"diW刪除"coding,結(jié)果是boy = z_stand"daA刪除"coding還有一個(gè)空格。結(jié)果是boy = z_stand"di"刪除coding boy = z_stand結(jié)果是""da"刪除"coding boy = z_stand",字符串包括雙引號(hào)被全部刪除
這個(gè)操作后面加"或者其他的字符,比如(,則會(huì)刪除與其匹配的)內(nèi)部所有的內(nèi)容
以上介紹的是d操作,同樣的基礎(chǔ)鍵還可以用c進(jìn)行,只不過(guò)d是執(zhí)行完成刪除操作之后vim還是一般模式,而c是執(zhí)行了之后進(jìn)入插入模式。
同時(shí)像如下的幾個(gè)鍵也能夠支持文本對(duì)象的選擇,可以像d和c一樣搭配a,i,w,單引號(hào),雙引號(hào),左右括號(hào)等
- 搭配
s(sentence)對(duì)句子進(jìn)行操作 – 適合英文文本編輯 - 搭配
p(paragraph) 對(duì)段落進(jìn)行操作 – 適合英文文本編輯,以及帶空行的代碼編輯 - 搭配
t(tag) 對(duì)HTML/XML 標(biāo)簽進(jìn)行操作 – 適合HTML, XML等代碼編輯 - 搭配`和’,對(duì)shell或者python等腳本代碼進(jìn)行操作
- 搭配
[和]方括號(hào),對(duì)括號(hào)里面的內(nèi)容進(jìn)行操作 - 搭配
{和}大括號(hào),對(duì)括號(hào)內(nèi)容進(jìn)行操作 – 適合C/C++語(yǔ)言 - 搭配
<和>角括號(hào) – 適合C++ 模版操作
再進(jìn)一步,在a和i之前能夠增加數(shù)字,表示操作多少個(gè)文本對(duì)象,適合針對(duì)嵌套文本的操作
比如
3.4 文本移動(dòng) – 更快
<C-B>向上翻頁(yè)<C-F>向下翻頁(yè)<C-U>向上翻半頁(yè)<C-D>向下翻半頁(yè)5G跳轉(zhuǎn)到第五行6l跳轉(zhuǎn)到第六列H,M,L當(dāng)前屏幕下,分別移動(dòng)光標(biāo)到屏幕頂部,中間,底部<C-Y>和<C-E>保持光標(biāo)不動(dòng),滾動(dòng)屏幕,ctrl-y向上,ctrl-e向下zt將光標(biāo)所在行滾動(dòng)到屏幕頂部,zz將光標(biāo)所在行滾動(dòng)到屏幕中部,zb將光標(biāo)所在行滾動(dòng)到屏幕底部
3.5 重復(fù)操作
;重復(fù)最近的字符查找f或者t操作,重復(fù)最近的字符查找, 反方向n重復(fù)最近的字符串查找操作(/和? 查找模式)N重復(fù)最近的字符串查找操作(/和?)反方向查找.重復(fù)執(zhí)行最近的修改操作
4. vim 的簡(jiǎn)單定制
通過(guò)對(duì)vim目錄,配置文件,擴(kuò)展包管理器的一些介紹來(lái)讓大家能夠初步配置自己的vim
4.1 vim 的目錄結(jié)構(gòu)
vim的工作環(huán)境是通過(guò)運(yùn)行支持的vim插件來(lái)設(shè)定的,合理得定制自己的vim需要了解vim的目錄構(gòu)造,知道怎么快捷得找到這一些存放插件的位置。
在vim8.2版本下,不同平臺(tái)安裝vim的位置有差異:
- unix 下面
/usr/share/vim/vim82 - mac下的MacVim 運(yùn)行時(shí)軟件位置
/Applications/MacVim.app/Contents/Resources/vim/runtime
能夠看到很多子目錄,如autoload,colors,doc等
最常用的是如下幾個(gè)目錄: syntaxvim 的語(yǔ)法加亮文件docvim 的幫助文件colorsvim 主題配色方案pluginvim的插件文件
以syntax目錄 為例,MacVim支持619種語(yǔ)法高亮格式,.vim之前的內(nèi)容就是支持的語(yǔ)言語(yǔ)法。
在一般模式下可以通過(guò):setfiletype cpp來(lái)指定cpp文件的語(yǔ)法高亮。
同時(shí)一般模式下輸入:help顯示的幫助信息都在doc目錄之下;通過(guò):colorscheme 加tab鍵能夠看到很多種不同的配色主題,這一些主題配色都會(huì)在color目錄之下。
可以在.vimrc配置中加入一行 color desert ,指定每次啟動(dòng)vim加載的配色方案
接下來(lái)重點(diǎn)看一插件plugin目錄,能夠在原生vim下支持無(wú)數(shù)便捷的插件接入,這也是為什么vim被成為編輯器之神的原因。像我們?cè)?code>clion,vscode,sublime中體驗(yàn)到的便捷特性(代碼補(bǔ)全,源碼閱讀時(shí)的跳轉(zhuǎn),代碼調(diào)試等)都能夠在vim中通過(guò)插件得到配置,而且我們能夠?qū)⒖旖萱I通過(guò)vim script的map減少來(lái)進(jìn)一步加快編輯操作,以上是一些可以擴(kuò)展的插件,而plugin目錄下的插件則是系統(tǒng)內(nèi)置的插件,分別具有如下功能:
getscriptPlugin.vim獲得最新的vim腳本插件gzip.vim編輯.gz結(jié)尾的壓縮文件,打開(kāi)時(shí)能夠自動(dòng)解壓縮,保存為.gz結(jié)尾的文件時(shí)自動(dòng)壓縮logiPat.vim模式匹配的邏輯運(yùn)算符,允許以非標(biāo)準(zhǔn)正則表達(dá)式來(lái)寫(xiě)模式匹配manpager使用vim來(lái)查看man幫助文檔matchparen.vim對(duì)括號(hào)進(jìn)行高亮匹配netrwPlugin.vim從網(wǎng)絡(luò)上編輯文件和瀏覽目錄(支持多種協(xié)議如ftp和scp,可以直接打開(kāi)目錄來(lái)選擇文件)rrhelper.vim支持--remote-wait編輯,vim的多服務(wù)器會(huì)用到這一個(gè)功能spellfile.vim在拼寫(xiě)文件缺失時(shí)自動(dòng)下載,vim一般只安裝了英文的拼寫(xiě)軟件tarPlugin.vim支持編輯(壓縮).tar結(jié)尾的壓縮文件,這里和.gz不同的是不支持寫(xiě)入tohtml.vim把語(yǔ)法加亮的結(jié)果轉(zhuǎn)成htmlvimballPlugin.vim創(chuàng)建和解壓.vba文件zipPlugin.vim和.gz類(lèi)似,支持讀和寫(xiě).zip結(jié)尾的壓縮文件
這幾個(gè)簡(jiǎn)單的默認(rèn)配置插件已經(jīng)能夠體現(xiàn)出了一部分vim的強(qiáng)大之處,簡(jiǎn)單演示部分插件功能如下:
4.2 vim 軟件包
vim 的目錄有點(diǎn)傳統(tǒng)的unix格式,一個(gè)功能(插件plugin)會(huì)分散在多個(gè)不同的目錄下
- 插件的主題通常會(huì)在plugin目錄下
- 插件的幫助文檔會(huì)在doc目錄下
- 有一些插件只對(duì)某一些文件類(lèi)型有效,會(huì)有文件放在ftplugin目錄下
- 有一些插件會(huì)有自己的文件類(lèi)型檢測(cè)規(guī)則,會(huì)有文件放在ftdetect目錄下
- 有一些插件有特殊的語(yǔ)法加亮,會(huì)有文件放在sytax目錄下
我再mac上是使用vim-plug作為自己的包管理器,其他的vandle或者minpac都是可以的。
-
下載:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -
使用 plug對(duì)插件進(jìn)行管理
安裝上vim-plug之后就可以在vim的配置文件中增加自己想要的插件,mac下的vim配置在~/.vimrc,windows可以通過(guò)打開(kāi)vim輸入:e \_vimrc打開(kāi)自己的vim配置文件。插件的安裝設(shè)置需要遵循如下語(yǔ)法,在
plug#begin和plug#end之間就是我們要安裝的插件,具體的插件需要通過(guò)Plug+ 插件名稱(chēng)來(lái)指定安裝的插件:這里需要注意的是闊行內(nèi)的內(nèi)容是插件下載之后的存放目錄,可以自己指定,也可以按照下文中的目錄存放。
call plug#begin('~/.vim/plugged') Plug 'mzlogin/vim-markdown-toc', { 'for': ['gitignore', 'markdown', 'vim-plug'] } Plug 'vimwiki/vimwiki' Plug 'terryma/vim-multiple-cursors' Plug 'junegunn/goyo.vim' " distraction free writing mode call plug#end()然后再保存配置文件,在vim中輸入
:PlugInstall命令就可以直接安裝對(duì)應(yīng)的插件了
當(dāng)然,還可以直接對(duì)插件進(jìn)行更新,或者清理不需要的插件,這一些命令可以通過(guò):Plug按tab鍵自動(dòng)補(bǔ)全。整個(gè)vim的插件管理就變得非常方便了。
5. vim 的復(fù)制與粘貼
對(duì)于命令行形式的vim,想要將外界復(fù)制的內(nèi)容粘貼到 vim 的文本之中,需要有如下幾步:
- 使用 vim 打開(kāi)一個(gè)文件,進(jìn)入 vim 的一般模式下
- 通過(guò)一般模式的 跳轉(zhuǎn)命令,將光標(biāo)移動(dòng)到需要粘貼的行以及列處
- 輸入
i或者a等插入命令進(jìn)入vim的插入模式 - 通過(guò)鍵盤(pán)
<ctrl-c>,粘貼到當(dāng)前位置 - ESC回到一般模式,ZZ存盤(pán)退出
如果不退出vim的話(huà)則還需要通過(guò)如下兩步
- 打開(kāi)vim進(jìn)入一般模式,通過(guò)
:e file打開(kāi)一個(gè)文件;可以使用<C-D>查看有哪一些文件,通過(guò)tab選擇文件并自動(dòng)補(bǔ)全 - 存盤(pán)則通過(guò):
:w
但是如果粘貼內(nèi)容含有縮進(jìn),而vim又不夠新的情況,還會(huì)出現(xiàn)縮進(jìn)之間在“打架”的情況,導(dǎo)致整個(gè)復(fù)制縮進(jìn)一直基于上一個(gè)縮進(jìn)的基礎(chǔ)上在縮進(jìn)。這個(gè)情況是因?yàn)関im分不清用戶(hù)是在輸入,還是在粘貼,輸入此時(shí)會(huì)和粘貼沖突,則會(huì)有智能縮進(jìn)、制表符轉(zhuǎn)換等功能。
這個(gè)可以通過(guò) :set paste 命令來(lái)讓vim知道當(dāng)前文件執(zhí)行的是粘貼的命令,從而不會(huì)被智能縮進(jìn)和制表符轉(zhuǎn)換的功能影響。
6. vim的模式匹配:正則表達(dá)式
6.1 基本的特殊字符
我們?cè)趘im的一般模式中經(jīng)常需要用到模式匹配或者查找命令,通過(guò)/,?或者進(jìn)入vim的命令模式: 進(jìn)行匹配操作。
vim中的正則表達(dá)式和其他常用正則表達(dá)式是有一些區(qū)別的,這里先簡(jiǎn)單介紹一下vim中的一些正則表達(dá)式的基礎(chǔ),在一個(gè)搜索表達(dá)式里面有如下字符,., [],*, $,^, ~, \ 都是具有特殊含義的字符
.可以匹配除換行符外的任何字符,如a.可以匹配aa,ab等*表示之前的匹配源可以重復(fù)0次到多次,比如aa*可以匹配a,aa,aaa等,a.*可以匹配a,ab,abc等,但是兩者都不能匹配b^匹配一行等開(kāi)頭,如果出現(xiàn)在模式的開(kāi)頭的話(huà);如果在模式的其他位置,則表示字符本身$匹配一行的結(jié)尾,如果出現(xiàn)在模式的結(jié)尾的話(huà);在其他位置則表示字符本身~匹配上一次替換的字符,如果上一次把abc替換為了ate,那么~就匹配ate[...]匹配方括號(hào)內(nèi)任意一個(gè)字符;方括號(hào)內(nèi)如果第一個(gè)字符是^,表示對(duì)結(jié)果取反;除開(kāi)頭之外的-表示范圍:如[A-Za-z]表示任意一個(gè)拉丁字母,[^+-*/]表示除了+,-,*,/之外的任意一個(gè)字符。\的含義取決于下一個(gè)字符,在大部分情況下包括上面的這幾個(gè)(.,[,],*,$,^,~,\) ,代表后面這個(gè)字符本身;在跟某一些字符時(shí)有特殊含義。
除此之外就是普通的字符,并沒(méi)有特別的含義;需要注意的是如果想要將搜索字符/作為普通字符來(lái)使用,則需要\/ 這樣,否則vim看到的/就會(huì)以為模式結(jié)束了,導(dǎo)致錯(cuò)誤發(fā)生。
如果模式中使用"/"作為路徑的分隔符,在替換命令中可以使用使用其他模式中沒(méi)有的符號(hào)作為分隔符。比如想把路徑/path/
全部替換為/paths/ ,建議不要用:%s/\/path\//\/paths\//g ,這種樣子非常容易出錯(cuò)。而應(yīng)該使用類(lèi)似的寫(xiě)法:%s!/path/!/paths/!g,當(dāng)然這個(gè)只能用于替換命令。如果想要使用/作為搜索命令的話(huà)就沒(méi)有太好的辦法了,只能使用\/這樣的形態(tài)。
6.2 特殊模式項(xiàng)
通過(guò)\開(kāi)始的特殊表達(dá)式很多,如果我們想要全部了解的話(huà)可以通過(guò)help pattern-overview來(lái)詳細(xì)查看,這里僅僅列舉幾個(gè)基本的特殊模式項(xiàng):
\?表示之前的匹配重復(fù)零次 或一次: 如aa\?可以匹配"a", “aa”, 但不能完整匹配"aaa"(可以匹配前兩個(gè)字符,后兩個(gè)或最后一個(gè)字符)\+表示之前的匹配原重復(fù)一次或多次:如aa\+可以匹配"aa",“aaa”, 但不能匹配"a"或"b"\{n,m}表示之前的匹配原重復(fù)n到m遍之間。如:a\{3}可以匹配3個(gè)"a":“aaa”;a\{,3}表示最多匹配3個(gè)"a", 支持匹配"", “a”, “aa"和"aaa”;大括號(hào)內(nèi)兩個(gè)數(shù)字都省略時(shí)等價(jià)于*, 也就是之前的內(nèi)容可以匹配0次或多次。\(和\)擴(kuò)起一個(gè)模式, 從而組成單個(gè)匹配原:如\(foo\)\?可以表示單詞foo出現(xiàn)零次或一次。\&是分支內(nèi)多個(gè)臨接的分隔符,類(lèi)似于“與”操作,表示每一項(xiàng)都要匹配成功,然后去最后一項(xiàng)的返回結(jié)果:如.*foo.*\&.*bar.*匹配同時(shí)出現(xiàn)foo和bar的完整行。\|是多個(gè)分支的分隔符,類(lèi)似于“或”的匹配,表示任意一項(xiàng)匹配成功即可:如foo\|bar可匹配foo或bar兩個(gè)單詞之一。
還有13個(gè)特殊模式項(xiàng):
\<匹配單詞的開(kāi)頭\>匹配單詞的結(jié)尾\s匹配空白字符\S匹配非空白字符\d匹配數(shù)字,相當(dāng)于[0-9]\D匹配非數(shù)字,相當(dāng)于[^0-9]\x匹配十六進(jìn)制數(shù)字,相當(dāng)于[0-9A-Fa-f]\w匹配單詞字符,相當(dāng)于[^0-9A-Za-z_]W匹配非單詞字符\h單詞首字符:[A-Za-z_]\H非單詞首字符:[^A-Za-z_]\a英文字母字符:[A-Za-z]\A非英文字母字符:[^A-Za-z]\l小寫(xiě)字符:[a-z]\L非小寫(xiě)字符:[^a-z]\u大寫(xiě)字符:[A-Z]\U非大寫(xiě)字符[^A-Z]\_其中 x 可以是以上任意一個(gè)字符: 對(duì)應(yīng)字符類(lèi)加上換行
6.3 一些搜索舉例
-
想要準(zhǔn)確匹配一個(gè)函數(shù)名:
/ \<function_name\>
或者將光標(biāo)移動(dòng)到想要匹配的關(guān)鍵字上面,按下*,vim就會(huì)自動(dòng)提取光標(biāo)下的關(guān)鍵字,并自動(dòng)添加\<和\>進(jìn)行搜索。 -
如上代碼片段,我想要搜索
ReoportError或者void,那么就想到了上面特殊模式中斷\|字符輸入
/\<ReportError\>\|\<void\>即可
6.3.1 最長(zhǎng)匹配和最短匹配
這里有一個(gè)問(wèn)題就是我們想要搜索的內(nèi)容中有很多特殊字符,整個(gè)模式會(huì)變得極其復(fù)雜。
而像*,\?,\+和\{}都屬于最長(zhǎng)匹配(貪婪匹配),即模式 既可以匹配一個(gè)較長(zhǎng)的字符串,也可以匹配一個(gè)較短的字符串的時(shí)候結(jié)果會(huì)是那個(gè)比較長(zhǎng)的字符串。
相應(yīng)的也會(huì)有一個(gè)最短匹配,同時(shí)匹配較長(zhǎng)和較短字符是會(huì)產(chǎn)生較短匹配。在vim里面,最短匹配只有一種形式,{-n,m},起意義和之前說(shuō)得{n,m}相同( \{n,m} 表示之前的匹配原重復(fù)n到m遍之間),但結(jié)果是較短而非較長(zhǎng)的字符串。
以HTML 標(biāo)簽匹配為例,使用最短匹配的話(huà),可以把模式寫(xiě)成/<.\{-1,}>,表示要求模式匹配的結(jié)果在一對(duì)尖括號(hào)里面且至少有一個(gè)字符,但越短越好。
6.3.2 搜索加亮和取消
如果也有在做上面但實(shí)驗(yàn),會(huì)發(fā)現(xiàn)vim在搜索的過(guò)程中默認(rèn)會(huì)將模式匹配的內(nèi)容高亮,這個(gè)對(duì)確認(rèn)自己的搜索結(jié)果是否正確非常重要。
但是如果你是用了非原生vim,比如某一個(gè)IDE的插件,那么就會(huì)發(fā)現(xiàn)并不是默認(rèn)高亮。
而有的時(shí)候又覺(jué)得高亮太刺眼,想要去掉,這個(gè)時(shí)候vim就提供了比較方便的指令:nohlsearch或者:nohls
想要恢復(fù)高亮,則可以:set hlsearch或者:set hls
如果這兩個(gè)取消和恢復(fù)高亮的指令使用非常頻繁,則可以設(shè)置map鍵
noremap <LEADER><CR> :nohlsearch<CR> 我這里設(shè)置的是直接按LEADER鍵,我的LEADER鍵設(shè)置的是let mapleader=" "空格
6.3.3 正則表達(dá)式替換
替換我們正常理解就是利用之前提到的一些模式匹配特殊字符來(lái)完成,將一個(gè)字符串替換為另一個(gè)字符串。但是很多替換場(chǎng)景還是非常復(fù)雜的。
- 可能要保留匹配中的某一些字符,而替換另外一些字符
- 要對(duì)匹配出來(lái)的內(nèi)容做大小寫(xiě)轉(zhuǎn)換
- 可能需要 “計(jì)算” 出替換結(jié)果
- 可能要決定一行里面替換單次還是多次,是自動(dòng)替換還是要 – 確認(rèn) ,等等。
接下來(lái)看看具體的操作
-
在替換結(jié)果中保留匹配出的字符
之前我們說(shuō)到\(\)特殊模式 除了將一個(gè)模式轉(zhuǎn)變成匹配原之外,還有一個(gè)捕捉匹配的內(nèi)容的作用。
按照\(的出現(xiàn)順序依次編號(hào)為1到9,并可以在模式和替換字符串中用\1到\9來(lái)訪問(wèn)。如果要在替換字符串中完整使用匹配內(nèi)容的話(huà),則可以使用\0或&(字符 “&” 也因此要在替換字符串中寫(xiě)成\&)如果我想要找出作為函數(shù)調(diào)用的
WebSocket,那我可以寫(xiě)成\<WebSocket(,雖然(不是想要匹配的內(nèi)容,但它是函數(shù)名稱(chēng)的一部分。從替換的角度來(lái)看需要多處理一下這個(gè)字符;在非匹配的內(nèi)容比較復(fù)雜或者變化的時(shí)候,這個(gè)過(guò)程尤為麻煩。
所以vim 里還有專(zhuān)門(mén)匹配開(kāi)始和結(jié)束的匹配原,分別是\zs和\ze對(duì)于上面函數(shù)調(diào)用的這個(gè)例子,搜索模式就應(yīng)該是
\<WebSocket\ze(,當(dāng)然這個(gè)模式也可以匹配為\<WebSocket(\&WebSocket或者\<WebSocket(\&...。 -
大小寫(xiě)轉(zhuǎn)換的特殊替換字符串
\U把下面的字符串轉(zhuǎn)變成大寫(xiě),直到\E出現(xiàn)
\u把下一個(gè)字符變成大寫(xiě)
\L把下面的字符變成小寫(xiě),直到\E出現(xiàn)
\l把下一個(gè)字符變成小寫(xiě)
\E結(jié)束大小寫(xiě)轉(zhuǎn)換
\=開(kāi)始一個(gè)返回字符串的表達(dá)式,用來(lái)計(jì)算出一個(gè)替換的結(jié)果和其他的編程語(yǔ)言一樣,vim的正則表達(dá)式中支持
\t,\r,\n等特殊轉(zhuǎn)義字符,但在替換表達(dá)式中,\n插入的是空字符(NULL或\0),而非在模式中正常的行尾符LF。如果想要插入行尾符的話(huà)我們需要使用\r。這意味著把一個(gè)回車(chē)變成兩個(gè),需要通過(guò):s/\n/\r\r/這樣尷尬的方式來(lái)實(shí)現(xiàn)。
如果我們要插入CR(回車(chē))的話(huà),需要輸入\<C-V><CR>才行。
6.3.4 替換實(shí)例
-
刪除行尾注釋
:%s!\s*//.*$!!
把零到多個(gè)空白字符后面出現(xiàn)的"//" 直到行尾全部刪除,!這個(gè)表示分隔符,是為了簡(jiǎn)化模式,否則就需要通過(guò)\/來(lái)不斷轉(zhuǎn)義 -
刪除
/**/注釋
這個(gè)實(shí)現(xiàn)就非常復(fù)雜了,首先匹配內(nèi)容可以跨行;其次,有跟HTML標(biāo)簽類(lèi)似的問(wèn)題(注釋內(nèi)部可能有多個(gè)/**/),需要使用最短匹配。
通過(guò)如下來(lái)實(shí)現(xiàn)
:%s!/\*\_.\{-}\*/!!g因?yàn)橐恍兄锌赡苡卸鄠€(gè)
/**/,結(jié)尾通過(guò)g表示允許一行內(nèi)部持續(xù)多次替換。
后續(xù)會(huì)持續(xù)分享vim的更高級(jí)操作,包括鍵盤(pán)宏,vim的插件,以及如何編寫(xiě)vim script來(lái)讓自己的指尖 有效得 飛得更快。
總結(jié)
以上是生活随笔為你收集整理的vim 成“神“之路 (一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 试管婴儿哪个国家做的好啊
- 下一篇: 设计模式 之美 -- 策略模式