ディレクトリを開くコマンドを拒否する

最近のvimは、:editや:splitなどのコマンドでディレクトリを開こうとするとnetrwを起動する。しかし、私がこれをやるのは九割九分、tab補完の後すぐにEnterを叩いたものの補完されたものが予想と違った場合で、ディレクトリを開くのは邪魔な挙動でしかないのでやめさせたいと思った。ただnetrwを無効化するだけではだめで、ディレクトリを開こうとした時にはを完全に無視してコマンドモードに留まって欲しい。

ググっても解決法が見つからない*1ままになっていたが、ちょっとした工夫で実装できることに気がついた。

cmap <CR> <SID>(setcr)<SID>(cr)
cnoremap <SID>(setcr) <C-\>e<SID>Setcr()<CR>

function! s:Setcr()
  let cmdline = getcmdline()
  if match(cmdline, '\v^(e|edit|r|read|sp|split|vsp|vsplit)>.*/$') != -1
    cnoremap <SID>(cr) <NOP>
  else
    cnoremap <SID>(cr) <CR>
  endif
  return cmdline
endfunction

マッピングの中でマッピングを変更するというややこしいことになっているが、これより簡単な方法は思い付いていない。

*1:検索語の選択も難しい