読者です 読者をやめる 読者になる 読者になる

特定のファイルを開いているときにステータスラインの色を変更する

vim

業務ではサーバー上のファイルを直接変更することがよくあります。
WinSCPからVimで開いて編集するわけですが、
たまに今開いているファイルがローカルなのかリモートなのか分からなくなります。
そんなことから、誤った編集を防ぐためにちょっとした設定を加えて使っています。

(前提)WinSCPからファイルを開いたときにVimを使う

  1. 「オプション」→「環境設定」→「エディタ」→「追加」を選択
  2. 「外部エディタ」を選択
  3. Vimのパスを指定
    • このとき--remote-tab-silentオプションを指定することで、すでにVimが立ち上がっていればそっちで開くようになる
    • (例:C:\app\mail\vim\gvim.exe --remote-tab-silent !.!)
  4. 登録したVimを「上へ」で一番上へ

WinSCPで開いたファイルならステータスラインの色を変更する

WinSCPで開いたファイルはLocal Settings\Tempに置かれるので、その場合に色を変えています。

" WinSCPでファイルを開いている場合にステータスラインの色を変える
augroup StatusLineColor
  autocmd!
  autocmd BufEnter * call s:change_status_line_highlight()

  function! s:get_highlight(id)
    redir => hl
    silent exec 'highlight '.a:id
    redir END
    let hl = substitute(hl, '[\r\n]', '', 'g')
    let hl = substitute(hl, 'xxx', '', '')
    return hl
  endfunction

  let s:origin_status_line_hl = s:get_highlight('StatusLine')

  function! s:change_status_line_highlight()
    if stridx(expand('%:p'), 'Local Settings\Temp') != -1
      silent exec 'highlight StatusLine guifg=black guibg=green gui=none ctermfg=blue ctermbg=yellow cterm=none'
    else
      highlight clear StatusLine
      silent exec 'highlight '.s:origin_status_line_hl
    endif
  endfunction
augroup END

「Local Settings\Temp」の条件を任意のパスに置き換えれば、
特定のファイルの場合にステータスラインの色を変更することができます。

サンプル

自宅PCはMacなのでWinSCPは使えずキャプチャが取れないので、条件を'blog'に変えた結果がこれ。
ノーマルはこんな感じ。

blog配下のファイルに移るとこうなる。

注意

上記で動きますが、バッファを閉じることで別バッファに移動した際はBufEnterが呼ばれないようで、
その場合に期待した動きになりません。
具体的には、リモートファイルを:qで閉じてローカルファイルに移った場合、
本来ならステータスラインは通常の色に戻って欲しいですが変更されたままになっています。
適当にバッファを移動して戻ってくるとBufEnterが走るので正常に戻りますが。。。

これを対応するにはBufLeaveに対して、以下のようなことをしないといけないのかなと思っています。
できるかどうかも分かっていません。

  1. このバッファを閉じたあとにカレントとなるバッファ(A)の取得
  2. Aバッファのパスを取得
  3. s:change_status_line_highlightと同じく、判断してステータスラインの色づけ

一つ目の「次のバッファ取得」がどうしたものかと調べるのがめんどくてやっていない。