本部分筆記可作為速查 CheatSheet 使用
本系列教程共分為以下五個(gè)部分:
神級(jí)編輯器 Vim 使用-基礎(chǔ)篇
神級(jí)編輯器 Vim 使用-操作篇
神級(jí)編輯器 Vim 使用-插件篇
神級(jí)編輯器 Vim 使用-正則操作篇
神級(jí)編輯器 Vim 使用-最后
基礎(chǔ)命令
vim code.c: 在終端中打開 code.c 文件 (終端命令)
vim ~/.vimrc: 打開根目錄下的 .vimrc 文件 (終端命令)
vim -u NONE -N: 以不加載任何插件的方式啟動(dòng) vim(終端命令)
gvim -o file1 file2: open into a horizontal split (file1 on top, file2 on bottom) [C]
gvim -O file1 file2: open into a vertical split (side by side,for comparing code) [N]
gvim.exe -c "/main" joe.c: Open joe.c then jump to "main"
vim -c "%s/ABC/DEF/ge | update" file1.c: execute multiple command on a single file
vim -c "argdo %s/ABC/DEF/ge | update" *.c: execute multiple command on a group of files
mvim --servername VIM3 --remote-tab foobar.txt: 在 MacVim 中已打開的窗口中打開文件
mvim -f file.txt: 使用 MacVim 編輯, 編輯完后返回結(jié)果給 terminal(如果不加 f 的話就是立刻返回結(jié)果給終端)
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c: remove blocks of text from a series of files
vim -s "convert.vim" file.c: Automate editing of a file (Ex commands in convert.vim)
gvim -u NONE -U NONE -N hugefile.txt: "load VIM without.vimrc and plugins (clean VIM) e.g. for HUGE files
gvim -c 'normal ggdG"*p' c:/aaa/xp: Access paste buffer contents (put in a script/batch file)
gvim -c 's/^/\=@*/|hardcopy!|q!': print paste contents to default printer
:h [option]: 顯示對(duì)命令的幫助
:help:sort: 同上, 顯示對(duì) :sort 的解釋
:help guimac / :help macvim: 顯示 macvim 的幫助
:gui: 在 MacVim 中打開 vim 中當(dāng)前的所有 buffer(great!)
:source ~/.vimrc: 重載配置文件 (可以在不重啟 vim 的情況下重載配置文件)
:runtime syntax/c.vim: 將文件加載入 runtimpath, 不使用冒號(hào)只會(huì)加載第一個(gè)符合的
:runtime! **/maps.vim: 將文件夾下所有符合的文件添加到 runtimpath 中, 使用冒號(hào)會(huì)加載全部符合的
:syntax on: 開啟語(yǔ)法
:set number: 設(shè)置行號(hào)
:set ft=json: 設(shè)置的文件格式為 json 格式
:set ft?: 查看當(dāng)前文件的 ft 值
.: 修改完之后移動(dòng)至下一個(gè)單詞出按 . 可重復(fù)相同操作 (厲害!)
5.: 重復(fù) 5 次相同動(dòng)作
*: 向下查找光標(biāo)下的單詞
#: 向上查找光標(biāo)下的單詞
ga: 查看當(dāng)前光標(biāo)下字符的 unicode 碼及其他詳細(xì)信息
g<C-g>: counts words
:e.: . 代表 pwd 的結(jié)果, 即當(dāng)前工作路徑, 這個(gè)命令會(huì)進(jìn)入 netrw 的文件管理界面
gq: 重新布局 (如果設(shè)置了 textwidth 的話會(huì)根據(jù) textwidth 進(jìn)行斷行)
gq} format a paragraph
gqap: format a paragraph
ggVGgq: refromat entire file
Vgq: current line
gw: same as gq, but puts the cursor back at the same position in the text. However, formatprg and formatexpr are not used.
:verbose vmap: show all map under visual model
==: indent current line
=G: indent the all the lines below the current line
n==: indent n lines below the current line
=%: indent a block of code
保存退出
:q: 退出文件
q:: command line history window(puts you in full edit mode)
q/: search history window(puts you in full edit mode)
n1,n2 w [file]: 將 n1 行到 n2 行的內(nèi)容保存到另一個(gè)文件
:wq: 保存退出
:wa: 保存所有緩沖區(qū)
:wn: 保存當(dāng)前緩沖區(qū)并進(jìn)入下一個(gè)參數(shù)列表
:qa: 退出所有緩沖區(qū)
ZZ: 保存退出當(dāng)前 window(same as :x but not :wq which write the file even if it hasn't been modified)
ZQ: 不保存直接退出當(dāng)前 window(equal to :q!)
:x: 與 ZZ 及 :zq 功能類似, 但是不會(huì)寫入沒(méi)有被修改過(guò)的文件
:xa: 保存并退出所有緩沖區(qū) (不會(huì)保存沒(méi)有修改過(guò)的)
:sav path/to.txt: 將本緩沖區(qū)保存為文件 (相當(dāng)于另存為, 命令全名是 saveas)
:sav php.html: Save current file as php.html and "move" to php.html
:sav! %<.bak: Save Current file to alternative extension (old way)
:sav! %:r.cfm: Save Current file to alternative extension
:sav %:s/fred/joe/: do a substitute on file name
:sav %:s/fred/joe/:r.bak2: do a substitute on file name & ext.
:!mv % %:r.bak: rename current file (DOS use Rename or DEL)
:w path/to.txt: 保存到某路徑
:e!: 重載本文件, 即使有未保存的內(nèi)容也會(huì)被丟棄 (edit 縮寫)
:e path/to.txt: 打開指定文件
:e.: 進(jìn)入 netrw 瀏覽目錄
移動(dòng)
hjkl: 左下上右鍵
10 + hjkl: 向左下上右跳 10 個(gè)格
gj: 在一段被折為多行時(shí), 將光標(biāo)向下移動(dòng)一行 (向下移動(dòng)一個(gè)屏幕行)
gk: 在一段被折為多行時(shí), 將光標(biāo)向上移動(dòng)一行 (向上移動(dòng)一個(gè)屏幕行)
>>: 整行向右縮進(jìn)
<<: 整行向左縮進(jìn)
%: 在 (), [], {} 之內(nèi)跳轉(zhuǎn)到包圍符號(hào)上
]}: 跳轉(zhuǎn)到下一個(gè) } 上
[{: 跳轉(zhuǎn)到下一個(gè) { 上
[m: jump to beginning of next method
[M: jump to end of next
]m: jump to beginning of previous
]M: jump to end of previous
>%: 將 {}, (), [] 包裹的代碼右移 (必須先將光標(biāo)放到符號(hào)上)
<%: 將 {}, (), [] 包裹的代碼左移 (必須先將光標(biāo)放到符號(hào)上)
:le: 當(dāng)前行居左對(duì)齊
:ce: 當(dāng)前行居中對(duì)齊
:ri: 當(dāng)前行居右對(duì)齊
0: 移動(dòng)到行首 (非字符)
^: 光標(biāo)移至行首 (字符)
$: 光標(biāo)移至行尾 (換行符)
g^: 移動(dòng)到屏幕行的行首
g$: 移動(dòng)到屏幕行的行尾
g_: 光標(biāo)移至最后一個(gè)可見(jiàn)字符上
g;: 跳轉(zhuǎn)到上次修改的位置, 可以通過(guò) changes 查看所有更改
g,: 跳轉(zhuǎn)到下次修改的位置
gi: 跳轉(zhuǎn)到上次退出插入模式的位置并直接進(jìn)入 Insert Mode
gn / gN: 跳轉(zhuǎn)冰選中上個(gè) / 下個(gè) highlight
'', 反撇號(hào), 跳轉(zhuǎn) mark, 詳見(jiàn) Mark
w: 跳至下一個(gè)詞首
b: 跳至上一個(gè)詞首
e: 跳至下一個(gè)詞末端
ge: 跳轉(zhuǎn)到上一個(gè)詞的結(jié)尾
f: 移動(dòng)到行內(nèi)下一個(gè)字符, 如 fx 將查找行內(nèi)出現(xiàn)的下一個(gè) x 字符
F: 移動(dòng)到行內(nèi)上一個(gè)字符, 用法同 f
t: 移動(dòng)到行內(nèi)下一個(gè)字符的前一字符上
T: 移動(dòng)到行內(nèi)上一個(gè)字符的下一字符上
;: 重復(fù)查找, 即重復(fù) f 或 t, 非常有用, 可以與 . 想媲美
,: ; 的反面, 當(dāng)按 ; 過(guò)頭了可以用 , 退回來(lái)
<C-b>: 向前滾一頁(yè)
<C-f>: 向后滾一頁(yè)
<C-e>: 向上滾一行
<C-y>: 向下滾一行
<C-u>: 向上滾半頁(yè)
<C-d>: 向下滾半頁(yè)
gg: 跳至文件頂部
G: 跳至文件底部
M: 光標(biāo)移至頁(yè)中部
L: 光標(biāo)移至頁(yè)底部
H: 光標(biāo)移至頁(yè)頂部
88gg: 跳至第 88 行
88G: 跳至第 88 行
10|: 移動(dòng)到當(dāng)前行的第 10 列
zz: 將當(dāng)前行置于視圖中央
zt: 將當(dāng)前行置于視圖頂部
zb: 將當(dāng)前行置于視圖底部
gd: 跳轉(zhuǎn)到局部變量定義處
gD: 跳轉(zhuǎn)到文件內(nèi)全局聲明 (從文件開頭開始查找)
[<C-d>: 跳轉(zhuǎn)到定義處
[<C-i>: 跳轉(zhuǎn)到函數(shù), 變量和定義處
gf: 跳轉(zhuǎn)到相應(yīng)的頭文件
<C-w>gf: 以 tabnew 的方式進(jìn)行跳轉(zhuǎn)
<C-o>: Normal 模式下返回上一個(gè)操作的位置, Insert 模式下切換到 Normal 模式, 輸入完命令后再次進(jìn)入 Insert 模式: c-o zz
<C-t>: Normal 模式下返回上一個(gè)操作的位置, Search 模式下跳轉(zhuǎn)到上一個(gè)匹配位置
<C-g>: Search 模式下跳轉(zhuǎn)到下一個(gè)匹配位置
<C-i>: Normal 模式下返回下一個(gè)操作的位置
<C-^> / <C-6>: Normal 模式下在本文件與上一個(gè)操作文件中跳轉(zhuǎn)
'm: 反撇號(hào), 跳轉(zhuǎn)到設(shè)置的標(biāo)記 m 處
'M: 跳轉(zhuǎn)到全局標(biāo)記
<C-]>: 跳轉(zhuǎn)到當(dāng)前光標(biāo)的定義處 (基于 .tags 文件)
<C-w>]: 用新窗口 (如果在本 buffer 內(nèi)則直接跳轉(zhuǎn)) 打開并查看光標(biāo)下符號(hào)的定義 (光標(biāo)會(huì)跳轉(zhuǎn))(基于 .tags 文件)
<C-w>}: 使用 preview 窗口預(yù)覽光標(biāo)下符號(hào)的定義 (光標(biāo)不會(huì)跳轉(zhuǎn))(基于 .tags 文件)
復(fù)制 / 粘貼 / 刪除
c: 刪除并進(jìn)入 插入模式 (理解: cert, 會(huì)插入)
cw: 刪除一個(gè)單詞并進(jìn)入 插入模式
C: 刪除自游標(biāo)處到當(dāng)前行尾, 并進(jìn)入 插入模式
c2c: 刪除兩行并進(jìn)入 插入模式
cc: 刪除一行并進(jìn)入 插入模式
d^: 刪除至行首 (理解: delete, 不會(huì)插入, 直接刪除, 不會(huì)復(fù)制)
D: 從當(dāng)前光標(biāo)處刪除至行尾
dw: 向右刪除一個(gè)單詞
d2d: 刪除兩行
dd: 刪除一行
d121gg: 從當(dāng)前行刪除到 121 行
d121j: 從當(dāng)前行向下刪除 121 行
dtj: 向前刪除到 j(不包含 j)
dfj: 向前刪除到 j(包含j)
dTj: 向后刪除到 j(不包含j)
dFj: 向后刪除到 j(包含j)
d/ans: 向前刪除到 ans(不包含 ans)
d?ans: 向后刪除到 ans(不包含 ans)
d/\d: 向前刪除到第一個(gè)數(shù)字
x: 刪除本字符 (等于 delete)
X: 向前刪除一個(gè)字符 (等于 backspace)
s: 刪除右側(cè)并進(jìn)入插入模式
S: 刪除整行并進(jìn)入插入模式
yy: 復(fù)制一行
y$: 從光標(biāo)當(dāng)前處復(fù)制到結(jié)尾, 不會(huì)復(fù)制到換行符, 但是如果 v$y 則會(huì)復(fù)制到換行符
y: 復(fù)制所選 (可視模式)
'a,'by*: yank range into paste
%y*: yank range into paste
.y*: yank current line to paste
set paste: prevent vim from formatting pasted in text
y5j: 向下復(fù)制 5 行
v/d/c/y + [文本對(duì)象]
操作分隔符的文本對(duì)象: 用于確定范圍
i(/[/{/"/'<: 由 (/[/{/"/'< 包圍起來(lái)的字符, 不包含 (/[/{/"/'<
a(/[/{/"/'<: 由 (/[/{/"/'< 包圍起來(lái)的字符及包圍符號(hào)本身
[/?]motion<cr>: d/ans / d?ans / c/ans / c?ans
操作文本塊的文本對(duì)象
it: 由 tag 包圍起來(lái)的字符
at: 由 tag 包圍起來(lái)的字符及 tag 本身
iw: 當(dāng)前單詞
aw: 當(dāng)前單詞及一個(gè)空格
iW: 當(dāng)前字串
aW: 當(dāng)前字串及一個(gè)空格
is: 當(dāng)前句子
as: 當(dāng)前句子及一個(gè)空格
iB: 當(dāng)前 bracket(在定位 fold marker 時(shí)很有用)
aB: 當(dāng)前 bracket 及一個(gè)空格
ip: 當(dāng)前段落
ap: 當(dāng)前段落記一個(gè)空行
一般來(lái)說(shuō), d{motion} 命令和 aw, as 和 ap 配合起來(lái)使用比較好, 而 c{motion} 命令和 iw 及類似的文本對(duì)象一起用效果會(huì)更好.
p: 如果整行復(fù)制, 粘貼在下方一行. 如果選中復(fù)制, 粘貼到當(dāng)前光標(biāo)后方
P: 與 p 方向相反
gp: 與 p 類似, 不過(guò)會(huì)把光標(biāo)移動(dòng)至文本的結(jié)尾
gP: 與 P 類似, 不過(guò)會(huì)把光標(biāo)移動(dòng)到文本的結(jié)尾, 在粘貼多行的時(shí)候尤其有用
模式切換
i: 當(dāng)前字符之前插入
I: 行首插入
a: 當(dāng)前字符之后插入
A: 當(dāng)前字符行尾插入
o: 在下方插入一行并進(jìn)入 Insert Mode
O: 在上方插入一行并進(jìn)入 Insert Mode
<C-v>: 進(jìn)入列選擇模式, 可沿垂直方向選中多行, 然后使用大寫的 I 和 A 分別可以實(shí)現(xiàn)在前側(cè)和后側(cè)批量添加字符, 使用 > 可以向右縮進(jìn), 使用 r 可以替換, 特別好用!
v: 進(jìn)入 visual 模式, 移動(dòng)光標(biāo)可進(jìn)行批量選擇刪除
gv: 重復(fù)選擇上次選擇并操作的區(qū)域
O: 在 Visual 模式下切換高亮選取的活動(dòng)端使之可調(diào)整
大小寫 / 加減
~: 將當(dāng)前光標(biāo)處的大小寫翻轉(zhuǎn)
g~5j: 將當(dāng)前行向下 5 行大小寫反轉(zhuǎn)
gu5j: 將當(dāng)前行向下 5 行改為小寫
gU5j: 將當(dāng)前行向下 5 行改為大寫
gUit: 將 tag 包圍的內(nèi)容改為大寫
guu: 將當(dāng)前行改為小寫
gUU: 將當(dāng)前行改為大寫
g~~: flip case line
Vu: 將當(dāng)前行改為小寫
VU: 將當(dāng)前行改為大寫
veu: 當(dāng)前光標(biāo)至尾端的字符改為小寫
vG~: 將當(dāng)前光標(biāo)至文本結(jié)尾的字符翻轉(zhuǎn)大小寫
ggguG: lowercase entire file
<C-a>: 對(duì)數(shù)字進(jìn)行增加操作, 在列選擇模式下批量增加數(shù)字, 對(duì) Markdown 的列表排序特別好用
<C-v> + select + C-a: 將選擇區(qū)域數(shù)字統(tǒng)一增加 1
<C-v> + select + 2 + C-a: 將選擇區(qū)域數(shù)字統(tǒng)一增加 2
<C-v> + select + g + C-a: 將選擇區(qū)域的數(shù)字改為遞增為 1 的序列
<C-v> + select + 2 + g + C-a: 將選擇區(qū)域的數(shù)字改為遞增為 2 的序列
<C-x>: 對(duì)數(shù)字進(jìn)行縮小操作 (用法同 C-a)
撤銷
u: 撤銷 undo(命令模式, 可多次撤銷)
U: 無(wú)論當(dāng)前行修改了多少次, 全部撤銷操作
<C-r>: Normal 模式下反撤銷
:undolist: 撤銷歷史 (命令模式)
:undo 5: 撤銷 5 個(gè)改變 (命令模式)
Folding
zf: 創(chuàng)建折疊
zc: close, 關(guān)閉當(dāng)前光標(biāo)下可折疊區(qū)域
zo: open, 打開當(dāng)前光標(biāo)下可折疊區(qū)域
za: toggle, 打開 / 關(guān)閉當(dāng)前光標(biāo)下可折疊區(qū)域
zC/zO/zA: 與小寫不同的是操作對(duì)象為全局, 與光標(biāo)位置無(wú)關(guān)
zr: reduce, 整體減少折疊等級(jí) (與光標(biāo)位置無(wú)關(guān))
zR: 將所有折疊級(jí)別減值最小 (直觀看來(lái)就是緩沖區(qū)完全展開了)
zm: more, 整體增加折疊級(jí)別 (與光標(biāo)位置無(wú)關(guān))
zM: 增加折疊級(jí)別至最高 (直觀看來(lái)就是緩沖區(qū)完全折疊了)
zi: 全部折疊與全部展開之間進(jìn)行切換
[z: 當(dāng)前打開折疊的開始處
z]: 當(dāng)前打開折疊的末尾處
zd: 刪除當(dāng)前折疊 marker
zE: 刪除所有折疊 marker
zj: 移動(dòng)至下一個(gè)折疊
zk: 移動(dòng)至上一個(gè)折疊
zn: 禁用折疊
zN: 啟用折疊
window/tab
:tabnew [filename]: 新建一個(gè) tab 頁(yè), 例: tabnew% 以當(dāng)前文件新建一個(gè) tab 頁(yè), % 表示當(dāng)前文件
:tabclose: 關(guān)閉當(dāng)前 tab
:tabonly: 關(guān)閉所有其他的 tab
:tabn: 移動(dòng)至下一個(gè) tab, 直接使用 gt 也可
:tabp: 移動(dòng)至上一個(gè) tab, 直接使用 gT 也可
:tabs: 查看所有打開的 tab
:tabdo %s/foo/bar/g: 在所有打開的 tab 上執(zhí)行替換
:tab ball: 將所有的緩沖區(qū)在 tab 中打開
:tab sball: 將所有的緩沖區(qū)在 tab 中再次打開
gt: 跳轉(zhuǎn)到下一個(gè) tab
gT: 跳轉(zhuǎn)到上一個(gè) tab
5gt: 跳轉(zhuǎn)到第 5 個(gè) tab 上
:sp: 上下切割當(dāng)前文件, 同 <C-w> s
:vs: 左右切割當(dāng)前文件, 同 <C-w> v
:sp [filename]: 上下分割并打開一個(gè)新文件, 如果不輸入 filename 會(huì)切割打開本文件 (光標(biāo)在文件開頭位置)
:vs [filename]: 左右分割并打開一個(gè)新文件, 如果不輸入 filename 會(huì)切割打開本文件 (光標(biāo)在文件開頭位置)
<C-w> T: 如果當(dāng)前 tab 存在多個(gè)不同的 window, 那么將當(dāng)前 window 移動(dòng)到新 tab 上, 必須是大寫
<C-w> s: 水平切割當(dāng)前窗口
<C-w> v: 垂直切割當(dāng)前窗口
<C-w> h/j/k/l: 光標(biāo)向某個(gè)方向分屏移動(dòng)
<C-w> w: 在所有窗口間進(jìn)行切換
<C-w> _: 使窗口高度最大化
<C-w> |: 使窗口寬度最大化
<C-w> =: 使所有窗口等寬等高
<C-w> q: quit, 關(guān)閉當(dāng)前分屏, 如果是最后一個(gè), 則退出 vim
<C-w> c: close, 關(guān)閉當(dāng)前分屏, 如果是最后一個(gè), 則退出 vim
<C-w> o: only, 關(guān)閉所有除當(dāng)前屏幕外的所有分屏
<C-w> H: 當(dāng)前分屏向左移動(dòng)
<C-w> L: 當(dāng)前分屏向右移動(dòng)
<C-w> J: 當(dāng)前分屏向下移動(dòng)
<C-w> K: 當(dāng)前分屏向上移動(dòng)
<C-w> z: 關(guān)閉當(dāng)前打開的 preview 窗口
[N]<C-w> +: 分屏增加 N 列高度 (可選)
[N]<C-w> <: 分屏減少 N 列寬度 (可選)
:close: 關(guān)閉活動(dòng)窗口
:only: 只留下當(dāng)前活動(dòng)窗口
new abc.txt: 在新窗口中編輯文件
Buffer
:ls / :buffers: 顯示當(dāng)前所有 buffer(緩沖區(qū)列表)
a: active buffer
h: hidden buffer
%: the buffer is the current window
#: alternate buffer, 可以使用 :e # 直接編輯
:ls!: 列出非緩沖區(qū)列表文件
:bn: buffer next, 下一個(gè) buffer
:bp: buffer previous, 上一個(gè) buffer
:bf: 打開第一個(gè) buffer
:bl: 打開最后一個(gè) buffer
:b1: 切換到 buffer1(同理可按照數(shù)字切換到不同的 buffer)
:bd: 刪除 buffer(并沒(méi)有刪除文件本身, 只是 buffer 而已)
:bd 1 3: 刪除 buffer 編號(hào)為 1, 3 的兩個(gè) buffer
:bw 3: 將非緩沖區(qū)文件全部刪除
:bufdo [command]: 對(duì)所有緩沖區(qū)執(zhí)行操作
:bufdo /searchstr/: use :rewind to recommence search
:bufdo %s/searchstr/&/gic: say n and then a to stop
:bufdo execute "normal! @a" | w: execute macro a over all buffers
:bufdo exe ":normal Gp" | update: paste to the end of each buffer
:1,3 bd: 刪除 buffer 編號(hào)在 1~3 之間的所有 buffer
Tag
<C-]>: 跳轉(zhuǎn)到當(dāng)前光標(biāo)的定義處
g<C-]>: 查看當(dāng)前光標(biāo)處有多少個(gè)定義 (可輸入數(shù)字然后跳轉(zhuǎn))
g]: 查看當(dāng)前光標(biāo)處有多少個(gè)定義 (可輸入數(shù)字然后跳轉(zhuǎn))
:tag {keyword}: 根據(jù) keyworkd 查找有多少個(gè)匹配的 tag
:tag: 正向遍歷 tag 歷史
:tnext: 跳轉(zhuǎn)到下一處匹配的 tag
:tprev: 跳轉(zhuǎn)到上一處匹配的 tag
:tfist: 跳轉(zhuǎn)到第一處匹配的 tag
:tlast: 跳轉(zhuǎn)到最后一處匹配的 tag
:tselect: 提示用戶從 tag 匹配的列表中選擇一項(xiàng)進(jìn)行跳轉(zhuǎn)
:cs: 顯示 cscope 的所有可用命令
Markvim 中 mark 分為三種:
Local mark (a-z): 每一個(gè) buffer 里皆有自己的 local mark, 也就是說(shuō)檔案 A 可以有 mark a, 檔案 B 里也可以有自己的 mark a
Global mark (A-Z): 此種 mark 是全域的, 也就是說(shuō)在檔案 A 里所看到的 mark A 和 B 檔案 B 里的 mark A 是一樣的
Special mark: 其他神奇的 mark, 不在此文章討論范圍
:marks: 顯示所有的 marks
mm: 為當(dāng)前位置在當(dāng)前緩沖區(qū)內(nèi)設(shè)置本地標(biāo)記 m
dmm: 刪除本地標(biāo)記 m
'm: 反撇號(hào), 跳轉(zhuǎn)到設(shè)置的本地標(biāo)記 m 處
mM: 為當(dāng)前位置設(shè)置全局標(biāo)記 M (必須是大寫, 可以跨文件使用)
'M: 跳轉(zhuǎn)到全局標(biāo)記
'[: 上一次修改或復(fù)制的第一行或第一個(gè)字符
']: 上一次修改或復(fù)制的最后一行或最后一個(gè)字符
'<: 上一次在可視模式下選取的第一行或第一個(gè)字符
'>: 上一次在可視模式下選取的最后一行或最后一個(gè)字符
'': 上一次跳轉(zhuǎn) (不包含 hjkl 的那種跳轉(zhuǎn)) 之前的光標(biāo)位置
'": 上一次關(guān)閉當(dāng)前緩沖區(qū)時(shí)的光標(biāo)位置
'^: 上一次插入字符后的光標(biāo)位置, gi 便是使用了此 mark
'.: 上一次修改文本后的光標(biāo)位置, 如果想跳轉(zhuǎn)到更舊的 mark, 可以使用 g;
'(: 當(dāng)前句子的開頭, 與 command ( 相同
'): 當(dāng)前句子的結(jié)尾, 與 command ) 相同
'{: 當(dāng)前段落的開頭, 與 command { 相同
'}: 當(dāng)前段落的結(jié)尾, 與 command } 相同
跳轉(zhuǎn)時(shí)我們可以使用 單引號(hào) , 也可以使用 反撇號(hào) , 單引號(hào) 只會(huì)讓我們跳轉(zhuǎn)到該行的第一個(gè)非空白字符, 反撇號(hào) 會(huì)讓我們跳轉(zhuǎn)到改行的該列, 更加精確
Completion
<C-n>: 觸發(fā)補(bǔ)全, 向下
<C-p>: 觸發(fā)補(bǔ)全, 向上
<C-x>: 進(jìn)入補(bǔ)全模式
<C-x> <C-l>: 整行補(bǔ)全
<C-x> <C-n>: 根據(jù)當(dāng)前文件里關(guān)鍵字補(bǔ)全
<C-x> <C-k>: 根據(jù)字典補(bǔ)全
<C-x> <C-t>: 根據(jù)同義詞字典補(bǔ)全
<C-x> <C-i>: 根據(jù)頭文件內(nèi)關(guān)鍵字補(bǔ)全
<C-x> <C-]>: 根據(jù) tag 補(bǔ)全
<C-x> <C-f>: 補(bǔ)全文件名
<C-x> <C-d>: 補(bǔ)全宏定義
<C-x> <C-v>: 補(bǔ)全 vim 命令
<C-x> <C-u>: 用戶自定義補(bǔ)全方式
<C-x> <C-s>: 例如: 一個(gè)英文單詞 拼寫建議
Quick List
:cnext: 顯示當(dāng)前頁(yè)下一個(gè)結(jié)果
:cpre: 顯示當(dāng)前頁(yè)上一個(gè)結(jié)果
:copen: 打開 Quickfix 窗口
:cfirst: 跳轉(zhuǎn)到第一項(xiàng)
:clast: 跳轉(zhuǎn)到最后一項(xiàng)
:cnfile: 跳轉(zhuǎn)到下一個(gè)文件中的第一項(xiàng)
:cpfile: 跳轉(zhuǎn)到上一個(gè)文件中的最后一項(xiàng)
:cc N: 跳轉(zhuǎn)到第 n 項(xiàng)
:cclose: 關(guān)閉 Quickfix 窗口
:cdo {cmd}: 在 quickfix 列表中的每一行上執(zhí)行 {cmd}
:cfdo {cmd}: 在 quickfix 列表上的每個(gè)文件上執(zhí)行一次 {cmd}
:cl[ist]: 打開 location list 窗口, 目前看來(lái)不需要使用此選項(xiàng)
Location List與 Quick-List 相似, 最大的不同是: Quick-List 是針對(duì)多個(gè)窗口共享一個(gè)結(jié)果, 而 Location List 則是各個(gè)窗口的結(jié)果互相獨(dú)立
lopen: 用于打開位置列表窗口
lclose: 用于關(guān)閉位置列表窗口
lnext: 用于切換到位置列表中的下一項(xiàng)
lprevious: 用于切換到位置列表中的上一項(xiàng)
lwindow: 用于在錯(cuò)誤出現(xiàn)時(shí)才觸發(fā)位置列表窗口
宏
q + 小寫字母: 進(jìn)入宏記錄模式, 記錄到 小寫字母 寄存器中, 記錄完成后再次按下 q 即可.
q + 大寫字母: 進(jìn)入宏記錄模式, 在 小寫字母 寄存器尾部接著添加命令, 記錄完成后再次按下 q 即可.
@ + 小寫字母: 執(zhí)行對(duì)應(yīng)寄存器內(nèi)的宏. 可使用前綴添加數(shù)字的方式重復(fù)多次命令
@:: repeat last : command, : 寄存器總是保存著最后執(zhí)行的命令行命令
@@: 直接重復(fù)上一次的 @ 命令, 此命令必須建立在 上一次使用了以 @ 開頭的寄存器宏 或者 剛剛建立了一個(gè)寄存器宏的 基礎(chǔ)上, 因此經(jīng)常配合 @: 使用.
10@a: 執(zhí)行寄存器 a 中所存儲(chǔ)宏 10 次 (串行處理, 如果有錯(cuò)誤, 則立刻停止, 后續(xù)命令不再執(zhí)行)
參數(shù)列表參數(shù)列表與緩沖區(qū)的概念很類似, 參數(shù)列表的原始含義是我們?cè)诮K端中使用 vim a.txt b.txt 時(shí)后面的一系列文件或參數(shù)名, 但是我們也可以在進(jìn)入 vim 后使用 args 手動(dòng)添加參數(shù)文件. 其與緩沖區(qū)的區(qū)別是:
位于參數(shù)列表的文件必然位于緩沖區(qū)列表中
緩沖區(qū)列表永遠(yuǎn)是亂糟糟的, 但是參數(shù)列表永遠(yuǎn)是秩序井然
:args *.*: 將當(dāng)前目錄下的所有類型的文件加入到參數(shù)列表中 (不包括文件夾中的文件)
:args **/*.*: 將當(dāng)前目錄下的所有文件及子文件夾的所有文件都匹配加入到參數(shù)列表中
:args *.md aa/**/*.md 表示添加子文件夾下的 md 文件及 aa 文件夾下的和其子文件夾下的 md 文件到參數(shù)列表中
:args 'cat list.txt': 用反撇號(hào)將命令包圍起來(lái), 然后將命令被執(zhí)行后的結(jié)果作為參數(shù)加入?yún)?shù)列表中
:argdo %s/oldword/newword/egc | update: 對(duì)所有存在參數(shù)列表中的文件執(zhí)行命令, s 代表替換, % 指對(duì)所有行進(jìn)行匹配, g 代表整行替換 (必用), e 指使用正則表達(dá)式, c 代表每次替換前都會(huì)進(jìn)行確認(rèn), update 表示對(duì)文件進(jìn)行讀寫
:argdo exe '%!sort' | w
:argdo write: 將所有參數(shù)列表中的內(nèi)容進(jìn)行緩沖區(qū)保存
:argdo normal @a: 將當(dāng)前參數(shù)列表的所有緩沖區(qū)執(zhí)行寄存器 a 中所存儲(chǔ)的宏
:argd *: 清空參數(shù)列表
:argdo bw: 將參數(shù)列表中的所有文件清除出緩沖區(qū)
:args: 顯示當(dāng)前的所有參數(shù)列表
:next: 跳轉(zhuǎn)到下一個(gè)參數(shù)列表的文件
:prev: 跳轉(zhuǎn)到上一個(gè)參數(shù)列表的文件
:first: 跳轉(zhuǎn)到第一個(gè)參數(shù)列表的文件
:last: 跳轉(zhuǎn)到最后一個(gè)參數(shù)列表的文件
:args **/*.md: 將當(dāng)前文件夾下所有.md 文件加入到參數(shù)列表中 (包括子文件夾中的文件)
:argdo %s/!\[.*\]/!\[img\]/gc: 將所有參數(shù)列表中的以 ![ 開頭, 以 ] 結(jié)尾的所有字段改為 [img]
:argdo source FormatCN.vim: 對(duì)參數(shù)列表中的所有文件執(zhí)行腳本 FormatCN.vim
命令行模式
:shell: 調(diào)用系統(tǒng)的 shell 來(lái)在 vim 進(jìn)程中執(zhí)行命令, 執(zhí)行完使用 exit 退出
:term bash: 在底部分割出一個(gè)獨(dú)立窗口并調(diào)用 bash, 也可以使用 term zsh 來(lái)調(diào)用 zsh, 或 :terminal zsh
:history: all commands(equal to :his c)
:his c: commandline history
:his s: search history
<C-w> N: 在進(jìn)入 :term 的終端模式后, 使用本命令可以獲得 Normal 模式 的效果, 使用 i 返回正常的終端模式
<C-\><C-n>: 同 <C-w> N
:col<C-d>: 在 Ex 命令模式中使用補(bǔ)全查看可能的選項(xiàng), 然后使用 Tab / S-Tab 進(jìn)行選擇 / 反向選擇
<C-r><C-w>: 將當(dāng)前的光標(biāo)下的單詞 <cword> 插入到命令行中
<C-r><C-a>: 將當(dāng)前的光標(biāo)下的單詞 <CWORD> 插入到命令行中
<C-f>: 將正在命令行中輸入的內(nèi)容放入到命令行窗口開始編輯
<C-c>: 與 <C-f> 相反, 此命令可以使命令行窗口的當(dāng)前行內(nèi)容從命令行窗口放回到命令行中
<C-z>: 在終端中將 vim 最小化, 然后如果再需要調(diào)用的話使用 fg 進(jìn)行操作, 使用 jobs 查看所有處于后臺(tái)的工作
<C-b>: beginning, 在命令行模式中跳轉(zhuǎn)到行首
<C-e>: end, 在命令行模式中跳轉(zhuǎn)到結(jié)尾
<C-p>: 在命令行模式中顯示上次的命令
<C-n>: 在命令行模式中顯示下次的命令
:!!: last :! command
:~: last substitute
:!<command>: 在 shell 中執(zhí)行命令
:!sh %: 將當(dāng)前文件所有行作為輸入使用外部程序 sh 執(zhí)行, % 代表本文件所有行
!!<command>: 運(yùn)行命令并將結(jié)果作為當(dāng)前行的內(nèi)容, 同 :read!<command>, :.!<command>
:read!<command>: 將命令的結(jié)果輸入 (重定向) 到當(dāng)前緩沖區(qū)
r !printf '\%s' {a..z}: 獲得 a-z
:put=execute('echo expand(\"%:p\")'): 將當(dāng)前文件名輸出到 buffer
:put=execute('scriptnames'): 將輸出 put 到當(dāng)前 buffer 上
:enew|put=execute('scriptnames'): 新開一個(gè) buffer, 將輸出 put 到該 buffer 上
:tabnew|put=execute('scriptnames'): 新開一個(gè) tab, 將輸出 put 到該 buffer 上
:redir @">|silent scriptnames|redir END|enew|put: 使用重定向到 " 寄存器, 然后在新 buffer 上 put
:!ls: 顯示當(dāng)前工作目錄下的所有文件 (此操作屬于調(diào)用系統(tǒng)進(jìn)程, 使用! 來(lái)調(diào)用系統(tǒng)操作是 Vim 的一大特點(diǎn))
:[range]write!sh: 將當(dāng)前緩沖區(qū)的內(nèi)容, 在 shell 中逐行執(zhí)行, 與 read!<command> 作用正好相反, ! 表示外部程序
:[range]write! sh: 將當(dāng)前緩沖區(qū)的內(nèi)容, 在 shell 中逐行執(zhí)行, ! 表示外部程序
:[range]write! sh: 將當(dāng)前緩存區(qū)內(nèi)容寫入到一個(gè)名為 sh 的文件, ! 表示強(qiáng)制覆蓋式寫入
:[range]write! filename: 將當(dāng)前緩沖區(qū)內(nèi)容另存為到 filename 文件中
:.,$ sort [option] [pattern]: 從當(dāng)前行到末尾進(jìn)行排序
!: 翻轉(zhuǎn)順序, 默認(rèn)小在前, 翻轉(zhuǎn)后大在前
i: 忽略大小寫
n: numeric, 綜合數(shù)字進(jìn)行排序, 100 會(huì)排在 20 的后面
f: 浮點(diǎn)型
b: 二進(jìn)制排序
o: 八進(jìn)制排序
x: 十六進(jìn)制排序
u: 移除重復(fù)行, :sort! u 會(huì)倒序去重排序 (! 控制正反序, 默認(rèn)是正序)
pattern: When pattern is specified and there is no r flag the text matched with pattern is skipped, so that you sort on what comes after the match.
:sort /.*\%2v/: sort all lines on second column
:2,$!sort -t',' -k2: 使用外部 sort 程序進(jìn)行排序, 以 , 為分隔符, 以第二項(xiàng)進(jìn)行排序
:%!tac: 將整個(gè)文檔翻轉(zhuǎn)
:%!sort -R: 隨機(jī)排序
:%!shuf: 隨機(jī)排序
:w!sudo tee % > /dev/null: 在當(dāng)前用戶沒(méi)有權(quán)限對(duì)當(dāng)前文件做操作時(shí)使用超級(jí)管理員身份進(jìn)行操作
:ls: 列出當(dāng)前所有的緩沖區(qū)文件列表, 執(zhí)行的是 vim 的 ls 命令
:f: 顯示當(dāng)前文件路徑, (使用了 <C-g> 代替, 此項(xiàng)基本不會(huì)用了)
:command: 顯示當(dāng)前所文件的所有可使用命令
:retab: 重新生成所有的 tab(主要用于在.vimrc 中重新設(shè)置了 tab 格式, 然后在已存在舊格式 tab 的文檔進(jìn)行重生成)
:map g: 查看所有以 g 開頭的映射
echo $VIMRUNTIME: 輸出 vim 的 runtime path
echom $VIMRUNTIM: echo 的信息只能顯示一次, 之后不能查看, 使用 echom 可以通過(guò) messages 調(diào)用查看.
echom &rtp: 輸出 runtimepath
Vim 的先祖是 vi, 正是 vi 開創(chuàng)了區(qū)分模式編輯的范例. 相應(yīng)的, vi 奉 一個(gè)名為 ex 的行編輯器為先祖, 這就是為什么會(huì)有 Ex 命令.
Ex 命令在命令行模式中執(zhí)行, 而命令行模式的進(jìn)入方式為 : 鍵, 因此我們可以看到所有的 Ex 命令都是以 : 開始的, 輸入完命令后按下確定鍵 <CR> 即可執(zhí)行, 雖然 Ex 命令年代久遠(yuǎn), 但是不可否認(rèn)其語(yǔ)法的簡(jiǎn)潔明了以及高效, 很多復(fù)雜的操作往往都是通過(guò) Ex 命令來(lái)進(jìn)行處理.
:[range] <command> [target]: 執(zhí)行命令并將結(jié)果放入目標(biāo)位置
:3,5 w!bash: 將 3~5 行寫入 bash
:. w!bash: 將當(dāng)前行寫入 bash
:.!bash: 將當(dāng)前行執(zhí)行結(jié)果寫入當(dāng)前 buffer
:3,5 delete x: 將當(dāng)前行執(zhí)行結(jié)果刪除到 x 寄存器
:.,$delete x: 將當(dāng)前行到文件結(jié)尾的所有內(nèi)容刪除
:3,5 yank x: 將當(dāng)前行執(zhí)行結(jié)果復(fù)制到 x 寄存器
:. put x: 在當(dāng)前行后粘貼寄存器 x 的內(nèi)容
:3,5 copy .: 將 3~5 行復(fù)制到當(dāng)前行下
:3,5 copy $: 將 3~5 行復(fù)制到緩沖區(qū)的尾部
:3,5 move.: 將 3~5 行移動(dòng)到當(dāng)前行下
:3,5 join: 將 3~5 行進(jìn)行合并
[range] normal [cmd]: normal 用來(lái)指定在 normal 模式下對(duì)文本的操作命令
:3,5 normal .: 對(duì) 3~5 行執(zhí)行 . 重復(fù)命令
:3,5 normal @q: 對(duì) 3~5 行執(zhí)行寄存器 q 內(nèi)存儲(chǔ)的命令
'<,'> normal @a: 在所選高亮區(qū)域上執(zhí)行宏 (如果有錯(cuò)誤也不停止, 因?yàn)槭轻槍?duì)每一行執(zhí)行的, 出錯(cuò)了只需要不處理那一行就行了)
:[range] global/{pattern}/[cmd]: 對(duì)指定范圍內(nèi)匹配的所有行執(zhí)行 Ex 命令 (具體實(shí)例參見(jiàn)正則替換篇)
:3,5 s/{pattern}/{string}/[flags]: 將 3~5 行進(jìn)行相應(yīng)替換
:3,5 join: 將 3~5 行進(jìn)行合并
:3 p: 打印第 3 行
:3,5 p: 打印 3~5 行
:.,.+3 p: 打印本行以下的三行內(nèi)容, +3 代表偏移
:% p: 打印本 buffer 的所有行, % 代表所有行, 是 1:$ 的簡(jiǎn)寫
:0,$ p: 打印本 buffer 所有行, $ 代表最后一行
:.,$ p: 打印本 buffer 內(nèi)從本行到結(jié)尾的所有內(nèi)容, . 代表當(dāng)前行
/<html>/+1,/<\/html>/-1 p: 使用 patten 指定范圍, +1 表示偏移
:6t.: 把第 6 行復(fù)制到當(dāng)前行下方, tail 代表尾巴, 遵守 from...to... 的含義
:t6: 把當(dāng)前行復(fù)制到第 6 行下方, 當(dāng) . 位于首位時(shí)可以省略 ., 因此全稱是 :.t6
:t.: 粘貼當(dāng)前行到下方, 與 yyp 不同的是本方式不會(huì)將內(nèi)容放到寄存器中, 而 yyp 會(huì)將內(nèi)容復(fù)制到 unname 寄存器與 0 寄存器
:t$: 粘貼當(dāng)前行到文本結(jié)尾
:'<,'>t0: 把高亮選中的行復(fù)制到文件開頭, '< 代表高亮選取的第一行, '> 代表高亮選取的最后一行
:'<,'>m$: 把高亮選中的行移動(dòng)到文件結(jié)尾
:'<,'>A;: 把當(dāng)前文件的所有行的尾部加上 ;
Insert 模式
<C-p>: 選擇上方補(bǔ)全
<C-n>: 選擇下方補(bǔ)全
?: 退出插入模式 (推薦)
<C-c>: 退出插入模式
<C-[>: 退出插入模式
<C-u>: 向左刪除到行首
<C-w>: 向左刪除一個(gè)單詞
<C-h>: 向左刪除一個(gè)字符
<C-t>: 整行向右偏移
<C-d>: 整行向左偏移
<C + r>= <function>: 進(jìn)行計(jì)算并將結(jié)果輸出到當(dāng)前緩沖區(qū)中
<C-x><C-e>: scroll up wile staying put in insert
<C-x><C-y>: scroll down wile staying put in insert
<C-Left>: jump one word backwards
<C-Right>: jump one word forward
<C-v>065: 輸入大寫字母 A
<C-v>u{123}: 按照 unicode 碼以 10 進(jìn)制來(lái)輸入
<C-v>u{1234}: 按照 unicode 碼以 16 進(jìn)制來(lái)輸入
<C-v> <Tab>: 無(wú)論 expandtab 選項(xiàng)是否開啟都會(huì)插入制表符
插入模式中的粘貼操作參考 這里
路徑vim 的工作路徑是使用中要格外注意的地方, 簡(jiǎn)單來(lái)說(shuō), 終端中的 vim 默認(rèn)會(huì)把終端當(dāng)前的路徑作為其工作路徑, 當(dāng)然我們可以使用 cd 使其工作路徑變更
:cd [path]: 設(shè)置此次 vim 的工作目錄為 path
:cd %:h: cd 到當(dāng)前緩沖區(qū)所屬目錄中
:cd../: cd 到上一級(jí)
:pwd: 顯示當(dāng)前工作路徑
:lcd [path]: 設(shè)置當(dāng)前窗口的工作目錄為 path(與 cd 不同的是只會(huì)改變當(dāng)前 window 的工作路徑, 其他 window 的不受此影響)
vim 為我們提供了一些可以使用的宏用來(lái)表示相關(guān)路徑或文件名稱:
%: 當(dāng)前文件相對(duì)于工作路徑的文件名及擴(kuò)展
%:h: 表示當(dāng)前文件所在目錄的相對(duì)工作目錄路徑 (不含文件名及擴(kuò)展)
%:p: 表示當(dāng)前文件所在目錄的絕對(duì)路徑 (含文件名及擴(kuò)展)
%:r: 移除擴(kuò)展之后的相對(duì)工作目錄路徑所有內(nèi)容
%:e: 擴(kuò)展名
%:t: 當(dāng)前文件名 (含擴(kuò)展), 無(wú)任何目錄信息
%<: 當(dāng)前文件相對(duì)工作路徑的文件名, 無(wú)擴(kuò)展
在使用以上這幾種宏時(shí), 我們可以使用 <Tab> 使其自動(dòng)展開, 有些命令不支持自動(dòng)展開的話需要使用 expand() 命令
echo expand('%:e'): 打印當(dāng)前文檔擴(kuò)展名, markdown 是 md
cd %:h<Tab>: cd 到當(dāng)前緩沖區(qū)所屬目錄中, 在最后可以使用 <Tab> 進(jìn)行自動(dòng)展開
e %<Tab>: 會(huì)自動(dòng)擴(kuò)展為當(dāng)前文件含相對(duì)工作目錄的路徑全名
寄存器寄存器是 vim 的一種特有概念, 其他文本編輯器默認(rèn)都會(huì)用系統(tǒng)剪貼板作為復(fù)制粘貼的根據(jù)地, 然后 vim 另辟蹊徑使用多種不同類型寄存器作為臨時(shí)內(nèi)容存儲(chǔ)位置. 我們可以在復(fù)制粘貼時(shí)使用指定的寄存器定制化我們的需求, 也可以在錄制宏及使用宏時(shí)指定寄存器, 大大地提高了我們的工作效率.
很多剛使用 vim 的人會(huì)抱怨無(wú)法復(fù)制內(nèi)容到 vim 外或 vim 內(nèi), 然后各種搜索如何使 vim 的默認(rèn)復(fù)制操作與剪貼板交互, 最后定義了一大堆按鍵, 譬如 "*y, set clipboard=unnamed, 其實(shí)大可不必, 寄存器是 vim 的高效操作方式之一, 接受了這種方式才能更好地利用 vim 來(lái)為我們服務(wù) (雖然剛開始適應(yīng)的過(guò)程必然是痛苦的)
總的來(lái)說(shuō) Vim 的刪除, 復(fù)制與粘貼命令以及定義宏時(shí)都會(huì)用到眾多寄存器中的某一個(gè). 可以通過(guò)給命令加 "{register} 前綴的方式指定要用的寄存器. 若不指明, Vim 將缺省使用無(wú)名寄存器
無(wú)名寄存器
所有刪除復(fù)制粘貼操作如果不顯示指明寄存器類型的話使用的都是無(wú)名寄存器, 其標(biāo)志符是 "" / "@.
編號(hào)寄存器
從 "0 到 "9 共 10 個(gè), "0 保存著拷貝來(lái)的字符串, "1 保存著上次刪除掉的字符串, "2 保存著上上次刪除掉的字符串, 依次類推, vim 會(huì)保存最近的 9 次刪除. 刪除操作包括 s, c, d, x. 只有整行整行的刪除才會(huì)放入 "1 中.
使用 y 復(fù)制后內(nèi)容會(huì)被放到 "0 寄存器及無(wú)名寄存器中, 但是復(fù)制寄存器是穩(wěn)定的, 無(wú)名寄存器的內(nèi)容會(huì)時(shí)刻被重置替換. 其標(biāo)志符是 "0
粘貼板寄存器
用于與系統(tǒng)的其他應(yīng)用中進(jìn)行復(fù)制粘貼交互, 等于系統(tǒng)的剪貼板. 其標(biāo)識(shí)符是 "* (或 "+), 使用 set clipboard=unnamed 可以使得 "* 與 "" 始終具有相同的值
黑洞寄存器
所有放入黑洞寄存器的內(nèi)容全部被丟棄, 相當(dāng)于完全刪除, 不留痕跡, 其標(biāo)識(shí)符是 "_
有名寄存器
以單個(gè)小寫字母命名的寄存器, 可用于自定義存儲(chǔ)空間, 一共有 26 個(gè)
小刪除寄存器
不足一行的小刪除會(huì)被放到小刪除寄存器中, 刪除操作包括 s, c, d, x.
只讀寄存器
"%: 存儲(chǔ)著當(dāng)前文件名, 是當(dāng)前文件相對(duì)于工作目錄的路徑文件名
".: 存儲(chǔ)著上次插入模式中所輸入的所有文本內(nèi)容
":: 存儲(chǔ)著上次執(zhí)行的 Ex 命令, 與 @: 相對(duì)應(yīng), @: 可執(zhí)行上次的命令
交替文件寄存器
"# 存儲(chǔ)著當(dāng)前 vim 窗口的交替文件. 交替文件指 buffer 中的上一個(gè)文件, 可通過(guò) C-^ 來(lái)切換交替文件與本文件
表達(dá)式寄存器
表達(dá)式寄存器 "= 用于計(jì)算 vim 腳本的返回值, 并插入到文本中
當(dāng)我們?cè)?normal 模式下輸入 "= 后, 再輸入 3+2, 然后再使用 p 即可粘貼 5
在 insert 模式下使用 <C-R>, 然后輸入 =expand('%:p') 即可鍵入當(dāng)前文件的完整路徑名稱
搜索寄存器
"/, 存儲(chǔ)著上次搜索的關(guān)鍵字
使用方式
""p: 從無(wú)名寄存器中取值進(jìn)行粘貼
"ay: 將內(nèi)容復(fù)制到有名寄存器 a
"_y: 將內(nèi)容復(fù)制到黑洞寄存器, 相當(dāng)于徹底地刪除
qa: 錄制操作到寄存器 a 中
@a: 執(zhí)行寄存器 a 中的內(nèi)容
u@.: execute command just type in
"ap: 從自定義寄存器中取出內(nèi)容進(jìn)行粘貼
"0p: 從復(fù)制寄存器中取出內(nèi)容進(jìn)行粘貼, 默認(rèn)的 p 是從無(wú)名寄存器取值
"*p: 從系統(tǒng)粘貼板寄存器中取出內(nèi)容進(jìn)行粘貼
<C-r>": 在插入模式中將無(wú)名寄存器的內(nèi)容粘貼進(jìn)來(lái)
<C-r>*: 在插入模式中將系統(tǒng)粘貼板寄存器的內(nèi)容粘貼進(jìn)來(lái)
<C-r>0: 在插入模式中將復(fù)制寄存器的內(nèi)容粘貼進(jìn)來(lái)
<C-r>%: 插入當(dāng)前文件名 (因?yàn)?"% 寄存器中存儲(chǔ)了當(dāng)前文件名)
:reg a: 查看有名寄存器 a 的內(nèi)容
:reg *: 查看粘貼板寄存器 * 的內(nèi)容
:reg ": 查看無(wú)名寄存器 " 的內(nèi)容
:put a: 將有名寄存器 a 的內(nèi)容粘貼到當(dāng)前緩沖區(qū)中, 與 "ap 不同的是 p 用于只能在光標(biāo)之前或光標(biāo)之后進(jìn)行粘貼, 但是 put 則會(huì)始終將內(nèi)容粘貼到新的一行上
:d a: 將內(nèi)容刪除到有名寄存器 a 中
:let @q=substitute(@0, 'iphone', 'iPhone', 'g'): 對(duì)寄存器 0 的內(nèi)容進(jìn)行替換處理然后再賦值到寄存器 q
:let @*=@0: 將粘貼寄存器內(nèi)容賦值到系統(tǒng)剪貼板寄存器
:'<,'>normal @q: 執(zhí)行
let @a=@_: clear register a
let @a="" clear register a
let @a=@": save unnamed register
let @*=@a: copy register a to paste buffer
let @*=@:: copy last command to paste buffer
let @*=@/: copy last search to paste buffer
let @*=@%: copy current filename to paste buffer
使用 Visual Mode 時(shí), 在選中的文本上使用 p 將直接替換該部分文本 (替換后被替換的文本會(huì)被放入到無(wú)名寄存器中), 可用于解決需要?jiǎng)h除然后粘貼但是會(huì)影響到無(wú)名寄存器的問(wèn)題
vimdiff
git 與 vim 可以說(shuō)是非常好的一對(duì)搭檔了, 平時(shí)在終端中提交 commit 我們都少不了與 vim 打交道, vimdiff 是 vim 提供的專門用于修正 git 沖突文件的一款工具
若想使用 vimdiff 作為沖突修改工具, 需要設(shè)置 ~/.gitconfig 的以下項(xiàng)
1 2 3 4 [diff] tool = vimdiff [merge] tool = vimdiff
在 vimdiff 中, 一共有四個(gè)窗口, 上面依次是 LOCAL, BASE, REMOTE, 底部則是一個(gè)最終的文件結(jié)果窗口, 整個(gè)過(guò)程我們只需要將光標(biāo)在最下方窗口上上下移動(dòng), 使用 diffget 命令從 LOCAL, BASE, REMOTE 中選擇需要使用哪一個(gè)作為本行的最終結(jié)果 (當(dāng)然也可以跳到上面的窗口中使用 diffput 放置結(jié)果到底部窗口上
:diffget LOCAL: 選擇 LCOAL 作為本行最終結(jié)果
:diffget REMOTE: 選擇 REMOTE 作為本行最終結(jié)果
:diffget BASE: 選擇 BASE 作為本行最終結(jié)果
:diffput [num]: 放置結(jié)果到緩沖區(qū)上, num 為緩沖區(qū)編號(hào)
:diffg L: 這里 vim 為我們做了簡(jiǎn)略命令, 同樣可用于 REMTOE 與 BASE 上
:diffget //2: //2 將被替換為左側(cè)文件名
:diffget //3: //3 將被替換為右側(cè)文件名
:%diffget LO: 將所有變更使用 local 的結(jié)果
:'<'>diffget LO: 將當(dāng)前選中范圍的使用 local 的結(jié)果
dp/do: 如果只有兩個(gè)文件則可以使用 dp/do 來(lái)替代 :diffput/:diffget
:ls!: 顯示當(dāng)前所有緩沖區(qū)的號(hào)碼
[c: conflict, 移動(dòng)到上一個(gè)沖突處
]c: conflict, 移動(dòng)到下一個(gè)沖突處
$git merge --continue: 沖突全部解決完后在外界終端中使用 git merge --continue 繼續(xù)之前的 merge 操作
:diffsplit filename: 已經(jīng)在 vim 中時(shí), 使用此命令與別的文件進(jìn)行對(duì)比
:vert diffsplit filename: 同上
vimidff file1 file2: 對(duì)比 file1 與 file2 的差別
vim -d file1 file2: 同上 ??
:wqa: 沖突修復(fù)完成保存退出, 如果仍然有文件沖突則進(jìn)入下一個(gè)沖突
1 2 3 4 5 6 7 8 9 ╔═══════╦══════╦════════╗ ║ ║ ║ ║ ║ LOCAL ║ BASE ║ REMOTE ║ ║ ║ ║ ║ ╠═══════╩══════╩════════╣ ║ ║ ║ MERGED ║ ║ ║ ╚═══════════════════════╝
遠(yuǎn)程編輯可以使用如下方式編輯遠(yuǎn)程主機(jī)上的文件:
e scp://user@host//home/hanley/.sh/README.md: 通過(guò) scp 編輯遠(yuǎn)程 (使用絕對(duì)路徑)
tabnew scp://user@host//home/hanley/.sh/README.md: 使用新建 tab 的方式編輯
e scp://vm_ubuntu//home/hanley/.sh/README.md: 也可以通過(guò) ~/.ssh/config 中的 alias 進(jìn)行 key 的使用
e scp://vm_ubuntu/.sh/README.md: 也可以通過(guò) ~/.ssh/config 中的 alias 進(jìn)行 key 的使用 (使用相對(duì)路徑)
最后我的 vim 配置倉(cāng)庫(kù): HanleyLee/dotvim
本文作者 Hanley Lee, 首發(fā)于 閃耀旅途 , 如果對(duì)本文比較認(rèn)可, 歡迎 Follow