25
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VimAdvent Calendar 2018

Day 15

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

Posted at

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なので従っています。それだけです。はい。

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

25
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?