Vim
VimDay 15

Vimのキーマッピングに迷わないための俺々キーマッピングルールをご紹介します


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()
    let l:nr = winnr('$')
    cwindow
    let l:nr2 = winnr('$')
    if l:nr == l:nr2
    cclose
    endif
    endfunction
    nnoremap <script> <silent> <Space>f :call ToggleQuickfix()<CR>




,(カンマ)


  • デフォルトキーマップ解説



    • f*と押した場合にカーソル位置から右の*に移動するが、,(カンマ)はそれを左方向に繰り返す



  • ルール



    • <Leader>として扱う

    • 上記<Space>に該当するコマンドは割当しない

    • プラグインのコマンドのPrefixとして用いる

    • プラグラミング言語毎のプラグインのコマンドを割当しない






    • vim-quickrun

      nnoremap <Leader>r :<C-U>QuickRun<CR>
      
      xnoremap <Leader>r gv:<C-U>QuickRun<CR>



    • nerdtree

      nnoremap <silent> <Leader>t :<C-u>NERDTreeToggle<CR>
      
      nnoremap <silent> <Leader>f :<C-u>NERDTreeFind %<CR>



    • tagbar

      nnoremap <Leader>o :<C-u>TagbarToggle<CR>
      



    • caw.vim

      " 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)



    • open-browser.vim

      nnoremap <Leader>b <Plug>(openbrowser-smart-search)
      
      vnoremap <Leader>b <Plug>(openbrowser-smart-search)





(バックスラッシュ)


  • デフォルトキーマップ解説


    • キーマップ拡張のために空けてある



  • ルール



    • <LocalLeader>として扱う

    • 上記,(カンマ)に該当するコマンドは割当しない

    • プラグラミング言語毎のプラグインのコマンドを割当する

    • autocmdを用いて、各言語毎にキーマップが切り替わるようにする






    • vim-go

      augroup GoCommands
      
      autocmd!
      autocmd FileType go nnoremap <silent><LocalLeader>r <Plug>(go-run)
      autocmd FileType go nnoremap <silent><LocalLeader>b <Plug>(go-build)
      autocmd FileType go nnoremap <silent><LocalLeader>tt <Plug>(go-test)
      autocmd FileType go nnoremap <silent><LocalLeader>tf <Plug>(go-test-func)
      autocmd FileType go nnoremap <silent><LocalLeader>ts :<C-u>GoTests
      autocmd FileType go nnoremap <silent><LocalLeader>ta :<C-u>GoTestsAll
      autocmd FileType go nnoremap <silent><LocalLeader>m <Plug>(go-imports)
      autocmd FileType go nnoremap <silent><LocalLeader>i <Plug>(go-install)
      autocmd FileType go nnoremap <silent>K <Plug>(go-doc)
      autocmd FileType go nnoremap <silent><LocalLeader>d <Plug>(go-doc-browser)
      autocmd FileType go nnoremap <silent><LocalLeader>R <Plug>(go-rename)
      autocmd FileType go nnoremap <silent><LocalLeader>c <Plug>(go-coverage-toggle)
      autocmd FileType go nnoremap <silent><LocalLeader>n <Plug>(go-referrers)
      autocmd FileType go nnoremap <silent><LocalLeader>a <Plug>(go-alternate-edit)
      autocmd FileType go nnoremap <silent><LocalLeader>e <Plug>(go-iferr)
      autocmd FileType go nnoremap <silent><LocalLeader>p <Plug>(go-implements)
      augroup END



    • jedi-vim

      let g:jedi#goto_command = "<C-]>"
      
      let g:jedi#goto_assignments_command = "<Localleader>g"
      let g:jedi#goto_definitions_command = ""
      let g:jedi#documentation_command = "K"
      let g:jedi#usages_command = "<Localleader>n"
      let g:jedi#rename_command = "<Localleader>R"



    • vim-lsp

      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-某>)とする






    • denite.nvim

      " 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>



    • fzf.vim

      " 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 FileType go nnoremap <silent>K <Plug>(go-doc)
      ...
      augroup END





s


  • デフォルトキーマップ解説


    • カーソル下1文字を削除してインサートモードへ



vim-sandwichのREADMEに書いてある割当がsなので従っています。それだけです。はい。


ものすごく参考になる記事