vim基本款設定與常用指令、按鍵整理

去客戶那邊的時候,vim 設定一定都要重來過的,如何在最快的時間設定成自己想要的樣子?

目前自己的基本設定

set et
set ts=2
set sw=2
set autoindent
set nu
colorscheme desert

這樣就足夠了,太多也記不住。

再來是常用指令

指令說明
:set wrap超過螢幕寬度就換行
:set nowrap超過螢幕寬度不換行
/\ccopyright
:set ignorecase
搜尋不分大小寫,可參閱 :help ignorecase:help smartcase
:set nu顯示行號
:set nu!隱藏行號
:tabedit filename在新頁籤開啟指定檔案
:tabnew開新頁籤
:ls列出所有開啟的檔案 (buffer)
:b1切到第一個檔案 (buffer)
:set paste設定為貼上,不要管 auto indent
:set nopaste不要設定為貼上,這樣若有 autoindent 時,會自動縮排
:wq最重要的指令,存檔然後離開。若加上 ! 表示強制存檔後離開。
:set mouse= 或 :set mouse=r 或 :set mouse=v 設定不要為 a 就可以使用標準系統的選取、複製模式

常用按鍵

Mode按鍵說明
Normalctrl+w s分割畫面-橫切
Normalctrl+w v分割畫面-直切
Normalctrl+w c關閉當前窗格
Normalctrl+w j / ctrl+w k / ctrl+w h / ctrl+w l移到下面/上面/左邊/右邊的窗格
Normalgt到下個頁籤
NormalgT到上個頁籤
Insertctrl+x ctrl+p表示往前找有輸入過的來作自動完成
Insertctrl+x ctrl+f自動完成檔名

參考資料

vim錄按鍵順序

這用 Google 查好幾次了,決定記錄一下。

在使用 vim 編輯時,難免會遇到重複性很高的工作,vim 有個功能,就是可以錄製按鍵順序。錄製完成以後,可以再次播放剛剛錄製的按鍵順序,這樣就可以省下很多苦工。

要開始錄製,先確定在 normal mode 下,按下 q ,接著按下 a ,這個 a 是 register 的意思,簡單的說,是個代號,表示把按鍵順序放到 a 這個 register 裡。如果你要錄製其他按鍵順序,可以用 b, c, d, e … 以此類推。

接下來,就是要按下你要記錄的按鍵順序,例如移到行首,換掉第一個字元等等的。

等到順序都錄製完了,回到 normal mode ,按下 q 停止錄製。

之後要播放按鍵順序時,就是按下 @ ,然後按下 a ,這就表示要播放 a register 裡的按鍵順序。要重複播放上一次的按鍵順序,用 @@ ;要重複播放 20 次,就用 20@

參考資料

Macbook 的 Touchbar 與 ESC

前幾天用 android studio 的 vim mode 打字打到一半,發現 Touchbar 上的 ESC 不見了,靠北,啊這樣是要怎麼打字打下去? 找了一下,在 macos – Esc button from touchbar has disappeared – Ask Different 找到解法,用

sudo pkill TouchBarServer

就可以找回失落的 ESC

在那個時間點,有上推特分享,推友跟我分享了不少方法:

  • 按 Ctrl + [ ,這個就等於是 ESC
  • 按 Command + ~
  • 用虛擬鍵盤
  • 按 Ctrl + C
  • 外接鍵盤
  • 把 jj 對應為 ESC

有點不好意思的是,這些我都還沒試過,先記下來,以免日後再次遇到。

vim – 查按鍵定義

Embed from Getty Images

雖說常用 vim,但是我幾乎是沒什麼在定義按鍵,都是沿用 plugin 的定義,所以用了一堆 plugin 之後,難免會遇到衝突的情況。

那麼要怎麼查按鍵的定義呢?除了可以用 grep/ag 來找 vimrc/plugin 裡的定義之外,也可以在執行 vim 以後,用 :verbose map 來查

" 我的 leader key 是 \
" 以下就是查 \gg 會執行的指令
:verbose map <leader>gg

步驟:

  1. 先按冒號 ‘:’ ,游標會移到下方,進入 last line mode
  2. 在下方輸入 verbose map <leader>gg
  3. 輸入完按 Enter,就會看到 vim 印出按鍵的定義與上次定義的位置
  4. 再按一次 Enter,就會關閉回到 Normal mode

印出的結果 (會因為你的按鍵定義而異)

n  \gg         * :EXGSearchCWordW
        上次設定: ~/exvim/vimfiles/bundle/ex-utility/autoload/ex/keymap.vim line 37

gv.vim / committia.vim

之前看到有人介紹 gv.vim 跟 committia.vim,試了一下,真的挺不錯的。

gv.vim 是 git commit browser,文件上只有提 vim-plug 的安裝,但我試的結果,Vundle 也可以安裝。
裝了以後,用 :GV 就可以開啟 commit browser,挺方便的。我之前是都到 terminal 用 tig 這個指令來看,現在有 gv.vim ,就不需要特別離開 vim ,到 terminal 了。

committia.vim 是可以在 git commit 時,可以直接看到檔案變更 (diff) 的 plugin 。之前是開另外一個 terminal ,輸入 git diff 來看 ,或是在 git commit 前先 git diff 來看。

ultisnips/vim-snippets

本來是打算用 snipmate 的,但看到這篇 UltiSnips 让 Vim 飞起来 – 吕小荣 ,馬上轉投 UltiSnips 。XD

安裝與設定上沒什麼困難。

" Install ultisnips using Vundle
Plugin 'SirVer/ultisnips'
Plugin 'honza/vim-snippets'

裝好以後,輸入特定的關鍵字 (關鍵字要自己去挖 vim-snippets 下的 UltiSnips/snippets 資料夾裡的檔案),再按 tab ,就會自動出現 snippet,如果 snippet 有指定 ${1:pass} 之類的,可以在輸入完畢以後,用 ctrl + j 或 ctrl + k 來切到上一個或下一個位置。

我卡到的問題是自訂的 snippets 沒被載入。找了半天,才發現我把 UltiSnips 資料夾放錯位置。(把我的時間還來!!)

UltiSnips 的 python docstring 可以自訂,看格式是要用 google, sphinx, doxygen, numpy 還是 jedi 的格式。在 .vimrc 裡放下面這行就可以了:

let g:ultisnips_python_style="google"

Vim C-] 失效

問題描述:vim 裡確定 tags 的設定都正確,但按下 Ctrl-] 卻沒有跳到游標所在函式的定義。

問題發生要件:

  1. 使用 gcin
  2. 使用 gnome-terminal, terminator … 等非 xterm 的終端機程式

原因:

gcin 設定的「內定輸入法」裡,「Ctrl 輸入標點符號」被勾選了。將這個設定取消,就沒有問題了,因為勾選時, gcin 會將 Ctrl-] 轉譯為 “」”。