logo

NERDTreeのキーマップをvimfiler風にする

vimfilerからNERDTreeに乗り換えた時、ファイルツリーでの操作でどうしても馴染めなかった箇所をvimfilerのような動きをするように変更
ファイルを開く際にウィンドウを選択させるために、 vim-choosewin を利用

[[plugins]] repo='t9md/vim-choosewin' hook_add=''' let g:choosewin_label='sdfghjkl' let g:choosewin_overlay_enable = 1 let g:choosewin_overlay_clear_multibyte = 1 ''' [[plugins]] repo='preservim/nerdtree' depends=['vim-choosewin'] hook_add=''' let g:NERDTreeMouseMode = 0 let g:NERDTreeMapToggleHidden = '.' let g:NERDTreeMapCustomOpen = 'o' let g:NERDTreeMapActivateNode = '<CR>' nn <Leader>e :NERDTreeToggle<CR> ''' hook_post_source=''' cal NERDTreeAddKeyMap({ 'key': 'l', 'callback': 'OpenCurrentDir', 'scope': 'DirNode', 'quickhelpText': 'Open current dir' }) cal NERDTreeAddKeyMap({ 'key': 'h', 'callback': 'CloseCurrentDir', 'scope': 'Node', 'quickhelpText': 'Close current dir' }) cal NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'callback': 'ChooseWinOpen', 'scope': 'FileNode', 'override': 1 }) fu! OpenCurrentDir(dirNode) abort if !a:dirNode.isRoot() && !a:dirNode.isOpen cal a:dirNode.activate({}) let l:children = a:dirNode.getVisibleChildren() cal l:children[0].putCursorHere(1, 0) en endf fu! CloseCurrentDir(node) abort let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node if !l:node.isRoot() && !empty(l:node.parent) && !l:node.parent.isRoot() && l:node.parent.isOpen cal l:node.parent.putCursorHere(1, 0) cal l:node.parent.activate({}) en endf fu! ChooseWinOpen(fileNode) abort let l:wincount = winnr('$') if l:wincount > 2 let l:nardwinnr = winnr() cal choosewin#start(range(2, l:wincount)) silent exe l:nardwinnr.'wincmd w' en cal a:fileNode.activate({ 'reuse': 'all', 'where': 'p', 'keepopen': 1 }) endf '''

※ 諸事情でいまだにvim7を利用する場合があるので、vim7でも動くような実装になっています。

プラグイン管理は dein.vim を利用しています。
NERDTreeAddKey を実行するとき、 hook_post_source でしかうまく起動時に追加されなくて、 post_source を使うために、別途 .vimrc には au VimEnter * cal dein#call_hook('post_source') を追加してます。
※ 上記はtomlファイルの中の内容を一部抜粋したものです。
※ 新しいプラグインを追加した時に、毎回 NERDTreeAddKey でエラーになりますが、再起動すればいいだけなのでスルー気味