第一章 Vim解決問題的方式
-
.命令會重復上次的修改- 從進入插入模式到回傳普通模式,其間的操作被認為是一次可重復的修改
-
f{char}:查找下一處指定字符出現的位置并跳轉;:向后重復查找,:向前重復查找
-
*:查找當前游標所在的單詞并跳轉n正向重復查找N反向重復查找
-
如何替換檔案中某一單詞?
① 可以使用
%s/old/new/g,回車即可② 游標移到一個old上按
*,再按cw進行單詞修改,之后按n.n.即可(相較于①,可以應對一些可能不需修改的位置)
第一部分 模式
第二章 普通模式
-
u命令會撤銷最新的修改- 進入插入模式到回傳普通模式被認為是一次修改,因此可以通過控制<Esc>的使用來控制撤銷的粒度,
- 另起一行最好使用
<Esc>o以便更好地控制撤銷粒度 - 如果在插入時按了方向鍵,會產生一個新的撤銷塊!
- ??
<C-r>重做
-
n<C-a>將下一個數字增加n;n<C-x>將下一個數字減少n- Vim把以0開頭的數字解釋為8進制,如007 + 001 = 010
- 可以通過設定
set nrformats=讓Vim把所有數字都當成十進制
-
zz命令重繪螢屏 ,將當前行顯示在螢屏中央 -
ga在螢屏下方顯示當前字符的字符編碼(十進制,十六進制和八進制)

