Vim Notes


因為經常在 unix/linux 環境工作,vi 一直都是最習慣的 editor。不過用了很多年,其實沒有很認真的把功能都很熟悉過,趁著年假空閒之餘,整理一些個人常用的筆記。

寫 code 或寫文章的過程,其實我不太喜歡在鍵盤跟滑鼠 (or touch pad) 之間跑來跑去,所以看過我寫 code 或者寫文章的人會發現,我習慣記很多 shortcut or hotkey,然後直接在 keyboard 上飛奔,也就是專注在思考做事的內容。套句以前老師說的話,一個 developer 最好把滑鼠剪掉,否則你的工作是沒有效率的。

除了 vi, 另外我還喜歡用 ultraedit, sublime, notepad++. 不過最喜歡的還是 vi 和 ultraedit. 不過自從工作環境換到 OS X 之後, vi 和 sublime 就變成主力了. ultraedit 在 OS X 的 IME (中文輸入法) 有不少問題, 目前我還是觀望中.


vi and vim

大部份的 unix 環境都會有 vi, 而 vim 則是 vi 的增強版, 全名是 Vi IMprove. vim 提供像是 plugin 的擴充介面, 讓其他想要使用的人, 可以自行擴充, 最常見的功能就是 syntax lighlight 的功能. 不過有一些開發環境, 像是 embedded 系統裡, 這些環境的資源不多, 所以通常只會有 vi, 而不會有 vim, 所以把 vi 基本用法學會是必要的.

vi 的模式

  1. normal mode or common mode, or c-mode, 就是只能輸入 command 的狀態
  2. insert mode (i-mode): 輸入文字的模式
  3. ed-mode or command line mode, (e-mode), 也就是按下 : 之後的模式, 會叫出 ed 這個編輯器, 可以在此輸入指令

cursor 移動,定位

以下說明 cursor (游標),由大範圍到小範圍:

  • 文章頭尾:
    • gg: 文章頭
    • G: 文章尾
  • 段落: 文章的段落是以空白行做區分
    • }: 下一個段落
    • {: 前一個段落
    • 可以加數字,表示移動的段落數,像是到下兩個段落 2}
  • 翻頁 page down / up
    • ctl + f: page down
    • ctl + b: page up
    • 在 mac 的鍵盤我就不常用這兩個, 因為 mac keyboard 只有左邊的 control, 右邊沒有. 而我習慣右手按 control …
  • 行頭、行尾
    • 0: 行頭
    • $: 行尾
  • 根據 word 移動. 英文的字是用 space 區分, 所以可以透過 移動:
    • w: 往下一個字移動, 如果是中文的文章, 則會依據 space 移動, 本文就是.
    • b: 往前一個 word 移動
    • 也可以先按數字再移動
  • cursor 上下左右: kjhl, 一樣可以搭配數字使用
  • 關鍵字強調
    • 使用 /keyword 搜尋之後, 關鍵字會被標示出來
    • noh: 關閉關鍵字, 意即 no highlight 之意

上下左右的設計是因為當時開發 vi 時,使用的機器 ADM-3A 就是用這四個字母做方向鍵,設計者只是沿用。相關參考: 为什么 Vim 使用 HJKL 键作为方向键


基本編輯

copy & paste: line mode

緩衝區複製, 貼上

  1. yy: 複製目前位, 整行資料. 2yy 複製兩行, 他配其他 cursor 定位, 做大範圍複製:
    • y$: 複製目前座標到行尾
    • y2w: 複製目前座標到兩個字的位置
    • yG: 複製目前座標到檔尾
  2. p: 從目前位置貼上.
  3. "ayy: 也就是將新複製的內容, 複製到 a clipboard, 注意要先有一個 double quot, buffer name 可以自己取, 這邊的例子是 a
  4. cc: 剪下一行

經常用的就是 yy, p, cc … 記住這幾個就可以做很多事了

copy & paste: block mode

透過選擇區域 (block), 然後進行複製貼上, 以下是使用步驟

  1. v: visual mode, 選擇要複製的區域
    • 快速選擇目前位置到某個位置, 搭配 cursor 定位使用, 像是到檔尾 vG, 到下段 v}
  2. jkhl 移動 cursor
  3. 移動到想要複製的範圍後
    • d: 剪下. d = delete = cut. x 也可以
    • y: 複製. y = yank (抽出) = copy
  4. 移動 cursor 到要貼上的地方, 按下 p
    • P: 將內容貼在此位置之前
    • p: 將內容貼在此位置之後 (常用)

