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