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 的模式
- normal mode or common mode, or c-mode, 就是只能輸入 command 的狀態
- insert mode (i-mode): 輸入文字的模式
- ed-mode or command line mode, (e-mode), 也就是按下
:
之後的模式, 會叫出ed
這個編輯器, 可以在此輸入指令
cursor 移動,定位
以下說明 cursor (游標),由大範圍到小範圍:
- 文章頭尾:
gg
: 文章頭G
: 文章尾
- 段落: 文章的段落是以空白行做區分
}
: 下一個段落{
: 前一個段落- 可以加數字,表示移動的段落數,像是到下兩個段落
2}
- 翻頁 page down / up
ctl + f
: page downctl + 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
緩衝區複製, 貼上
yy
: 複製目前位, 整行資料.2yy
複製兩行, 他配其他 cursor 定位, 做大範圍複製:
y$
: 複製目前座標到行尾y2w
: 複製目前座標到兩個字的位置yG
: 複製目前座標到檔尾
p
: 從目前位置貼上."ayy
: 也就是將新複製的內容, 複製到 a clipboard, 注意要先有一個 double quot, buffer name 可以自己取, 這邊的例子是a
cc
: 剪下一行
經常用的就是 yy
, p
, cc
… 記住這幾個就可以做很多事了
copy & paste: block mode
透過選擇區域 (block), 然後進行複製貼上, 以下是使用步驟
v
: visual mode, 選擇要複製的區域
- 快速選擇目前位置到某個位置, 搭配 cursor 定位使用, 像是到檔尾
vG
, 到下段v}
- 用
jkhl
移動 cursor - 移動到想要複製的範圍後
d
: 剪下. d = delete = cut.x
也可以y
: 複製. y = yank (抽出) = copy
- 移動 cursor 到要貼上的地方, 按下
p
P
: 將內容貼在此位置之前p
: 將內容貼在此位置之後 (常用)
注意: copy 的內容不會放到系統的 clipboard, 換句話說, 切換到其他的 application (ex: chrome), 是無法貼上的.
find by keyword
- 進入
e-mode
- 輸入
/keyword
n
表示往後找,N
表示往前找
find and replace
- 進入
e-mode
- 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) orcontrol + c
(Windows), 就會複製到包含行號的內容, 這時候就需要先把行號關閉才行.set syntax=on
,set syntax=off
: 顯示或者關閉關鍵字, vim 會透過副檔名判斷對應的wordfile
, 顯示對應的語法和關鍵字, 常見的 lanaugae, 像是 C/C++/Java/Perl/Python/Shell Script … 應該都是內建的.wordfile 是 ultraedit 的 syntax definition 名稱, 官方網站提供很多, 使用者可以自行下載, 或者自行編輯.
刪除
x
: 刪除一個 character or worddd
: 刪除一整行
x
,dd
都可以配合數字使用, 表示刪除多少單位, 像是5dd
表示刪除五行,5x
表示刪除五個字
- 配合文章定位位置, 做大段落刪除:
gg
,G
,{
,}
dG
: 刪除現在位置到檔尾d}
: 刪除現在位置到下一段位置- 其他類推
- 刪除
CR
,LF
, 也就是換行字元, 不管是在 M$ windows, mac or unix, 只要在行尾位置, 用J
即可. 有點類似於 windows keyboard 上的del
的功能..
Convert tab to space
我習慣用 space 取代 tab, 用來避免在各種環境或者 editor 顯示不一的狀況, 然後讓 code format 具備一致性.
如果是第一次的 vim 環境, 那麼可以將以下設定加入 ~/.vimrc
裏:
1 | " ## vim settings |
如此, 新建立的檔案就會將 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
orres 20
orres +5
, 數字表示目前 screen 的行數
也可以直接在 e-mode
裏輸入 new
新增另一個 screen.
垂直分割 (vertical screen)
- 在
e-mode
輸入:vsplit
, 可以簡寫成:vsp
- 調整 size:
vertical resize 20
orvertical resize +5
, 數字表示欄位數
其他
Auto-Complete
Vim 內建 Auto-Complete, 在 insert
mode 用 Ctl+n
即可. 更多參考 Auto-complete programming language syntaxes
結論
這些都是一些常用的基本用法, 其實 vi 的設計精神在一些地方也看得到, 像是 Gmail / Facebook 也有一些類似的操作, 像是上下左右, 也是跟 vi 一樣.
隨著歲月的增長, 對於 vi 的使用與設計哲學, 越能夠有一些體悟, 會覺得他是越來越純香的咖啡 or 美酒.