アカウント取っといて使わないのもなんだし書いてみる。
#目的
Agitやfugitiveなどを利用する際、シンボリックリンクとそうでないファイルの違いを意識せずに扱いたい。
元ファイルのパスを取得する方法は以下に書いてあった(パスを再設定するコマンドを定義している)。
Vimでシンボリックを辿る - たけっぱ横丁
だがぶっちゃけ面倒なのでバッファを開いた時にcd再設定してくれるautocmdを書いた。
#スクリプト
au BufEnter * execute findfile(expand('%')) != "" && resolve(expand('%:p')) != getcwd().'/'.expand('%') ? ":FollowSymlink" : ""
command! FollowSymlink call s:SwitchToActualFile()
function! s:SwitchToActualFile()
let l:fname = resolve(expand('%:p'))
let l:pos = getpos('.')
let l:bufname = bufname('%')
enew
exec 'bw '. l:bufname
exec "e" . fname
call setpos('.', pos)
endfunction
真面目にスクリプトを書いたの初めてなんでおかしな所があるかもしれない。
あとどのバッファを読んでもこのautocmd走るからレスポンスがどうのはあるかもなので気になったらまた改良しようと思う。
#追記(2016/05/25)
auが Command 条件式 実行する式で書ける事を知りませんでした。
au BufEnter findfile(expand('%')) != "" && resolve(expand('%:p')) !=
条件文の処理でレスポンスがまだアレかも知れないけどこっちの方がマシということで追記。
##更に追記
ガチで色々勘違いしてた。
以下が正しいautocmdのパッティーン。
(:h autocmd
から引っ張ってきたので流石に間違いも無いだろう)
:au[tocmd] [group] {event} {pat} [nested] {cmd}
こちらが再修正スクリプト。ただイマイチAgitやfugitiveが遅いので何とかしていきたい。
au BufEnter * if findfile(expand('%')) != "" && resolve(expand('%:p')) != getcwd().'/'.expand('%') | execute ':FollowSymlink' | endif
この辺とか参考。
if statement - autocmd check filename in vim? - Stack Overflow