LoginSignup
2
1

More than 5 years have passed since last update.

Vimでバッファ読込時にシンボリックリンクかどうかを判別する

Last updated at Posted at 2016-05-23

アカウント取っといて使わないのもなんだし書いてみる。

目的

Agitやfugitiveなどを利用する際、シンボリックリンクとそうでないファイルの違いを意識せずに扱いたい。
元ファイルのパスを取得する方法は以下に書いてあった(パスを再設定するコマンドを定義している)。
Vimでシンボリックを辿る - たけっぱ横丁
だがぶっちゃけ面倒なのでバッファを開いた時にcd再設定してくれるautocmdを書いた。

スクリプト

.vimrc
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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1