注意: copy 的內容不會放到系統的 clipboard, 換句話說, 切換到其他的 application (ex: chrome), 是無法貼上的.

find by keyword

  1. 進入 e-mode
  2. 輸入 /keyword
  3. n 表示往後找, N 表示往前找

find and replace

  1. 進入 e-mode
  2. find and replace: s/keyword/replace/gi
    • g: global, 整篇文章的意思
    • i: 表示 ignore senstive, 忽略大小寫
    • keyword 都可以用 regular expression

編輯顯示輔助

  • set nu: 顯示行號
  • set nonu: 關閉行號
  • set nowrap: 關閉自行摺行, 預設 vi 都會做 warp 動作, 我有時候習慣會關掉.

    有時候會習慣直接透過滑鼠選擇範圍複製, 如果行號是打開的狀況, 那麼透過 cmd + c (OS X) or control + c (Windows), 就會複製到包含行號的內容, 這時候就需要先把行號關閉才行.

  • set syntax=on, set syntax=off: 顯示或者關閉關鍵字, vim 會透過副檔名判斷對應的 wordfile, 顯示對應的語法和關鍵字, 常見的 lanaugae, 像是 C/C++/Java/Perl/Python/Shell Script … 應該都是內建的.

    wordfile 是 ultraedit 的 syntax definition 名稱, 官方網站提供很多, 使用者可以自行下載, 或者自行編輯.

刪除

  1. x: 刪除一個 character or word
  2. dd: 刪除一整行
    • x, dd 都可以配合數字使用, 表示刪除多少單位, 像是 5dd 表示刪除五行, 5x 表示刪除五個字
  3. 配合文章定位位置, 做大段落刪除: gg, G, {, }
    • dG: 刪除現在位置到檔尾
    • d}: 刪除現在位置到下一段位置
    • 其他類推
  4. 刪除 CR, LF, 也就是換行字元, 不管是在 M$ windows, mac or unix, 只要在行尾位置, 用 J 即可. 有點類似於 windows keyboard 上的 del 的功能..

Convert tab to space

我習慣用 space 取代 tab, 用來避免在各種環境或者 editor 顯示不一的狀況, 然後讓 code format 具備一致性.

如果是第一次的 vim 環境, 那麼可以將以下設定加入 ~/.vimrc 裏:

1
2
3
4
5
" ## vim settings
set tabstop=4 " Set width of a TAB to 4
set shiftwidth=4 " Indents will have a width of 4
set softtabstop=4 " Sets the number of column for a TAB
set expandtab " Expand TABs to spaces

如此, 新建立的檔案就會將 tab 的操作, 換成 4 個 space. 如果是編輯既有檔案, 那麼可以用 replace 方式, 將 tab 換成 space: :%s/\t/ /g, 這次換成 4 個 space 的例子.

Repeat

重複上一個動作, 例如做了一個動作是刪除四個空白鍵 4x, 然後移動到下一個位置, 按 . 就會自動重複上一個動作, 類似 macro (巨集) 的概念.

有時候要做一些格式化的時候, 很好用. 如果要錄製巨集, 按 q 開始 / 結束.


分割畫面 (split screen)

有時候同時會編輯很多檔案, 那麼可以使用分割畫面的方式編輯.

水平分割 (horizontal screen)

  • e-mode 輸入 :split, 預設就是水平分割, 可以簡寫成 :sp
  • 指定檔案: :sp cURL.md
  • 在 split screen 間移動: ctl + w w, 注意是按兩次 w
  • 調整 size: resize 20 or res 20 or res +5, 數字表示目前 screen 的行數

也可以直接在 e-mode 裏輸入 new 新增另一個 screen.

垂直分割 (vertical screen)

  1. e-mode 輸入 :vsplit, 可以簡寫成 :vsp
  2. 調整 size: vertical resize 20 or vertical resize +5, 數字表示欄位數

其他

Auto-Complete

Vim 內建 Auto-Complete, 在 insert mode 用 Ctl+n 即可. 更多參考 Auto-complete programming language syntaxes


結論

這些都是一些常用的基本用法, 其實 vi 的設計精神在一些地方也看得到, 像是 Gmail / Facebook 也有一些類似的操作, 像是上下左右, 也是跟 vi 一樣.

隨著歲月的增長, 對於 vi 的使用與設計哲學, 越能夠有一些體悟, 會覺得他是越來越純香的咖啡 or 美酒.


延伸閱讀 (站內)

參考資料


Comments