うちのVim(+kaoriya)の c_CTRL-X

うちのVim(+kaoriya)には、 私しか使っていなさそうな独自キーマップが仕込まれています。 今回はそれを紹介したいと思います。

この記事は、Vim Advent Calendar 2014の28日目の記事かもしれません(もしかしたら)。

TL;DR

うちのVim(+kaoriya)では、コマンドラインで CTRL-X をタイプすると、現在開いているファイルのディレクトリを入力できます。

独自キーマップ

うちのVim(+kaoriya)には、私しか使っていなさそうな独自キーマップが仕込まれています。そのキーマップとはコマンドラインにおける CTRL-X です。コマンドラインにおいて CTRL-X を押すと、現在アクティブになっているバッファのファイルがあるディレクトリ、すなわちディレクトリパスをコマンドラインに入力できます。

このキーマップは cmdex.vim にて定義されています。ソースコードを以下に抜粋しておきます。

" c_CTRL-X
"   Input current buffer's directory on command line.
cnoremap <C-X> <C-R>=<SID>GetBufferDirectory()<CR>
function! s:GetBufferDirectory()
  let path = expand('%:p:h')
  let cwd = getcwd()
  let dir = '.'
  if match(path, escape(cwd, '\')) != 0
    let dir = path
  elseif strlen(path) > strlen(cwd)
    let dir = strpart(path, strlen(cwd) + 1)
  endif
  return dir . (exists('+shellslash') && !&shellslash ? '\' : '/')
endfunction

こんな感じで実装は至ってシンプルです。なにせ、かなり昔に実装して最近はほとんどイジってません。いくらかうまく入力できないケースはあるのですが、次に示すような私の用途では、98%くらいは問題なく動作してます。

ユースケース

例えばJavaです。Java のプロジェクトの特徴といえば、なんといってもネストしたパッケージ名に基づく深いディレクトリ構成です。複数のパッケージを含むようなプロジェクトにおいて、パッケージをまたいでファイルを開くのは、タグファイルなどがあっても辛い場合があります。

このような時に、新たに開きたいクラスが属するのと同じパッケージに属するファイルが、既にVim内に開いてあれば、そのファイルをカレントバッファにしてから以下のようにタイプすると、目的のパッケージ=ディレクトリに存在するファイル一覧を得られます。

:e <CTRL-X><CTRL-D>

同様の用途は Rails のプロジェクトでも発生します。Ruby側でさえviewやmodelのようにディレクトリが幾つもあるのに加え、最近は app/assets/javascript 下にも複雑なディレクトリ構造が作られる場合があります。そんな時、目的の場所のファイルが1つVimに開いてあれば、そのバッファを起点に CTRL-X を駆使して様々な操作が行えます。

以上

私しか知らない/使ってないかもしれないキーマップの紹介でした。超便利。