vimのカラースキームの統計を取り、自分に合ったものを見つける設定

テキスト編集に使用するvimというアプリがある。素のままでは超基本的なことしかできない。
できることが少ないからノイズがない、気が散らない。
テキスト編集に集中するための、生まれながらのZEN MODEなのである。

さすがにベーシックなものだけでは不便すぎる、代わりに拡張性が高い。
プラグインや設定で自分に合った部分だけ調整できる。そこが今でも利用される理由である。

最近は多くのアプリでライトモードとダークモードを選択できるようになった。
ダークモードの方が疲れないので選べるならそちらを使う。そうなるとモード固定のアプリを使う場面で明暗が強すぎる。
ネット検索でパソコン画面を暗くして、vimで明るくする動作が出てくる。不便である。

どうやら色合いを変えれば少しは改善されそうだ、ということでvimのカラースキーム設定の出番だ。
デフォルトでいくつかのカラーセットが選べるので、そこから選べばいい。
とは言えその時の気分や部屋の明るさによって選ぶ基準が変わるはずである。

1、手軽に別のカラーセットに切り替えられる
2、カラーセットの使用時間を調査する
3、使用時間が長いものが自分に合っているのでは?
ということで早速設定してみた。

公平を期するためカラーセットの切り替えはランダムにする。
ランダム切り替え、使用時間の記録を.vimrcに追記する。

" --------------------------------------------------
" 1. 切り替えたいカラースキームのリスト定義
" --------------------------------------------------
let g:my_colorschemes = ['blue', 'darkblue', 'default', 'desert', 'elflord', 'evening', 'industry', 'koehler', 'murphy', 'pablo', 'ron', 'slate', 'torte', 'habamax', 'quiet', 'retrobox', 'sorbet', 'wildcharm', 'zaibatsu', 'lunaperche']
let g:my_colorscheme_index = 0
let g:scheme_log_file = expand('~/.vim/colorscheme_time.log')

" --------------------------------------------------
" 2. ログ記録用の関数(恒久保存・変更なし)
" --------------------------------------------------
function! LogColorschemeTime(scheme_name)
  let l:current_time = localtime()

  " ログファイルが存在しない場合はディレクトリを作成して新規生成
  let l:dir = fnamemodify(g:scheme_log_file, ':h')
  if !isdirectory(l:dir)
    call mkdir(l:dir, 'p')
  endif

  call writefile([a:scheme_name . ' ' . l:current_time], g:scheme_log_file, 'a')
endfunction

" --------------------------------------------------
" 3. ステータスライン一時通知用の変数とタイマー
" --------------------------------------------------
let g:scheme_notify_text = ''
let g:scheme_notify_timer = -1

function! ClearSchemeNotify(timer_id)
  let g:scheme_notify_text = ''
  redrawstatus
endfunction

function! ShowSchemeNotify(scheme_name)
  " 既存のタイマーが残っていれば止める(連打対策)
  if g:scheme_notify_timer != -1
    call timer_stop(g:scheme_notify_timer)
  endif

  let g:scheme_notify_text = '-> ' . a:scheme_name
  redrawstatus

  " 2000ミリ秒(2秒)後に消える
  let g:scheme_notify_timer = timer_start(2000, 'ClearSchemeNotify')
endfunction

" --------------------------------------------------
" 4. カラースキーム切り替え関数 & シャッフル処理
" --------------------------------------------------
function! Shuffle(list)
  let l:res = copy(a:list)
  let l:i = len(l:res) - 1
  while l:i > 0
    let l:j = rand() % (l:i + 1)
    let l:tmp = l:res[l:i]
    let l:res[l:i] = l:res[l:j]
    let l:res[l:j] = l:tmp
    let l:i -= 1
  endwhile
  return l:res
endfunction

" 起動時に初期リストをシャッフル
let g:my_shuffled_colorschemes = Shuffle(g:my_colorschemes)

function! RotateColorscheme(step)
  let g:my_colorscheme_index += a:step

  if g:my_colorscheme_index >= len(g:my_shuffled_colorschemes)
    " 前進で一巡 -> 再シャッフルして先頭へ
    let g:my_shuffled_colorschemes = Shuffle(g:my_colorschemes)
    let g:my_colorscheme_index = 0
  elseif g:my_colorscheme_index < 0
    " 後退で先頭を割った -> 現在のシャッフル順の末尾へラップ
    let g:my_colorscheme_index = len(g:my_shuffled_colorschemes) - 1
  endif

  let l:next_scheme = g:my_shuffled_colorschemes[g:my_colorscheme_index]

  try
    execute 'colorscheme ' . l:next_scheme
    call LogColorschemeTime(l:next_scheme)
    call ShowSchemeNotify(l:next_scheme)
  catch
    echom 'Failed to load: ' . l:next_scheme
  endtry
endfunction

" --------------------------------------------------
" 5. 起動時にシャッフル後の最初のスキームを適用・記録
" --------------------------------------------------
augroup MyColorschemeRotation
  autocmd!
  autocmd VimEnter * execute 'colorscheme ' . g:my_shuffled_colorschemes[0] | call LogColorschemeTime(g:my_shuffled_colorschemes[0])
augroup END

" --------------------------------------------------
" 6. ステータスライン設定
" --------------------------------------------------
set laststatus=2
set statusline+=%{g:scheme_notify_text}

" --------------------------------------------------
" 7. キーマップ設定 (F8で次へ、Shift+F8で前へ)
" --------------------------------------------------
nnoremap <F8> :call RotateColorscheme(1)<CR>
nnoremap <S-F8> :call RotateColorscheme(-1)<CR>

これでF8を押すたびにカラーセットを変えられる。
見やすいカラーセットがあればそれを使う。
時間が経って(部屋の明るさが変わって)見づらくなったらまたF8で探す。

しばらく使ううちに統計が取れる。
結果を見るにはターミナルで以下のコマンドを打つ。

awk '
NR>1 {
    duration = $2 - prev_time
    total[prev_scheme] += duration
}
{
    prev_scheme = $1
    prev_time = $2
}
END {
    for (s in total) {
        printf "%-20s %.2f 分\n", s, total[s]/60
    }
}' ~/.vim/colorscheme_time.log | sort -k2 -nr

運用してみた結果は以下である。

ron                  149.55 分
lunaperche           44.48 分
sorbet               29.72 分
darkblue             20.20 分
evening              19.93 分
zaibatsu             9.42 分
industry             4.93 分
quiet                4.57 分
torte                3.68 分
blue                 2.88 分
desert               2.67 分
pablo                2.23 分
elflord              2.20 分
murphy               1.97 分
wildcharm            1.67 分
default              0.70 分
retrobox             0.67 分
habamax              0.67 分
slate                0.42 分
koehler              0.25 分

今のところronが優勢、もっとログが貯まれば好き嫌いがはっきり出そうである。

タイトルとURLをコピーしました