2013年12月5日木曜日

VIM ステータスラインに時計を表示

Qiita のメールマガジンを購読しているが、先日来たメールマガジンにて、「最近ホットな Vim Plugin 3つ」という記事がトップになっていたので、気になって早速アクセスしてみた。

記事の内容は、素晴らしかったのだが、それより何よりステータスラインの表示の部分が気になってしまった。

調べてみると、「vim-powerline」と言う物のようで、さらに調べると、「vim-airline」となり、「lightline」と言う物まで進んでいるようだ。

見た目は綺麗で、とても良い感じで良さそうなのだが結局採用を見送るようにした。

いままで自分が設定しているステータスラインには、なんちゃって時計を付けているのだが、それを付ける方法を探るのが面倒くさかったと言うのが理由だ。

なんちゃって時計とは、VIM を使用している間、時間データを更新して、あたかも時計のように見せる設定。
VIM に触らず放置すると最終の時間が残ったままとなる。なのでなんちゃって時計という風になる。

どれくらい前だろうか?Emacs と VIM のどちらかに絞ろうと検討している際に、Emacs にはこの時計の機能が簡単に設定でき、さらになんちゃってじゃないという部分が気になっていた。
人に言わせれば、どうでも良い分類なのだが、なぜか惹かれる物があった。

結局、カーソル移動に Ctrl を押すのはナンセンスかつ変態だと思い VIM を使う事とした。
しかし、時計には憧れていた。

それから、しぶとく時計の方法を探るが、方法が見つからず、また無理矢理表示してやろうと試みるも、上手くいかずに諦めていた。
そこで、思いついたのがこの「なんちゃって」の方法だが、当時自分で試した方法が有ったのだが、月日が過ぎ端末の変更や VIM をさらわない時期などがあり、実現方法が分からなくなっていた。(当時使っていた vimrc は既にどこかに行ってしまっていた)

今使っている vimrc にも、このなんちゃって時計を付けているが、どこから見つけたのか覚えていない。

前置きが長かったが、今回のこのステータスラインを見て、設定を残しておかないと、また無くすと思ったので、下に設定を書いておきます。
set statusline=%t\ %m%r%h%w[%Y][%{&fenc}][%{&ff}]%=\%{g:Date()}C:%04c,L:%04l/%04L%4p%%
" インサートモード時の色変更
let g:hi_insert = 'highlight StatusLine guifg=darkblue guibg=darkyellow gui=none ctermfg=blue ctermbg=yellow cterm=none'
if has('syntax')
  augroup InsertHook
    autocmd!
    autocmd InsertEnter * call s:StatusLine('Enter')
    autocmd InsertLeave * call s:StatusLine('Leave')
  augroup END\%{g:Date()}
endif

let s:slhlcmd = ''
function! s:StatusLine(mode)
  if a:mode == 'Enter'
    silent! let s:slhlcmd = 'highlight ' . s:GetHighlight('StatusLine')
    silent exec g:hi_insert
  else
    highlight clear StatusLine
    silent exec s:slhlcmd
  endif
endfunction

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

" ステータスラインに日時を表示する
function! g:Date()
    return strftime("%x %H:%M ")
endfunction

これで、なんちゃって時計を表示する事ができます。
他にインサートモードになったときに色を変える設定とかも入っていますが、これも便利なので一緒に書いておきました。

結果はこちら

やはり、powerline 系見た目の良さに比べると今風じゃないですかね。。。

0 件のコメント:

コメントを投稿