ちなみに

火曜日の空は僕を押しつぶした。

モード管理用vimスクリプト書きました

vimではできないんだね!

「スはスペックのス〜RSpecによるテスト駆動開発の実演〜」, 今日のRuby札幌での発表の精神とスライド資料をより深く理解するための映画3本(+1) - 角谷HTML化計画(2008-02-16)

それ、vimで出来るよ!

" eflg
" 0 => short color bar
" 1 => long color bar
let s:eflg = 0 
" Mode name
let s:think    = ' Think  '
let s:red      = '  Red   '
let s:green    = ' Green  '
let s:refactor = 'Refactor'

nmap <silent> <leader>m<C-m> :call <SID>ToggleMode()<CR>
nmap <silent> <leader>mc :call <SID>ModeClear()<CR>
nmap <silent> <leader>mt :call <SID>ModeThink()<CR>
nmap <silent> <leader>mg :call <SID>ModeGreen()<CR>
nmap <silent> <leader>mr :call <SID>ModeRed()<CR>
nmap <silent> <leader>mf :call <SID>ModeRefactor()<CR>

let s:original = escape(&statusline, ' ')
if s:eflg == 1
  let s:endflg = 1 
endif

func! s:ToggleMode()
  let s:my_mode = (s:my_mode + 1) % 4 
  if     s:my_mode == 0 | call s:ModeThink()
  elseif s:my_mode == 1 | call s:ModeRed()
  elseif s:my_mode == 2 | call s:ModeGreen()
  elseif s:my_mode == 3 | call s:ModeRefactor()
  endif
endfunc

func! s:ModeClear()
  let s:my_mode = -1
  hi clear User1
  hi User1 cterm=inverse,bold
  exe 'setlocal statusline=' . s:original
endfunc

func! s:ModeThink()
  let s:my_mode = 0
  hi User1 ctermfg=white
  call s:SetStatusLine(escape(s:think, ' '))
endfunc

func! s:ModeRed()
  let s:my_mode = 1
  hi User1 ctermfg=red
  call s:SetStatusLine(escape(s:red, ' '))
endfunc

func! s:ModeGreen()
  let s:my_mode = 2
  hi User1 ctermfg=green
  call s:SetStatusLine(escape(s:green, ' '))
endfunc

func! s:ModeRefactor()
  let s:my_mode = 3
  hi User1 ctermfg=yellow
  call s:SetStatusLine(escape(s:refactor, ' '))
endfunc

func! s:SetStatusLine(mode)
  exe 'setlocal statusline=%1*[' . a:mode . ']' . s:EndorHere('s:endflg', '%*') . '\ ' . s:original . '%=%*'
endfunc

func! s:EndorHere(flg, val)
  if exists(a:flg)
    return ''
  else
    return a:val
  endif
endfunc

call s:ModeClear()

キーバインドとかは適当に変更して使ってください。

(追記:名前は一応mode.vimで)


(追記:githubで公開しました。Sixeight/mode-vim · GitHub