basyura's blog

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

plugin/rails.vim を読む - その7

function! s:Detect(filename)
  " ファイルのパス名を取得し、 file:// 始まりの場合は置換
  let fn = substitute(fnamemodify(a:filename,":p"),'\c^file://','','')
  " セパレータの抽出
  let sep = matchstr(fn,'^[^\\/]\{3,\}\zs[\\/]')
  " セパレータが空文字じゃない場合
  if sep != ""
    " カレントディレクトリを取得して、セパレータ、ファイル名を連結
    let fn = getcwd().sep.fn
  endif
  " ファイル名が config/environment.rb の場合
  if fn =~ '[\/]config[\/]environment\.rb$'
    " ディレクトリ名を切り出して?BufInit を呼び出し
    return s:BufInit(strpart(fn,0,strlen(fn)-22))
  endif
  " ディレクトリの場合
  if isdirectory(fn)
    " パス末尾の / を空文字に変換する
    let fn = fnamemodify(fn,':s?[\/]$??')
  else
    " ファイル名の場合はそのディレクトリ名を取得する
    let fn = fnamemodify(fn,':s?\(.*\)[\/][^\/]*$?\1?')
  endif
  " 空文字を入れる
  let ofn = ""
  " ディレクトリ名を入れ宇
  let nfn = fn
  " nfn が ofn と等しくなく、 nfn が空文字じゃな居合いだループ
  while nfn != ofn && nfn != ""
    " バッファ変数が存在する場合
    if exists("s:_".s:escvar(nfn))
      " BufInit 呼び出し
      return s:BufInit(nfn)
    endif
    " ofn に nfn を格納
    let ofn = nfn
    " 親ディレクトリ名を取得していく。↓こんな感じ
    " ~/.vim/plugin/vim-rails/plugin
    " ~/.vim/plugin/vim-rails
    " ~/.vim/plugin    
    let nfn = fnamemodify(nfn,':h')
  endwhile
  " ofn に空文字を設定
  let ofn = ""
  " fn が ofn と等しくない間ループ
  while fn != ofn
    " fn と連結したパスにenvironment.rb が存在する場合
    if filereadable(fn . "/config/environment.rb")
      " BufInit を実行して返却
      return s:BufInit(fn)
    endif
    " ofn に fn をセット
    let ofn = fn
    " rails root を取得(?)
    let fn = fnamemodify(ofn,':s?\(.*\)[\/]\(app\|config\|db\|doc\|features\|lib\|log\|public\|script\|spec\|stories\|test\|tmp\|vendor\)\($\|[\/].*$\)?\1?')
  endwhile
  return 0
endfunction

strpart

strpart({src}, {start}, {len})
    結果は文字列で、{src}の{start}番目の文字から始まる、
    長さ{len}の部分文字列。