這不是一篇vim命令的集合咧织,也不是一篇vim插件的推薦局装,是在什么插件都不裝的前提下看看運用vim的思想和技巧到底能解決什么,再去思索我需要裝什么插件來做到光靠原生vim做不到的事情
思想
一.點命令
? 1. 點命令可以重復(fù)上次修改凤薛,上一次修改可以是x
座泳,dd
等在普通模式下的命令,也可以是進入插入模式直至返回普通模式的一系列操作
二.不要自我重復(fù)
? 假如你要給當(dāng)前行以后的15行的末尾都添加分號
- 方法一: 按
A;<Esc>
洒沦,然后按j
和A;<Esc>
一直重復(fù)呢豹绪,或許可以達到效果,但是卻已經(jīng)陷入自我重復(fù)了申眼,就像寫很多相似的代碼的時候一樣需要思索一下了 - 方法二:按
A;<Esc>
瞒津,然后按j
和.
,前面第一點說了括尸,點命令可以重復(fù)上一次的修改巷蚪,這里的上一次修改就是A;<Esc>
,所以按j
和.
就可以實現(xiàn)我們想要的效果濒翻,這個操作也是理想的編輯模式屁柏,即一次按鍵移動j
,另一次按鍵操作.
三.一次修改的粒度
- 我們很多時候需要撤銷我們輸入的內(nèi)容有送,會按
u
鍵來撤銷 - 假如我們這次插入模式輸入的已經(jīng)有十行了前联,也許你只想撤銷第十行的內(nèi)容,這時你按
<Esc>
和u
,你會發(fā)現(xiàn)十行全部被撤銷了娶眷,這就是一次修改的粒度過大了,這和vscode
中的不一樣啸臀,每次<command-z>
只會撤銷一行的內(nèi)容届宠,所以在vim
中我們需要自己控制好上一次修改的粒度,每次思索代碼沒有輸入的時候可以按<Esc>
退回到普通模式乘粒,可以實現(xiàn)修改粒度的切分
四.只要可能豌注,就用操作符命令,而不是可視模式
-
import React, { FC, useMemo, useEffect } from 'react'
比如你想刪除這里的第一個單詞import
灯萍,方式一可以用daw
實現(xiàn)轧铁,方式二用vaw
和d
。在其他編輯器的模式下我們通常會選擇方式二旦棉,即先選擇區(qū)域再做操作齿风,但是vim
中可以先選擇操作再選擇范圍選擇方式一的好處就是可以使用.
命令,可以繼續(xù)刪除下一個單詞绑洛,但是使用方式二的可視模式的話救斑,你會發(fā)現(xiàn)它只是每次都刪除7個字符,因為第一次的vaw
和d
操作的是import
加一個空格
小眾模式
一.操作符待決模式
- 你也許知道vim中有四種模式:普通模式真屯,插入模式脸候,可視模式,命令行模式,但還有操作符待決模式
-
vim
中有一條額外的規(guī)則运沦,當(dāng)一個操作符命令被連續(xù)調(diào)用兩次時泵额,它會作用于當(dāng)前行 - 什么是操作符待決模式,
d
是刪除的操作符携添,<
是減少縮進的操作符嫁盲,可是我們按dd
才是刪除一行,<<
才是減少縮進一行薪寓,其實我們在按下第一個d
的時候進入了一個操作符待決模式亡资,只是這個模式是個短暫的存在,直到接收到我們下一個動作命令向叉,才完成整個操作锥腻,比如dd
,第一個d
是是操作符母谎,第二個d
時說要刪除整行瘦黑,所以同理cc
就是刪除整行并插入,yy
就是復(fù)制整行奇唤,dap
幸斥,就是刪除整個段落,gUap
就是將整個段落大寫 - 可以將操作符和查找動作結(jié)合起來使用
d/staff<cr>
可以刪除從當(dāng)前光標(biāo)到staff
前面的內(nèi)容 - 可以將操作符待決模式和文本對象結(jié)合起來咬扇,在操作符待決模式中甲葬,
i
不再是切換到插入模式并將光標(biāo)置于字符前,a
也不是將光標(biāo)置于字符后懈贺,而是當(dāng)作文本對象的組成部分经窖。因為aw
會刪除當(dāng)前單詞加一個空格,iw
只刪除當(dāng)前單詞的特性梭灿,c
命令適合和iw
等配合画侣,d
命令則適合和aw
等配合 - 很多命令都是兩個或更多按鍵,比如
<C-w> s
會水平切分此窗口堡妒,但是<C-w>
只是第二個按鍵的前綴配乱,可以當(dāng)作命名空間,但是他們并不會激活操作符待決模式皮迟,因為只有操作符才會激活操作符待決模式
二. 插入-普通模式
1.有時候會在插入模式的情況下想使用普通模式的命令搬泥,可以不需要按<Esc>
, <C-o>
切換到插入-普通模式,當(dāng)在插入模式時万栅,想要運行一個普通模式命令佑钾,然后馬上繼續(xù)輸入的時候可以用這個命令。比如想滾動一下屏幕烦粒,讓當(dāng)前行顯示在窗口正中休溶,以更好地閱讀代赁,然后繼續(xù)插入,可以按<C-o>zz
兽掰。再比如在當(dāng)前行操作完畢芭碍,想到下方10行的地方進行操作,可以按<C-o>10j
三. 選擇模式
1.可視模式下孽尽,當(dāng)選中一段文本后窖壕,再按<C-g>
可以切換到選擇模式,再輸入任意可見字符杉女,如p
瞻讽,這個選中的文本將會被刪除,并顯示你輸入的字符p
熏挎,并切換到插入模式速勇,但是在可視模式下,會將這些字符當(dāng)作命令坎拐,p
會被認為是粘貼
技巧
一.和shell進行切換
-
<C-z>
可以讓vim
掛起烦磁,進入到shell
中,fg
可以從shell
返回到vim
中
二.退出了插入模式在文檔中移動哼勇,然后又想快速回到退出的地方繼續(xù)編輯都伪,用gi
命令
三.位置標(biāo)記
? 1. 可以在退出這次修改的時候用m{letter}
設(shè)置一個標(biāo)記,這個{letter}
需要是大寫积担,作為全局標(biāo)記陨晶,如果是小寫則是局部緩沖區(qū)的標(biāo)記,設(shè)置大寫字母的話下次再次打開vim
的時候可以用``{letter}`快速的回到上次的文件帝璧,這是我用來回到前一天沒寫完的代碼的地方最快的方式
四.將下/上個查找所在的行居中
noremap <Leader>n nzz
noremap <Leader>N Nzz
五.自動填充當(dāng)前文件所在的目錄地址
cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'
把這個加入到vimrc
中可以用%%
就能自動填充當(dāng)前文件所在的目錄地址cnoremap
表示在命令行模式下進行映射<expr>
表示將映射命令的右邊參數(shù)當(dāng)作一個表達式來對待當(dāng)我們輸入
%%
將會得到表達式getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'
運算的結(jié)果這個表達式通過
getcmdtype()
獲取當(dāng)前命令行模式的類型珍逸,:
表示是命令行模式,expand()
函數(shù)對通配符進行擴展聋溜,其中傳入的參數(shù)為%
和:h
,即獲取當(dāng)前緩沖區(qū)的地址并去掉文件名這個映射本身就是在命令行模式下的映射叭爱,不需要
getcmdtype()
再去判斷是不是命令行模式撮躁,所以親測如下命令也可以生效,cnoremap <expr> %% expand('%:h').'/'
六.命令行搜索歷史命令
- 可以讓手指不離開本位行(hjkl所在的行)买雾,但是同樣可以根據(jù)已輸入的字符當(dāng)作過濾條件查找已輸入過的命令把曼,
<Up>
會篩選,<C-p>
不會漓穿,如輸入set high
會根據(jù)已經(jīng)輸入的進行篩選
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
七.取消上下左右鍵的作用嗤军,強迫自己不使用上下左右鍵
noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>
八.實際行和屏幕行
- 當(dāng)開啟很多分屏后,會出現(xiàn)實際行和屏幕行晃危,即文件中的一行會被顯示為屏幕上的若干行
-
j
和k
會根據(jù)實際行向下或向上移動叙赚,而gj
和gk
則是按屏幕行向下或向上移