Vim真的很酷:D
正常模式:在檔案中四處移動光标進行修改
插入模式:插入文本
替換模式:替換文本
可視化(一般,行,塊)模式:選中文本塊
指令模式:用于執行指令
在不同的操作模式下,鍵盤敲擊的含義也不同。比如,<code>x</code> 在插入模式會插入字母<code>x</code>,但是在正常模式 會删除目前光标所在的字母,在可視模式下則會删除選中文塊。
在預設設定下,Vim會在左下角顯示目前的模式。 Vim啟動時的預設模式是正常模式。通常你會把大部分 時間花在正常模式和插入模式。
你可以按下 <code><ESC></code> (退出鍵) 從任何其他模式傳回正常模式。 在正常模式,鍵入 <code>i</code> 進入插入 模式, <code>R</code> 進入替換模式, <code>v</code> 進入可視(一般)模式, <code>V</code> 進入可視(行)模式, <code><C-v></code> (Ctrl-V, 有時也寫作 <code>^V</code>)進入可視(塊)模式, <code>:</code> 進入指令模式。
因為你會在使用 Vim 時大量使用 <code><ESC></code> 鍵,是以可以考慮把大小寫鎖定鍵重定義成 <code><ESC></code> 鍵
插入文本
在正常模式,鍵入 <code>i</code> 進入插入模式。現在 Vim 跟很多其他的編輯器一樣,直到你鍵入<code><ESC></code> 傳回正常模式。 你隻需要掌握這一點和上面介紹的所有基礎知識就可以使用 Vim 來編輯檔案了 (雖然如果你一直停留在插入模式内不一定高效)。
<code>:q</code> 退出(關閉視窗)
<code>:w</code> 儲存(寫)
<code>:wq</code> 儲存然後退出
<code>:e {檔案名}</code> 打開要編輯的檔案
<code>:ls</code> 顯示打開的緩存
打開幫助文檔
<code>:help :w</code> 打開 <code>:w</code> 指令的幫助文檔
<code>:help w</code> 打開 <code>w</code> 移動的幫助文檔
多數時候你會在正常模式下,使用移動指令在緩存中導航。在 Vim 裡面移動也被稱為 “名詞”, 因為它們指向文字塊。
基本移動: <code>hjkl</code> (左, 下, 上, 右)
詞: <code>w</code> (下一個詞), <code>b</code> (詞初), <code>e</code> (詞尾)
行: <code>0</code> (行初), <code>^</code> (第一個非空格字元), <code>$</code> (行尾)
螢幕: <code>H</code> (螢幕首行), <code>M</code> (螢幕中間), <code>L</code> (螢幕底部)
翻頁: <code>Ctrl-u</code> (上翻), <code>Ctrl-d</code> (下翻)
檔案: <code>gg</code> (檔案頭), <code>G</code> (檔案尾)
行數: <code>:{行數}<CR></code> 或者 <code>{行數}G</code> ({行數}為行數)
雜項: <code>%</code> (找到配對,比如括号或者 /* */ 之類的注釋對)
查找:
查找/到 向前/向後 在本行的{字元}
<code>,</code> / <code>;</code> 用于導航比對
搜尋: <code>/{正規表達式}</code>, <code>n</code> / <code>N</code> 用于導航比對
可視化模式:
可視化:<code>v</code>
可視化行: <code>V</code>
可視化塊:<code>Ctrl+v</code>
可以用移動指令來選中。
你可以用一個計數來結合“名詞”和“動詞”,這會執行指定操作若幹次。
<code>3w</code> 向前移動三個詞
<code>5j</code> 向下移動5行
<code>7dw</code> 删除7個詞
你可以用修飾語改變“名詞”的意義。修飾語有 <code>i</code>,表示“内部”或者“在内“,和 <code>a</code>, 表示”周圍“。
<code>ci(</code> 改變目前括号内的内容
<code>ci[</code> 改變目前方括号内的内容
<code>da'</code> 删除一個單引号字元串, 包括周圍的單引号
<code>:s</code> (替換)指令(文檔)。
在整個檔案中将 foo 全局替換成 bar
将有命名的 Markdown 連結替換成簡單 URLs
用 <code>:sp</code> / <code>:vsp</code> 來分割視窗
同一個緩存可以在多個視窗中顯示。
<code>q{字元}</code> 來開始在寄存器<code>{字元}</code>中錄制宏
<code>q</code>停止錄制
<code>@{字元}</code> 重放宏
宏的執行遇錯誤會停止
<code>{計數}@{字元}</code>執行一個宏{計數}次
宏可以遞歸
首先用<code>q{字元}q</code>清除宏
錄制該宏,用 <code>@{字元}</code> 來遞歸調用該宏 (在錄制完成之前不會有任何操作)
例子:将 xml 轉成 json (file)
一個有 “name” / “email” 鍵對象的數組
用一個 Python 程式?
用 sed / 正規表達式
<code>g/people/d</code>
<code>%s/<person>/{/g</code>
<code>%s/<name>\(.*\)<\/name>/"name": "\1",/g</code>
…
Vim 指令 / 宏
<code>Gdd</code>, <code>ggdd</code> 删除第一行和最後一行
格式化最後一個元素的宏 (寄存器<code>e</code>)
跳轉到有 <code><name></code> 的行
<code>qe^r"f>s": "<ESC>f<C"<ESC>q</code>
格式化一個
的宏
跳轉到有 <code><person></code> 的行
<code>qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q</code>
标簽然後轉到另外一個的宏
<code>qq@pjq</code>
執行宏到檔案尾
<code>999@q</code>
手動移除最後的 <code>,</code> 然後加上 <code>[</code> 和 <code>]</code> 分隔符