這不是一篇vim命令的集合,也不是一篇vim插件的推薦,是在什么插件都不裝的前提下看看運(yùn)用vim的思想和技巧到底能解決什么,再去思索我需要裝什么插件來(lái)做到光靠原生vim做不到的事情
思想
一.點(diǎn)命令
? 1. 點(diǎn)命令可以重復(fù)上次修改,上一次修改可以是x,dd等在普通模式下的命令,也可以是進(jìn)入插入模式直至返回普通模式的一系列操作
二.不要自我重復(fù)
? 假如你要給當(dāng)前行以后的15行的末尾都添加分號(hào)
- 方法一: 按
A;<Esc>,然后按j和A;<Esc>一直重復(fù)呢,或許可以達(dá)到效果,但是卻已經(jīng)陷入自我重復(fù)了,就像寫很多相似的代碼的時(shí)候一樣需要思索一下了 - 方法二:按
A;<Esc>,然后按j和.,前面第一點(diǎn)說(shuō)了,點(diǎn)命令可以重復(fù)上一次的修改,這里的上一次修改就是A;<Esc>,所以按j和.就可以實(shí)現(xiàn)我們想要的效果,這個(gè)操作也是理想的編輯模式,即一次按鍵移動(dòng)j,另一次按鍵操作.
三.一次修改的粒度
- 我們很多時(shí)候需要撤銷我們輸入的內(nèi)容,會(huì)按
u鍵來(lái)撤銷 - 假如我們這次插入模式輸入的已經(jīng)有十行了,也許你只想撤銷第十行的內(nèi)容,這時(shí)你按
<Esc>和u,你會(huì)發(fā)現(xiàn)十行全部被撤銷了,這就是一次修改的粒度過(guò)大了,這和vscode中的不一樣,每次<command-z>只會(huì)撤銷一行的內(nèi)容,所以在vim中我們需要自己控制好上一次修改的粒度,每次思索代碼沒(méi)有輸入的時(shí)候可以按<Esc>退回到普通模式,可以實(shí)現(xiàn)修改粒度的切分
四.只要可能,就用操作符命令,而不是可視模式
-
import React, { FC, useMemo, useEffect } from 'react'比如你想刪除這里的第一個(gè)單詞import,方式一可以用daw實(shí)現(xiàn),方式二用vaw和d。在其他編輯器的模式下我們通常會(huì)選擇方式二,即先選擇區(qū)域再做操作,但是vim中可以先選擇操作再選擇范圍選擇方式一的好處就是可以使用.命令,可以繼續(xù)刪除下一個(gè)單詞,但是使用方式二的可視模式的話,你會(huì)發(fā)現(xiàn)它只是每次都刪除7個(gè)字符,因?yàn)榈谝淮蔚?code>vaw和d操作的是import加一個(gè)空格
小眾模式
一.操作符待決模式
- 你也許知道vim中有四種模式:普通模式,插入模式,可視模式,命令行模式,但還有操作符待決模式
-
vim中有一條額外的規(guī)則,當(dāng)一個(gè)操作符命令被連續(xù)調(diào)用兩次時(shí),它會(huì)作用于當(dāng)前行 - 什么是操作符待決模式,
d是刪除的操作符,<是減少縮進(jìn)的操作符,可是我們按dd才是刪除一行,<<才是減少縮進(jìn)一行,其實(shí)我們?cè)诎聪碌谝粋€(gè)d的時(shí)候進(jìn)入了一個(gè)操作符待決模式,只是這個(gè)模式是個(gè)短暫的存在,直到接收到我們下一個(gè)動(dòng)作命令,才完成整個(gè)操作,比如dd,第一個(gè)d是是操作符,第二個(gè)d時(shí)說(shuō)要?jiǎng)h除整行,所以同理cc就是刪除整行并插入,yy就是復(fù)制整行,dap,就是刪除整個(gè)段落,gUap就是將整個(gè)段落大寫 - 可以將操作符和查找動(dòng)作結(jié)合起來(lái)使用
d/staff<cr>可以刪除從當(dāng)前光標(biāo)到staff前面的內(nèi)容 - 可以將操作符待決模式和文本對(duì)象結(jié)合起來(lái),在操作符待決模式中,
i不再是切換到插入模式并將光標(biāo)置于字符前,a也不是將光標(biāo)置于字符后,而是當(dāng)作文本對(duì)象的組成部分。因?yàn)?code>aw會(huì)刪除當(dāng)前單詞加一個(gè)空格,iw只刪除當(dāng)前單詞的特性,c命令適合和iw等配合,d命令則適合和aw等配合 - 很多命令都是兩個(gè)或更多按鍵,比如
<C-w> s會(huì)水平切分此窗口,但是<C-w>只是第二個(gè)按鍵的前綴,可以當(dāng)作命名空間,但是他們并不會(huì)激活操作符待決模式,因?yàn)橹挥胁僮鞣艜?huì)激活操作符待決模式
二. 插入-普通模式
1.有時(shí)候會(huì)在插入模式的情況下想使用普通模式的命令,可以不需要按<Esc>, <C-o> 切換到插入-普通模式,當(dāng)在插入模式時(shí),想要運(yùn)行一個(gè)普通模式命令,然后馬上繼續(xù)輸入的時(shí)候可以用這個(gè)命令。比如想滾動(dòng)一下屏幕,讓當(dāng)前行顯示在窗口正中,以更好地閱讀,然后繼續(xù)插入,可以按<C-o>zz。再比如在當(dāng)前行操作完畢,想到下方10行的地方進(jìn)行操作,可以按<C-o>10j
三. 選擇模式
1.可視模式下,當(dāng)選中一段文本后,再按<C-g>可以切換到選擇模式,再輸入任意可見(jiàn)字符,如p,這個(gè)選中的文本將會(huì)被刪除,并顯示你輸入的字符p,并切換到插入模式,但是在可視模式下,會(huì)將這些字符當(dāng)作命令,p會(huì)被認(rèn)為是粘貼
技巧
一.和shell進(jìn)行切換
-
<C-z>可以讓vim掛起,進(jìn)入到shell中,fg可以從shell返回到vim中
二.退出了插入模式在文檔中移動(dòng),然后又想快速回到退出的地方繼續(xù)編輯,用gi命令
三.位置標(biāo)記
? 1. 可以在退出這次修改的時(shí)候用m{letter}設(shè)置一個(gè)標(biāo)記,這個(gè){letter}需要是大寫,作為全局標(biāo)記,如果是小寫則是局部緩沖區(qū)的標(biāo)記,設(shè)置大寫字母的話下次再次打開(kāi)vim的時(shí)候可以用``{letter}`快速的回到上次的文件,這是我用來(lái)回到前一天沒(méi)寫完的代碼的地方最快的方式
四.將下/上個(gè)查找所在的行居中
noremap <Leader>n nzz
noremap <Leader>N Nzz
五.自動(dòng)填充當(dāng)前文件所在的目錄地址
cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'把這個(gè)加入到vimrc中可以用%%就能自動(dòng)填充當(dāng)前文件所在的目錄地址cnoremap表示在命令行模式下進(jìn)行映射<expr>表示將映射命令的右邊參數(shù)當(dāng)作一個(gè)表達(dá)式來(lái)對(duì)待當(dāng)我們輸入
%%將會(huì)得到表達(dá)式getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'運(yùn)算的結(jié)果這個(gè)表達(dá)式通過(guò)
getcmdtype()獲取當(dāng)前命令行模式的類型,:表示是命令行模式,expand()函數(shù)對(duì)通配符進(jìn)行擴(kuò)展,其中傳入的參數(shù)為%和:h,即獲取當(dāng)前緩沖區(qū)的地址并去掉文件名這個(gè)映射本身就是在命令行模式下的映射,不需要
getcmdtype()再去判斷是不是命令行模式,所以親測(cè)如下命令也可以生效,cnoremap <expr> %% expand('%:h').'/'
六.命令行搜索歷史命令
- 可以讓手指不離開(kāi)本位行(hjkl所在的行),但是同樣可以根據(jù)已輸入的字符當(dāng)作過(guò)濾條件查找已輸入過(guò)的命令,
<Up>會(huì)篩選,<C-p>不會(huì),如輸入set high會(huì)根據(jù)已經(jīng)輸入的進(jìn)行篩選
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
七.取消上下左右鍵的作用,強(qiáng)迫自己不使用上下左右鍵
noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>
八.實(shí)際行和屏幕行
- 當(dāng)開(kāi)啟很多分屏后,會(huì)出現(xiàn)實(shí)際行和屏幕行,即文件中的一行會(huì)被顯示為屏幕上的若干行
-
j和k會(huì)根據(jù)實(shí)際行向下或向上移動(dòng),而gj和gk則是按屏幕行向下或向上移