Vim 進階1
所有你覺得簡單重復,可以自動化實現的操作,都是可以自動化實現的。
Vim光標移動拾遺
w
:下一個單詞的開頭,e
:下一個單詞的結尾,b
:上一個單詞的開頭,
0
:行首(最行首,不管行首字符是否為空),$
:行尾,^
:非空字符行首,
%
:匹配括號處,前跳后,后跳前都可,
gd
:跳到某變量定義處(其實是當前函數體內,該變量第一次出現的位置),gD
:整個文件內該變量第一次出現的位置,*
,#
,n
,N
[{
:移動到前一個沒有匹配的左大括號處,(用于跳到函數、循環等作用域的開頭)
r
:normal 模式下替換一個字符,如 ra
將當前字符替換為 a,R
:normal模式下從當前到行尾替換
cw
:刪除單詞并進入編輯模式,C
:輸出到行尾并進入編輯模式。S
:刪除整行并進入編輯模式,s
:刪除當前字符并進入編輯模式,
~
:替換大小寫,并后移一個字符
自定義計數操作
-
d2w
:刪除(其實d都是剪切)兩個單詞 -
2dw
:刪除單詞,做兩遍。4dd
==d3j
Vim 修飾詞
-
i
innerdip
:(delete inner paragraph) 刪除一段文字(空行分隔),刪除操作不包括空行di(
:刪除括號內內容 -
a
arounddap
:刪除一段文字,刪除操作包括空行 -
t
tilldt)
:刪除從當前光標到本行下一個)
處,刪除操作不包括)
-
f
finddf)
:刪除從當前光標到本行下一個)
處,刪除操作包括)
vim mark標簽
- m 生成一個 mark 標簽,如 a ,生成一個名為 a 的標簽
- ` 跳轉到一個 mark 標簽,如 a ,跳轉到名為 a 的標簽處,恢復行列位置
- ’ 跳轉到一個 mark 標簽,如 a ,跳轉到名為 a 的標簽處,僅恢復行位置,即跳到標簽所在行行首
- `` 或 ‘’ 在起跳點和標簽 a 間反復橫跳
mark 還有很多用法,可參考 https://vimjc.com/vim-mark.html
vim多標簽頁
對于vim這個來說, 單純的用多子窗口(sp
、vsp
)來操作, 感覺還是不夠的, 還要結合標簽頁tab pages來,才能更好的操作。
所有關于標簽的命令都是以 :tab
開始的, 可以用tab鍵來查看提示
-
:tabnew
新建標簽 -
:tabedit fileName
在新標簽中打開文件,簡寫為:tabe
-
:tabc
關閉當前標簽,:tabo
關閉其他所有標簽 -
:tabfirst
切換到第一個標簽 -
:tablast
切換到最后一個標簽 -
:tabp
切換到前一個標簽 tab previous -
:tabn
切換到下一個標簽 tab next -
:tabs
查看標簽 -
gt
,gT
常規模式下直接切換標簽
visual模式
v
:逐字符選中V
:整行選中C-v
:矩形塊 block 選中
搜索替換
:[range]s/from/to[flags]
:在 range 范圍內,將 from 替換為 to。 range、flags 常用含義如下
flags
flag | 作用 |
---|---|
% | 復制上次替換命令的flags |
g | 替換每行所有的匹配值(默認只替換每行的第一個匹配值) |
c | 替換前需確認 |
e | 替換失敗時不報錯 |
i / I | 大小寫不敏感 / 敏感 |
range
range | 功能 |
---|---|
21 | 21行 |
$ | 最后一行 |
% | 全部行 |
21,25 | 從21行到25行 |
. | 當前行 |
.+3 | 當前行后的第3行 |
.,$ | 當前行到最后一行 |
.,.5 / .,.+5 | 當前行及之后5行 |
多個文件內替換
:args *.c *.h
:argdo %s/ext4/ext5/g
:argdo update
:argdo exit
注意 Vim 中的替換與 sed 中的替換其實是很像的:
sed -i "[range]s/from/to/[flags]" filename
將?件 filename
內的 from
替換為 to
-i
表示直接編輯文件內容,不加將會打印輸出到 stdout。
Vim 宏
如生成從 1 到 1000 的序列等多次雷同的操作
- 錄制宏:
q
,如qa
表示開始錄制名稱為a
的宏。 - 運行宏:
@
,如@a
表示執行名稱為a
的宏,10@a
表示執行 10 次。
詳見:Vim 重復操作的宏錄制
安裝插件
mkdir -p ~/.vim/pack/vendor/start
- 將插件 clone 到該目錄下即可
ctags
生成 tags 方便跳轉看代碼,支持多種語言
- 安裝 ctags:
sudo apt install exuberant-ctags
- 創建 tags 文件
ctags -R .
- 若查找
inode_operations
的定義- No tags file
- 當前目錄不存在 tags 文件
- 在父目錄中尋找 tags 文件:在
.vimrc
中添加set tags=./tags;,tags
- No tags file
- 使用:
- 查找當前文件中的某個變量的定義:光標在該變量上,
Crtl+]
- 列出所有某個變量的定義及引用:
g]
- 直接打開定義
inode_operations
的文件:直接在當前目錄下,命令行中vim -t inode_operations
- 查找當前文件中的某個變量的定義:光標在該變量上,
shell使用vim鍵位
-
bash :
set -o vi
-
zsh :
bindkey -v
-
fish :
fish_vi_key_bindings
這里說一下 bash 中默認是 emacs
模式,具體當前是什么模式可以用 set -o
命令查看,然后通過 set -o enacs
和 set -o vi
來回切換。
鍵位圖中文版
其他常用插件
- gitgutter
- easymotion
- fzf
- Vim-linux-coding-style
- cscope
- …
Ref:
https://www.bilibili.com/video/BV1PL411M7bg?from=search&seid=12655157522675339145&spm_id_from=333.337.0.0