《Vim使用技巧 第二版》學習筆記

這是我根據《Vim使用技巧 第二版》整理的,主要用於方便查找css

模式

普通模式

x 刪除當前字符html

u 撤銷修改git

. 重複動做shell

a 當前位置插入vim

A 行末插入(=$aapp

R 由普通模式進入替換模式ide

r 進入替換模式替換一個字符ui

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 標籤 tags it XML標籤 tags 內部

在普通模式中操做範圍文本對象

文本對象 選擇範圍
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 引用這段被捕獲的文本。若是模式中包含不止一組圓括號,則能夠用 \一、\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]

相關文章
相關標籤/搜索