日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

vim 成“神“之路 (一)

發(fā)布時(shí)間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vim 成“神“之路 (一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 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-gtk3vim-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版本的支持。

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 + DTab鍵將命令補(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)

  1. 基本移動(dòng) :上、下、左、右 – k,j,h,l; 缺陷是這四個(gè)鍵不能在插入模式下移動(dòng)

  2. 跳轉(zhuǎn)行首:0, 跳轉(zhuǎn)行尾: $, 跳轉(zhuǎn)到行首到第一個(gè)非空白字符: ^

  3. 一次移動(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)為非空格字符都是單詞。

  4. 根據(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)直接匹配)就可以。

  5. 文章內(nèi)移動(dòng):() 分別是移動(dòng)到上一句和下一句;{}分別是移動(dòng)到上一段和下一段

  6. 開(kāi)頭和結(jié)尾跳轉(zhuǎn):ctrl - Homectrl - End 跳轉(zhuǎn)到文件的開(kāi)頭和結(jié)尾;ggG 也是分別跳轉(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ū)別)。

  1. d 加動(dòng)作進(jìn)行刪除: dd刪除整行,D相當(dāng)于d$刪除到行尾
  2. c 加動(dòng)作進(jìn)行修改: cc修改整行,C相當(dāng)于c$刪除到行尾并進(jìn)行插入
  3. s 相當(dāng)于cl,向右刪除一個(gè)字符并進(jìn)入插入模式,S相當(dāng)于cc,替換整行
  4. i 在當(dāng)前字符前進(jìn)入插入模式;I則相當(dāng)于^i把光標(biāo)移動(dòng)到行首非空白字符,進(jìn)入插入模式
  5. a 在當(dāng)前光標(biāo)所在字符后面進(jìn)入插入模式,A相當(dāng)于$a,把光標(biāo)移動(dòng)到末尾,然后進(jìn)入插入模式
  6. o 在當(dāng)前行下方插入一個(gè)新行,然后在新行進(jìn)入插入模式;O在當(dāng)前行上方插入一個(gè)新行,并進(jìn)入插入模式
  7. r 替換光標(biāo)下的字符; R進(jìn)入替換模式,每次按鍵替換一個(gè)字符,直到按下ESC退出替換模式
  8. 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上

  1. dw delete word, 刪除ding,結(jié)果是"co boy = z_stand"
  2. diw delete inside word, 刪除coding,結(jié)果是" boy = z_stand"
  3. daw delete a word,刪除coding, 還有一個(gè)空格。 結(jié)果是"boy = z_stand"
  4. diW 刪除"coding ,結(jié)果是boy = z_stand"
  5. daA 刪除"coding 還有一個(gè)空格。結(jié)果是boy = z_stand"
  6. di" 刪除coding boy = z_stand 結(jié)果是""
  7. 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ì)象的選擇,可以像dc一樣搭配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)一步,在ai之前能夠增加數(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)到第六列
  • HM, 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
    能夠看到很多子目錄,如autoloadcolorsdoc

    最常用的是如下幾個(gè)目錄:
  • syntax vim 的語(yǔ)法加亮文件
  • doc vim 的幫助文件
  • colors vim 主題配色方案
  • plugin vim的插件文件

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)成html
  • vimballPlugin.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#beginplug#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, ababc等,但是兩者都不能匹配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可匹配foobar兩個(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 一些搜索舉例

  1. 想要準(zhǔn)確匹配一個(gè)函數(shù)名:/ \<function_name\>

    或者將光標(biāo)移動(dòng)到想要匹配的關(guān)鍵字上面,按下*,vim就會(huì)自動(dòng)提取光標(biāo)下的關(guān)鍵字,并自動(dòng)添加\<\>進(jìn)行搜索。

  2. 如上代碼片段,我想要搜索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)看看具體的操作

  1. 在替換結(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(\&...

  2. 大小寫(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。