tl;dr
- キーマッピングはぶっちゃけ好み
- 私好みのキーマッピングはこうですよという話
- お前のキーマッピングは間違っている的なレスお待ちしております
おしながき
キー | マッピング対象 |
---|---|
<Space> | 標準コマンドのPrefix |
, (カンマ) | <Leader> 割当用かつ言語系以外の共通プラグインのPrefix |
\\ (バックスラッシュ) | <LocalReader> 割当用かつ言語別プラグインのPrefix |
<C-j> | FuzzyFinder(denite.nvim, fzf.vim)のPrefix |
<C-n> , <C-p> | QuickFixの移動(:cnext , :cprevious )を割当 |
H , L | ^ をマップ |
K | 言語毎のドキュメント参照コマンド割当 |
s | vim-sandwich用 |
上記表がすべてなのですが、
一応解説を以下に記載しました。暇つぶしにどうぞ
- デフォルトキーマップ解説
- 1文字右へ移動
- ルール
- プラグインのコマンドを割当しない
- 標準コマンドのショートカットを割当する
- 標準キーバンドの打ちづらいキーを割当する
- 自作関数の割当する
例
# .vimrcのリロード nnoremap <Space>s :source $HOME/.vimrc<CR> # ファイル保存のショートカット nnoremap <silent><Space>w:<C-u>w<CR> # <c-^>のショートカット nnoremap <Space><Space><c-^> # QuickFixのトグル function! ToggleQuickfix()letl:nr = winnr('$')cwindowletl:nr2 = winnr('$')ifl:nr ==l:nr2 ccloseendifendfunction nnoremap <script><silent><Space>f:call ToggleQuickfix()<CR>
,(カンマ)
- デフォルトキーマップ解説
f*
と押した場合にカーソル位置から右の*
に移動するが、,(カンマ)
はそれを左方向に繰り返す
- ルール
<Leader>
として扱う- 上記
<Space>
に該当するコマンドは割当しない - プラグインのコマンドのPrefixとして用いる
- プラグラミング言語毎のプラグインのコマンドを割当しない
例
nnoremap <Leader>r:<C-U>QuickRun<CR> xnoremap <Leader>r gv:<C-U>QuickRun<CR>
nnoremap <silent><Leader>t:<C-u>NERDTreeToggle<CR> nnoremap <silent><Leader>f:<C-u>NERDTreeFind %<CR>
nnoremap <Leader>o:<C-u>TagbarToggle<CR>
" Add comment to beginning line(consider whitespace) nnoremap <Leader>c<Plug>(caw:hatpos:toggle) vnoremap <Leader>c<Plug>(caw:hatpos:toggle)" Add comment to beginning line(ignore whitespace) nnoremap <Leader>,<Plug>(caw:zeropos:toggle) vnoremap <Leader>,<Plug>(caw:zeropos:toggle)
nnoremap <Leader>b<Plug>(openbrowser-smart-search) vnoremap <Leader>b<Plug>(openbrowser-smart-search)
(バックスラッシュ)
- デフォルトキーマップ解説
- キーマップ拡張のために空けてある
- ルール
<LocalLeader>
として扱う- 上記
,(カンマ)
に該当するコマンドは割当しない - プラグラミング言語毎のプラグインのコマンドを割当する
- autocmdを用いて、各言語毎にキーマップが切り替わるようにする
例
augroup GoCommands autocmd! autocmd FileTypego nnoremap <silent><LocalLeader>r<Plug>(go-run) autocmd FileTypego nnoremap <silent><LocalLeader>b<Plug>(go-build) autocmd FileTypego nnoremap <silent><LocalLeader>tt <Plug>(go-test) autocmd FileTypego nnoremap <silent><LocalLeader>tf<Plug>(go-test-func) autocmd FileTypego nnoremap <silent><LocalLeader>ts:<C-u>GoTests autocmd FileTypego nnoremap <silent><LocalLeader>ta:<C-u>GoTestsAll autocmd FileTypego nnoremap <silent><LocalLeader>m<Plug>(go-imports) autocmd FileTypego nnoremap <silent><LocalLeader>i<Plug>(go-install) autocmd FileTypego nnoremap <silent>K <Plug>(go-doc) autocmd FileTypego nnoremap <silent><LocalLeader>d<Plug>(go-doc-browser) autocmd FileTypego nnoremap <silent><LocalLeader>R <Plug>(go-rename) autocmd FileTypego nnoremap <silent><LocalLeader>c<Plug>(go-coverage-toggle) autocmd FileTypego nnoremap <silent><LocalLeader>n<Plug>(go-referrers) autocmd FileTypego nnoremap <silent><LocalLeader>a<Plug>(go-alternate-edit) autocmd FileTypego nnoremap <silent><LocalLeader>e<Plug>(go-iferr) autocmd FileTypego nnoremap <silent><LocalLeader>p<Plug>(go-implements) augroup END
letg:jedi#goto_command ="<C-]>"letg:jedi#goto_assignments_command ="<Localleader>g"letg:jedi#goto_definitions_command =""letg:jedi#documentation_command ="K"letg:jedi#usages_command ="<Localleader>n"letg:jedi#rename_command ="<Localleader>R"
augroup PylsCommands autocmd! autocmd FileType python nnoremap <C-]>:<C-u>LspDefinition<CR> autocmd FileType python nnoremap K :<C-u>LspHover<CR> autocmd FileType python nnoremap <LocalLeader>R :<C-u>LspRename<CR> autocmd FileType python nnoremap <LocalLeader>n:<C-u>LspReferences<CR> augroup END
- デフォルトキーマップ解説
- 1行下へ移動
- ルール
- FuzzyFinderプラグインのPrefix
<C-j>
の後続のキーはCtrlとの同時押しキー(<C-某>
)とする
例
" Current direcotry files nnoremap <silent><C-j><C-p>:<C-u>Denite file/rec/git -highlight-mode-insert=Search<CR>" Buffer files nnoremap <silent><C-j><C-b>:<C-u>Denite buffer -highlight-mode-insert=Search<CR>" Outline current file nnoremap <silent><C-j><C-o>:<C-u>Denite outline -highlight-mode-insert=Search<CR>" Reccent file nnoremap <silent><C-j><C-r>:<C-u>Denite file_old -highlight-mode-insert=Search<CR>" Help tag nnoremap <silent><C-j><C-h>:<C-u>Denite help -highlight-mode-insert=Search<CR>
" Gather files recursive and nominates all file names under the search directory nnoremap <silent><C-j><C-j>:<C-u>Files<CR>" Git Status nnoremap <silent><C-j><C-g>:<C-u>GFiles?<CR>" Ctags index project nnoremap <silent><C-j><C-]>:<C-u>Tags<CR>" My cli setting nnoremap <silent><C-j><C-v>:<C-u>Files ~/.dotfiles<CR>
,
- デフォルトキーマップ解説
<C-n>
のデフォルトは1行下へ移動<C-p>
のデフォルトは1行上へ移動
例
nnoremap <silent><C-p>:<C-u>cp<CR> nnoremap <silent><C-n>:<C-u>cn<CR>
QuickFixの上下移動はかなり使用頻度が高いのに:cn
と:cp
は3打と長い。長過ぎる。
そこへいくと<C-n>
のデフォルトは下移動<C-p>
のデフォルトは上移動とj
,k
の動作ともろかぶりである。
こんなにうちごろなキーを重複した操作にしておくなんてとんでもない。
H,L
- デフォルトキーマップ解説
H
はスクリーン上端に移動L
はスクリーン下端に移動
例
noremap H ^ noremap L $
デフォルトは使えるっちゃ使えるのですが
行頭、行末移動に比べたら使用頻度は雲泥の差なのでいいかなと。
本来の行頭移動(先頭の非空白文字列へ移動)の^
(ハット)と行末移動の$
(ダラー)はどうにも押しづらいのです。
できるだけデフォルトに慣れたほうがいいのですが、SHIFT+数字キーって指辛い。
ですが、
左に移動するのを強化する的な意味でH
が行頭移動、
右に移動するのを強化する的な意味でL
が行末移動、
は意味的にもしっくりくる気がしている。
しかし、このキーバインドに慣れるとサーバのVimで誤爆しまくること請け合いです。
K
- デフォルトキーマップ解説
- カーソル下のワードに対して
man
コマンド実行し、Vim上に表示する - 今回記事書いてて初めて知った
- カーソル下のワードに対して
- ルール
- 上記デフォルトの拡張を言語毎に最適なコマンドに割当する
例
vim-go
augroup GoCommands autocmd!... autocmd FileTypego nnoremap <silent>K <Plug>(go-doc)... augroup END
s
- デフォルトキーマップ解説
- カーソル下1文字を削除してインサートモードへ
vim-sandwichのREADMEに書いてある割当がs
なので従っています。それだけです。はい。