basyura's blog

あしたになったらほんきだす。

statusline にプロジェクトルートからの相対パスを表示する

f:id:basyura:20140810234703p:plain

statusline が表示されてるのがあまり好きじゃなくて、laststatus=0 でのスッキリして表示が好きなのだけど、たまにファイル名とかディレクトリをさっと確認したいことがあるので statuline を表示したり、しなかったりする。

右側にファイルがあるディレクトリのパスを表示していたのだけど、

  • 見たいのはルートやホームディレクトリからのパスじゃなくて、プロジェクトルートからのパス
  • 表示するパスが長いと分割したときに切れちゃう

というのが気になったので、ややごういんに .git フォルダ or Rakefile ファイルの位置で判定するようにしてみた。やっつけ。

set statusline=\ %Y\ \|\ %t\ %<\ %m\ %r%=%{MyStatusPath()}\ \|\ %3c\ \|\%3p%%\ 

function! MyStatusPath()
  if exists('b:my_status_path')
    return b:my_status_path
  endif
  let path  = expand("%:p:h")
  let gpath = finddir('.git', path . ';.;')

  if gpath == ''
    let gpath = findfile('Rakefile', path . ';')
  endif

  if gpath == ''
    let b:my_status_path = fnamemodify(path, ':~:h')
    return b:my_status_path
  endif

  if gpath == '.git' || gpath == 'Rakefile'
    let b:my_status_path = fnamemodify(path, ':t')
  else
    let gpath = fnamemodify(gpath, ':h:h') . '/'
    let b:my_status_path = substitute(path, gpath, '', '')
  endif

  return b:my_status_path
endfunction