特定のファイルを開いているときにステータスラインの色を変更する
業務ではサーバー上のファイルを直接変更することがよくあります。
WinSCPから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」の条件を任意のパスに置き換えれば、
特定のファイルの場合にステータスラインの色を変更することができます。
注意
上記で動きますが、バッファを閉じることで別バッファに移動した際はBufEnterが呼ばれないようで、
その場合に期待した動きになりません。
具体的には、リモートファイルを:qで閉じてローカルファイルに移った場合、
本来ならステータスラインは通常の色に戻って欲しいですが変更されたままになっています。
適当にバッファを移動して戻ってくるとBufEnterが走るので正常に戻りますが。。。
これを対応するにはBufLeaveに対して、以下のようなことをしないといけないのかなと思っています。
できるかどうかも分かっていません。
- このバッファを閉じたあとにカレントとなるバッファ(A)の取得
- Aバッファのパスを取得
- s:change_status_line_highlightと同じく、判断してステータスラインの色づけ
一つ目の「次のバッファ取得」がどうしたものかと調べるのがめんどくてやっていない。