gf で Python の import で宣言しているファイルを開く

元ネタはこれ。
たった一行で人生が変わった.vimrcでの設定とその意味 - Hail2u


さっそく上記の設定をして、HTML 内で gf をしたら JavaScript なファイルに飛んでおお!っとなった。
JavaScript が行けるのなら、Python の import で宣言しているのもいけるはず!と言う事でやってみた。


.vimrc

autocmd FileType python setlocal includeexpr=FormatPyImport(v:fname) | setlocal path+=;/
function! FormatPyImport(str)
  return substitute(substitute(substitute(a:str, '^from \|^import ', '', ''), 'import \a\+', '', ''), '\.', '\/', 'g')
endfunction

foo.py

# -*- coding: utf-8 -*-
class Foo(object):
    pass

bar.py

# -*- coding: utf-8 -*-
def bar():
    pass

sample.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import bar
from foo import Foo

sample.py 内で bar や foo の上で gf を実行すると、foo.py や bar.py に移動できた。
が、.vimrc に書いたやりかたが全く気にくわない。
substitute を 3 回も書いてる所がもやもやする。
もっとエレガントな方法があるはず…と思ったが、普通バッファセレクタ系のプラグイン使うよねーとか思ったのでこのまま。


という事で 2012 年一発目は Vim ネタでした。