這是我根據《Vim使用技巧 第二版》整理的,主要用于方便查找
模式
普通模式
x 洗掉當前字符
u 撤銷修改
. 重復動作
a 當前位置插入
A 行末插入(=$a)
R 由普通模式進入替換模式
r 進入替換模式替換一個字符
gR 進入虛擬替換模式:按螢屏上實際顯示的寬度來替換字符,而不是按檔案中所保存的字符進行替換(它會把制表符當成一組空格進行處理)
gr 進入虛擬替換模式替換一個字符
o 在下面插入一行并在下一行開頭進入插入模式
O 在上面插入一行并在上一行開頭進入插入模式
s 洗掉當前字符并進入插入模式
[count]<Ctrl-a> 把當前游標之上或之后的第一個數字加上 [count](不輸入默認為1)
在指令前加上[count]可以指定指令重復的次數(但是能用重復就不要用次數)
ga 以十進制和十六進制的形式 顯示出游標所在字符的字符編碼
插入模式
<Ctrl-w> 洗掉前一個單詞
<Ctrl-u> 洗掉至行首
<Ctrl-o> 進入插入-普通模式:在此模式中,可以執行一個普通模式命令,執行完后,馬上又回傳到插入模式
<C-r>{register} 粘貼
<C-r><C-p>{register} 按原義插入暫存器內的文本,并修正任何不必要的縮進
<C-r>={算式} 把計算的結果插入
<C-v>{123} 以十進制字符編碼插入字符
<C-v>u{1234} 以十六進制字符編碼插入字符
<C-v>{nondigit} 按原義插入非數字字符
<C-k>{char1}{char2} 插入以二合字母 {char1}{char2} 表示的字符
可視模式
在可視模式中,要先選中選區,然后再觸發修改命令,這種次序顛倒的方式對所有的運算子命令都適用
v 激活面向字符的可視模式
V 激活面向行的可視模式
<C-v> 激活面向列塊的可視模式
gv 重選上次的高亮選區
命令列模式
適用于遠距離的操作
:[number] 跳轉到制定行
:{start},{end} 選擇一個范圍
@: 重復上一個Ex命令
@@ 重復上一個 @: 的命令
<C-d> 顯示全部可以補全的命令
<C-r><C-w> 在命令中插入當前游標中的單詞
q/ 打開查找命令歷史的命令列視窗
q: 進入命令列視窗模式,在這個模式下上下選擇歷史命令的時候,按回車執行;你甚至可以在這個模式里用正常的方式修改歷史命令
:!{cmd} 呼叫外部命令
:shell 啟動一個互動的shell會話
:read !{cmd} 在shell 中執行 {cmd} ,并把其標準輸出插入游標下方
:[range]write !{cmd} 在 shell 中執行 {cmd} ,以 [range] 作為其標準輸入
:[range]!{filter} 使用外部程式 {filter} 過濾指定的 [range]
:source *.vim 執行Ex腳本
:argdo {Ex命令} 對引數串列內的所有緩沖區執行一條Ex命令
關于范圍
. 代表當前行的地址
% 代表當前檔案中的所有行
/{tag}/ {tag} 所在行
:{address}+n 偏移行
:[range]t{address} 復制 [range] 內容到 {address}
:[range]m{address} 移動 [range] 內容到 {address}
:[range]normal{操作} 對 [range] 行進行普通模式的 {操作}
operator
當一個運算子命令被連續呼叫兩次時,它會作用于當前行,如 dd 洗掉當前行
c 修改(比洗掉多一個進入插入模式)
g~ 反轉大小寫
gu 轉換為小寫
gU 轉換為大寫
> 增加縮進
< 減少縮進
= 自動縮進
! 使用外部程式過濾{motion}所跨越的行
motion
gg 將游標定位到檔案的開頭
G 將游標定位到檔案的末尾
aw 表示整個單詞
ap 表示整個段落
operator + motion 使用例
cw 洗掉從游標位置到單詞結尾間的字符,并進入插入模式
dw 洗掉從游標起始位置到單詞結尾的內容
db 洗掉從游標起始位置到單詞開頭的內容,但會原封未動地留下最后一個字符
daw 洗掉整個單詞(delete a word,推薦使用)
關于洗掉
往前洗掉不會洗掉游標本身,往后洗掉會,游標看最左邊就好理解了
關于檔案
:ls 列出所有被載入記憶體中的緩沖區的串列,% 符號指明哪個緩沖區在當前視窗中可見,# 符號則代表輪換文
件,按 <C-^> 可以在當前檔案和輪換檔案間快速切換
:pwd 列印作業目錄(print working directory)
切換緩沖區
| 命令 | 用途 |
|---|---|
:bnext |
切換到串列中的下一個緩沖區 |
:bprev |
切換到串列中的上一個緩沖區 |
:bfirst |
跳到串列的開頭 |
:blast |
跳到串列的結尾 |
:bdelete N1 N2 N3 或 :N,M bdelete |
洗掉緩沖區 |
| Glob模式 | 所匹配的檔案 |
|---|---|
:args *.* |
index.html app.js |
:args **/*.js |
app.js lib/framework.js app/controllers/Mailer.js ...etc |
:args **/*.* |
app.js index.html lib/framework.js lib/theme.css app/controllers/Mailer.js ...etc |
反引號指定檔案
:args `cat .chapters`
Vim 會在 shell 中執行反撇號(')括起來的命令,然后把 cat 命令的輸出作為 :args 命令的引數,雖然本例是用 cat 命令獲取 .chapters 檔案的內容,但實際上可以用這種方式執行任意可用的shell命令,
files/.chapters內容
the_vim_way.pml
normal_mode.pml
insert_mode.pml
visual_mode.pml
切分視窗
| 命令 | 用途 |
|---|---|
<C-w>s |
水平切分當前視窗,新視窗仍顯示當前緩沖區 |
<C-w>v |
垂直切分當前視窗,新視窗仍顯示當前緩沖區 |
:sp[lit] {file} |
水平切分當前視窗,并在新視窗中載入{file} |
:vsp[lit] {file} |
垂直切分當前視窗,并在新視窗中載入{file} |
在視窗間切換
| 命令 | 用途 |
|---|---|
<C-w>w |
在視窗間回圈切換 |
<C-w>h |
切換到左邊的視窗 |
<C-w>j |
切換到下邊的視窗 |
<C-w>k |
切換到上邊的視窗 |
<C-w>l |
切換到右邊的視窗 |
實際上,<C-w><C-w> 完成的功能和 <C-w>w 相同,就是說可以一直按住 <Ctrl> 鍵,然后輸入 ww (或 wj,或上表的其他命令)來切換活動視窗,<C-w><C-w> 要比 <C-w>w 更容易按一些,盡管寫出來時它顯得更繁瑣,
(h, j, k, l 和上下左右方向鍵是等效的)
關閉視窗
| Ex命令 | 普通模式命令 | 用途 |
|---|---|---|
:clo[se] |
<C-w>c |
關倍訓動視窗 |
:on[ly] |
<C-w>o |
只保留活動視窗,關閉其他所有視窗 |
改變視窗大小
也可以拖拽滑鼠
| 命令 | 用途 |
|---|---|
<C-w>= |
使所有視窗等寬、等高 |
<C-w>_ |
最大化活動視窗的高度 |
<C-w>| |
最大化活動視窗的寬度 |
[N]<C-w>_ |
把活動視窗的高度設為[N]行 |
[N]<C-w>| |
把活動視窗的高度設為[N]列 |
:lcd {path} 設定當前視窗的本地作業目錄
:windo lcd {path} 為一個標簽頁中的所有視窗設定本地作業目錄
標簽頁操作
| 命令 | 用途 |
|---|---|
:tabe[dit] {filename} |
在新標簽頁中打開 {filename} |
<C-w>T |
把當前視窗移到一個新標簽頁 |
:tabc[lose] |
關閉當前標簽頁及其中的所有視窗 |
:tabo[nly] |
只保留活動標簽頁,關閉所有其他標簽頁 |
在標簽頁間切換
| Ex命令 | 普通模式命令 | 用途 |
|---|---|---|
:tabn[ext] {N} |
{N}gt |
切換到編號為 {N} 的標簽頁 |
:tabn[ext] |
gt |
切換到下一標簽頁 |
:tabp[previous] |
gT |
切換到上一標簽頁 |
重排標簽頁
:tabmove [N] 重新排列標簽頁,當 [N] 為0時,當前標簽頁會被移到開頭;如果省略了 [N],當前標簽頁會被移到結尾,如果終端支持滑鼠,或是正在使用 GVim,:那么也可以通過滑鼠拖曳來進行重排操作,
檔案
打開檔案
:edit {file} 打開相對于作業目錄的檔案路徑
:edit %:h<Tab> % 符號代表活動緩沖區的完整檔案路徑,按 <Tab> 鍵會將其展開,:h 修飾符會去除檔案名,但保留路徑中的其他部分
:find {file} 在 path 里查找檔案并打開
:set path+={path} 把 {path} 加入查找路徑中
特殊的保存檔案
把檔案保存到不存在目錄中
:edit {file} 命令一般用于打開一個已存在的檔案,然而如果指定了一個不存在的檔案路徑,Vim 就會創建一個新的空白緩沖區,
:!mkdir -p %:h -p 引數使 mkdir 創建任何不存在的中間目錄,%:h 為不包含檔案名的路徑
用超級用戶權限保存檔案
:w !sudo tee % > /dev/null
快速移動和跳轉
行移動
| 命令 | 游標動作 |
|---|---|
j |
向下移動一個實際行 |
gj |
向下移動一個螢屏行 |
k |
向上移動一個實際行 |
gk |
向上移動一個螢屏行 |
0 |
移動到實際行的行首 |
g0 |
移動到螢屏行的行首 |
^ |
移動到實際行的第一個非空白字符 |
g^ |
移動到螢屏行的第一個非空白字符 |
$ |
移動到實際行的行尾 |
g$ |
移動到螢屏行的行尾 |
j, k, 0, $ 都用于實際行,加上 g 前綴用于螢屏行
單詞移動
| 命令 | 游標動作 |
|---|---|
w |
正向移動到下一單詞的開頭 |
b |
反向移動到當前單詞/上一單詞的開頭 |
e |
正向移動到當前單詞/下一單詞的結尾 |
ge |
反向移動到上一單詞的結尾 |
先學會用 w 和 b
W, B, E 和 gE 對應”字串“的操作
查找字符
下表為行內操作
| 命令 | 用途 |
|---|---|
f{char} |
正向移動到下一個 {char} 所在之處 |
F{char} |
反向移動到上一個 {char} 所在之處 |
t{char} |
正向移動到下一個 {char} 所在之處的前一個字符上 |
T{char} |
反向移動到上一個 {char} 所在之處的后一個字符上 |
; |
重復上次的字符查找命令 |
, |
反轉方向查找上次的字符查找命令 |
/{word} 或者 把游標移到單詞上按* 查找單詞
n 向下重復上一次查找單詞操作
N 向上重復上一次查找單詞操作
在可視模式中選擇分割符文本物件
選擇時游標必須在分割符內
一般以 i 開頭的文本物件會選擇分隔符內部的文本,而以 a 開頭的文本物件會選擇包括分隔符在內的整個文本,為了便于記憶,可以把 i 想成“inside”,而把 a 想成“around”或“all”,
| 文本物件 | 選擇區域 | 文本物件 | 選擇區域 |
|---|---|---|---|
a) 或 ab |
一對圓括號 (parentheses) | i) 或 ib |
圓括號 (parentheses) 內部 |
a} 或 aB |
一對花括號 {braces} | i} 或 iB |
花括號 {braces} 內部 |
a] |
一對方括號 [brackets] | i] 方括號 |
[brackets] 內部 |
a> |
一對尖括號 | i> |
尖括號 內部 |
a' |
一對單引號 'single quotes' | i' |
單引號 'single quotes' 內部 |
a" |
一對雙引號 "double quotes" | i" |
雙引號 "double quotes" 內部 |
a` | 一對反引號 backticks | i` |
反引號 backticks 內部 | ||
at |
一對 XML 標簽 |
it |
XML標簽 |
在普通模式中操作范圍文本物件
| 文本物件 | 選擇范圍 |
|---|---|
iw |
當前單詞 |
aw |
當前單詞及一個空格 |
iW |
當前字串 |
aW |
當前字串及一個空格 |
is |
當前句子 |
as |
當前句子及一個空格 |
ip |
當前段落 |
ap |
當前段落及一個空行 |
一般來說,d{motion} 命令和 aw、as 和 ap 配合起來使用比較好,而 c{motion} 命令和 iw 及類似的文本物件一起用效果會更好,
做標記
m{a-zA-Z} 用選定的字母標記當前游標所在位置,小寫位置標記只在每個緩沖區區域可見,大寫位置標記則全域
可見,
`{mark} 把游標移動到設定此位置標記時游標所在之處
'{mark} 跳到位置標記所在行,并把游標置于該行第一個非空白字符上
自動位置標記
| 位置標記 | 跳轉到 |
|---|---|
`` |
當前檔案中上次跳轉動作之前的位置 |
`. |
上次修改的地方 |
`^ |
上次插入的地方 |
`[ |
上次修改或復制的起始位置 |
`] |
上次修改或復制的結束位置 |
`< |
上次高亮選區的起始位置 |
`> |
上次高亮選區的結束位置 |
% 在一組開、閉括號間跳轉
在 .vimrc 中加入以下內容可以激活 matchit 插件,它可以使 % 在配對的關鍵字間跳轉:
set nocompatible
filetype plugin on
runtime macros/matchit.vim
遍歷跳轉串列
:jumps 查看跳轉串列
<C-o> 后退
<C-i> 前進
遍歷改變串列
:changes 查看改變串列
g; 反向
g, 正向
跳轉到檔案
把游標放到某個字串上執行 gf 命令,可以跳轉到該檔案,
指定擴展名:suffixesadd 選項允許指定一個或多個檔案擴展名,當 Vim 用gf 命令搜尋檔案名時,會嘗試使用這些擴展名,用下面的命令可以設定此選項:
:set suffixesadd+=.h
指定搜尋目錄:設定 path(同上 find 的使用)
暫存器
{register}x 剪切字符
{register}d 剪切
{register}y 復制
{register}p 粘貼到游標后
{register}P 粘貼到游標前
{register}gp 粘貼到游標后,游標移動到被粘貼出來的文本結尾
{register}gP 粘貼到游標前,游標移動到被粘貼出來的文本結尾
:reg {register} 查看暫存器內容
register
"0 復制專用暫存器
"a - "z 有名暫存器
_ 黑洞暫存器
"+ 系統剪貼板
"* 選擇專用暫存器
"= 運算式暫存器
只讀暫存器
| 暫存器 | 內容 |
|---|---|
"% |
當前檔案名 |
"# |
輪換檔案名 |
". |
上次插入的文本 |
": |
上次執行的Ex命令 |
"/ |
上次查找的模式 |
交換單詞:在可視模式下使用 p 命令時,Vim將用指定的暫存器內容來替換高亮選區中的文本,高亮選區中的內容與暫存器的文本被調包了,
宏
在錄制宏的程序中,禁止使用滑鼠
q{register} 開始錄制(如果 register 是大寫,新內容會被追加到對應小寫暫存器的后面)
q 停止錄制
@{register} 執行宏
@@ 重復最近呼叫過的宏
:normal @{register} 在高亮選區中的每一行上執行這個宏
模式匹配
\c 查找模式忽略大小寫
\C 查找模式強制大小寫
\v 表示特殊含義
\V 使得其后的模式中只有反斜杠有特殊的意義
| 模式 | 說明 |
|---|---|
#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\) |
使用 magic 搜索模式時,必須轉義 (、)、以及 { 字符,賦予它們特殊的含義 |
\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3}) |
使用 \v 模式開關后,(、)、以及 { 字符會表現出特殊含義 |
\v#(\x{6}|\x{3}) |
使用 \x 字符類代替 [0-9A-Fa-f],可以進一步精簡運算式 |
任何圓括號內部的匹配文本都會自動保存到一個臨時的倉庫,可以用 \1 參考這段被捕獲的文本,如果模式中包含不止一組圓括號,則可以用 \1、\2,直到 \9,參考被每對 () 捕獲的子匹配,另外,不論模式中是否使用了圓括號,元字符 \0 永遠會參考整個匹配,在括號前加上 % 可以不把內容賦值到暫存器中,
< 與 > 兩符號將用于匹配單詞的邊界,它們本身不匹配任何字符,僅表示單詞與圍繞此單詞的空白字符(或標點符號)之間的邊界,
例: /\v<(\w+)\_s+\1> 專門用于匹配重復單詞
元字符 \zs 標志著一個匹配的起始,元字符 \ze 則用來界定匹配的結束,
例:如果查找 /Practical Vim,檔案中所有出現 “Practical Vim” 的地方都會被高亮起來,一旦將查找模式改為 /Practical \zsVim,則只有單詞 “Vim” 會被高亮,而單詞 “Practical” 會被排除于匹配之外,但它仍是模式的一部分,這樣一來,只有緊跟著單詞 “Practical” 的 “Vim” 才會被高亮,其他前面不是 “Practical” 的 “Vim” 則不會被匹配,這與通過 /Vim 命令進行簡單查找的結果有很大不同,
| 命令 | 用途 |
|---|---|
n |
跳至下一處匹配,保持查找方向與偏移不變 |
N |
跳至上一處匹配,保持查找方向與偏移不變 |
/<CR> |
正向跳轉至相同模式的下一處匹配 |
?<CR> |
反向跳轉至相同模式的上一處匹配 |
gn |
進入面向字符的可視模式,并選中下一處匹配 |
gN |
進入面向字符的可視模式,并選中上一處匹配 |
正向查找時要轉義 / 字符,反向查找時要轉義 ? 號,每次都要轉義符號 \
escape({string}, {chars}) {chars} 引數將指定哪些字符需要用反斜杠轉義
在最后添加 /e 可以讓游標停留在查找匹配的結尾
統計匹配總數
/{something}
:%s///gn
或者
/{something}
:vimgrep //g %
前者告訴我們總數,后者告訴我們每個所在的位置
substitute
:[range]s[ubstitute]/{pattern}/{string}/[flags]
輸入 <C-r>{register} 可以將暫存器的內容插入命令列
標志位
標志位 g 使得 subsititute 命令可在全域范圍內執行,即可以修改一行內的所有匹配,而不僅僅是第一處匹配,
標志位 c 讓我們有機會可以確認或拒絕每一處修改,
標志位 n 會抑制正常的替換行為,即讓 Vim 不執行替換操作,而只是報告本次 substitute 命令匹配的個數,
標志位 e 專門用于屏蔽錯誤提示,
標志位 & 僅僅用于指示 Vim 重用上一次 substitute 命令所用過的標志位,
特殊字符
| 符號 | 描述 |
|---|---|
\r |
插入一個換行符 |
\t |
插入一個制表符 |
\\ |
插入一個反斜杠 |
\1 |
插入第1個子匹配 |
\2 |
插入第2個子匹配(以此類推,最多到 \9) |
\0 |
插入匹配模式的所有內容 |
& |
插入匹配模式的所有內容 |
~ |
使用上一次呼叫 :substitute 時的 {string} |
\={Vim script} |
執行 {Vim Script} 運算式;并將回傳的結果作為替換 {string} |
手動決定每一次替換——答案的含義
| 答案 | 用途 |
|---|---|
y |
替換此處匹配 |
n |
忽略此處匹配 |
q |
退出替換程序 |
l |
“last” —— 替換此處匹配后退出 |
a |
“all” —— 替換此處與之后所有的匹配 |
<C-e> |
向上滾動螢屏 |
<C-y> |
向下滾動螢屏 |
:cfdo {cmd} 修改所有 quickfix 串列上的檔案
global
:[range] global[!] /{pattern}/ [cmd]
在預設情況下,global 命令的作用范圍是整個檔案,
{pattern} 域與查找歷史相互關聯,
global! 將指示 Vim 在沒有匹配到指定模式的行上執行 [cmd]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/212401.html
標籤:Linux