-
運算子(operator) + 動作命令(motion) = 操作
-
gg=G可以自動縮進對應語言的檔案 -
運算子待決模式:呼叫運算子和輸入動作命令之間的狀態,按<Esc>可以回傳普通模式
-
R由普通模式進入替換模式- 制表符在檔案中以單個字符表示,但螢屏上會占據若干列的寬度,此寬度由
tabstop設定決定 - 替換模式下將制表符當單個字符處理(Vscode的Vim不會),應對這個情況可以使用
gR命令進入虛擬替換模式 r和gr命令允許替換一個字符后馬上回到普通模式
- 制表符在檔案中以單個字符表示,但螢屏上會占據若干列的寬度,此寬度由
第三章 插入模式
-
?? 插入模式下的快捷洗掉方式(在bash shell中也可以用)
<C-h> or Backspace:洗掉前一個字符<C-w>洗掉前一個單詞<C-u>洗掉至行首
-
插入-普通模式
- 插入模式下按
<C-o>進入,在此模式下,可以執行一個普通模式命令,執行完后,馬上就回傳到插入模式 - ??
<C-o>zz可以在插入模式下,將當前行顯示在視窗正中間
- 插入模式下按
-
插入模式下,
<C-r>{register}可以方便的粘貼幾個單詞,而不用回傳普通模式按p- 多行文本的時候可能會有不必要的換行/縮進,此時可以使用
<C-r><C-p>{register},或者回傳普通模式按p - 暫存器的部分參看第四部分
- 多行文本的時候可能會有不必要的換行/縮進,此時可以使用
-
運算式暫存器:允許我們做一些運算,并將運算結果直接插入檔案中
- 用
=指明使用運算式暫存器 - 例如,
<C-r>=1+1<CR>,在游標位置顯示2
- 用
-
<C-v>{code}用字符編碼(3位)插入任意字符- 例如
<C-v>065會輸入A - 普通模式下使用
ga命令可以查詢字符編碼 - 十六進制和二合字母如果用到了可以再查詢
- 例如
第四章 可視模式
- 3種不同的可視模式
- 操作字符文本
v - 行文本
V - 塊文本
C-v - ??
gv可以重復上次的高亮選區
- 操作字符文本
- 不同模式之間可以通過上面的觸發鍵進行切換,可以達到很特別的效果,比如只選每一行的前半行
- 可視模式下按
o可以切換高亮選區的活動端 - 選區可以配合運算子使用,如選中后按
c就剪切選區并進入插入模式 - 可以利用
.命令重復執行可視模式中的命令,但只在行文本時比較有用- 例如增加某兩句代碼的縮進兩次,可以先
V選中這兩行,然后使用>,再按.重復
- 例如增加某兩句代碼的縮進兩次,可以先
- 可視模式下怎么快捷選擇區域:
- 使用移動游標的各個命令來改變選區,如
e,G等 f{char}以及/和?查詢及對應的重復操作也可以使用- 可以跟一個文本物件來快捷選中,如
vaw
- 使用移動游標的各個命令來改變選區,如
- ?? 可視模式的巧用
- 可視模式下按
r進行替換有奇效!可以快速進行橫向和縱向的替換 - 同時修改位于同一列的單詞,只需要選中后按
c,修改時只有第一行會實時更新,回傳普通模式后其他行才會顯示修改后的結果 - 在選定行的行首或行尾加上一樣的文本,只需要使用
I或A命令- ?? 可視模式下的
i和a不再是普通模式下的作用,而會被當作文本物件的組成部分
- ?? 可視模式下的
- 可視模式下按
- 選擇模式(有些畫蛇添足,基本不用)
- 使用<C-g>切換,將可視模式下選擇的文本洗掉并替換成輸入的文本,同時切換到插入模式,相當于按了個
c(那我為什么不直接按c呢?)
- 使用<C-g>切換,將可視模式下選擇的文本洗掉并替換成輸入的文本,同時切換到插入模式,相當于按了個
第五章 命令列模式
-
編輯器家族史:ed -> ex ->vi ->vim,Ex命令(命令列模式下執行的命令)繼承自ex行編輯器,可以方便地處理行編輯任務,
:h ex-cmd-index查看完整Ex命令串列 -
:進入命令列模式 -
Ex命令的優勢:普通模式命令一般操作當前字符或當前行,而Ex命令可以在任意位置執行,并且可以在多行同時執行的能力(影響范圍廣且距離遠)
-
命令列模式下可以使用
<C-h> <C-w> <C-u>進行快捷洗掉,也可以使用<C-v> <C-k>插入不常見字符,還可以使用<C-r>{register}粘貼一些文本 -
??
[range]指定范圍,可以用行號、位置標記或是查找模式來指定范圍的開始位置及結束位置range預設為本行
- 行號作為地址:
:index- 如
:1會跳轉到第一行,:3d會跳到并洗掉第3行 = 3Gdd
- 如
- 用地址作為一個范圍:
:{start},{end}- 地址可以是行號,位置標記或是查找模式
- 如
:2,5p列印第2到第5行
- 用高亮選區指定范圍
- 在可視模式下按
:,命令列會填充:'<,'>,其中'<表示高亮選區首行,'>表示最后一行 - 可視模式以外輸入
:'<,'>p,也會回顯上次選中的內容
- 在可視模式下按
- 用模式指定范圍
- 如
:/<html>/,/<\/html>/p
- 如
- 用偏移對地址進行修正
:{address}+nn可以省略,預設為1- 如
:/<html>/+1,/<\/html>/-1p會剔除html首位標簽所在的行 - 又如
:.,.+3表示當前行以及下面3行
- 行號作為地址:
| 命令 | 簡寫 | 用途 |
|---|---|---|
| :[range]delete [x] | d | 洗掉指定范圍內的行[到暫存器x中] |
| :[range]yank [x] | y | 復制指定范圍內的行[到暫存器x中] |
| :[range]put [x] | 在指定行后粘貼暫存器x中的內容 | |
| :[range]copy {address} | t | 把指定范圍內的行拷貝到{address}所指定的行之下 |
| :[range]move {address} | m | 把指定范圍內的行移動到{address}所指定的行之下 |
| :[range]join | 連接指定范圍內的行 | |
| :[range]normal {commands} | 對指定范圍內的每一行執行普通模式命令{commands} | |
| :[range]substitute/{pattern}/{string}/{flags} | s | 把指定范圍內出現{pattern}的地方替換成{string} |
| :[range]global/{pattern}/[cmd] | 對指定范圍內匹配{pattern}的所有行,在其上執行Ex命令 |
- 一些常用符號:
| 符號 | 地址 |
|---|---|
| 1 | 檔案的第一行 |
| $ | 檔案的最后一行 |
| 0 | 虛擬行,位于檔案第一行上方 |
| . | 游標所在行 |
| ’m | 包含位置標記m的行 |
| ’< | 高亮選區的起始行 |
| '> | 高亮選區的結束行 |
| % | 整個檔案(:1,$ 的簡寫形式) |
-
:t和yyp的區別,:t不使用暫存器,不會覆寫默認暫存器中的內容! -
@:重復上次的Ex命令 -
?? 怎么為大量行同時執行一個操作?(和無數次的.說byebye)
例如在每行末尾增加一個分號
- 可以先在第一行執行后,可視模式下選中同樣需要加分號的行,按
:后輸入:'<,'>normal .即可實作大量的重復 - 也可以直接執行
:%normal A;
再比如將整個檔案注釋掉
:%normal i// - 可以先在第一行執行后,可視模式下選中同樣需要加分號的行,按
-
Ex命令可以用
Tab自動補全,可以用<C-d>顯示可用的補全串列,每次按Tab都會替換成串列中的下一項,按<Shift-Tab>則會反向替換 (這條試了一下不太好用,windows下的vim按Tab相當于這里<C-d>的效果)- 還有個妙用,按<C-d>還可以對引數串列也展示,不過和命令之間要打一個空格
-
??
<C-r><C-w>會復制游標下的單詞并插入到命令列中- 例如:全域替換時,使用查找找到old,然后修改一個old為new,在new上呼叫
:%s//<C-r><C-w>/g即可全域替換 - 要插入字串的話,使用
<C-r><C-a>
- 例如:全域替換時,使用查找找到old,然后修改一個old為new,在new上呼叫
-
?? 回溯歷史命令
- 按<Up><Down>可以查看歷史命令,同時支持根據當前輸入進行過濾,同樣適用于查找模式
/哦! - 也可以使用<C-p><C-n>替換上下鍵,避免把手移到小鍵盤區,但是不支持過濾,可以自定義映射項將<C-p>完全替換成<Up>
cnoremap <C-p><Up> set history=可以設定保存的歷史記錄數
- 按<Up><Down>可以查看歷史命令,同時支持根據當前輸入進行過濾,同樣適用于查找模式
-
使用
|將Ex命令組合::write|!ruby %,之后就可以通過歷史找到這條組合命令 -
?? 命令列視窗
- 進入
- 普通模式下:輸入
q:進入(經常輸錯進入,以前都不知道是什么…) - 命令列模式下:
<C-f>切換進入,當前輸到一半的命令會保留 q/打開查找模式命令歷史的命令列視窗,查找提示符只是命令列模式的另一種形式
- 普通模式下:輸入
- 使用hjkl移動,回車代表著執行該條歷史Ex命令
- 可以對命令列視窗中的內容進行vim的幾乎所有操作,包括Ex命令本身哦
:q退出
- 進入
-
?? 運行Shell命令:命令列模式下加一個
!前綴:!{cmd}-
例如
:!ls -
%代表當前檔案名,例如:!ruby % -
可以使用vim的
:shell啟動一個互動的shell會話,然后就可以自由使用這個shell,直到輸入exit回傳Vim- 更便捷的方式是,按
<C-z>先掛起vim,之后可以通過jobs查看,并用fg命令恢復前臺作業
- 更便捷的方式是,按
-
:read !{cmd}會把cmd的輸出重定向到緩沖區(就是當前編輯的區域啦):[range]write !{cmd}會把range指定的內容作為cmd的標準輸入,預設是整個檔案-
如:
:write !sh命令的作用是在shell中執行當前快取區中的每行命令 -
注意
!的位置:write ! {cmd}=:write !{cmd},但是??:write! sh會把緩沖區的內容強制覆寫到sh檔案中!
-
-
-
過濾器:
:[range]!{cmd}是將range的內容作為cmd的標準輸入,再用cmd的輸出替換range指定的范圍 —— 即range指定的文本會被cmd過濾- 我們可以用
!{motion}運算子切換到命令列模式,并把指定{motion}所涵蓋的范圍預置在命令列上- 例如按
!G,Vim就會打開命令列并填充:.,$!,就不用自己費事整范圍了
- 例如按
- 我們可以用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254006.html
標籤:其他
上一篇:疫情讓“靈活用工”浮出水面,作為Android開發的你“靈活用工”了嗎?
下一篇:校園網內網穿透
