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

blink1.vim 作った

vim

最近、完全に勢いで blink(1) ってものを買ってみた。どんなもんかは適当にググるこことかみつかると思うけど、要はNotification用途のフルカラーLEDのUSBデバイス。小さな USB デバイスで、任意の色で光らせることができる。
色々応用が可能ってことで、コマンドラインからも制御可能なので、このコマンドラインツールをラップする形で Vim プラグイン書いてみた。

https://github.com/thinca/vim-blink1

とりあえずミニマムな機能しか入ってない感じ。関数から操作できるようにもなってるけど、API はてきとーです*1

:Blink1 white
:Blink1 red
:Blink1 80 80 255
:Blink1 0xff,0,0xff

で、まあ、作る前からわかってたんだけど、このデバイスは通知が主な目的で、Vim を使ってるってことはすでにマシンと向き合ってるってことなので、外部デバイスで通知するなら画面内で通知した方が速いんだよね。じゃあ何で作ったのか。魔が差したんです…。
まあでも折角作ったので活用してみる。私はサーバマシンで常時 lingr.vim を立ち上げているのだけど、ここで新しい発言があったら光って知らせるようにしてみた。

augroup vimrc-plugin-lingr
  autocmd! User plugin-lingr-message call s:lingr_update_unread()
augroup END
function! s:lingr_update_unread()
  let unread_count = lingr#unread_count()
  if unread_count == 0
    " 発言がない時は消す
    call blink1#off()
  else
    " 発言がある場合は発言数に応じて青から徐々に赤にする
    let read_max = 200
    let rgb_max = 0xFF
    let v = s:clamp(unread_count * rgb_max / read_max, 0, rgb_max)
    call blink1#rgb(v, 0, rgb_max - v)
  endif
endfunction
function! s:clamp(value, min, max)
  return a:value < a:min ? a:min :
  \      a:max < a:value ? a:max :
  \                        a:value
endfunction

便利(多分)!

今後としてはパターン点灯とか(コマンドラインからできるっぽいけどちゃんと把握してない)が考えられるけど、やるかどうかは気分と要望次第かな…。

*1:複数デバイスを意識して作ってはみたけど1つしか買わなかったので動作未確認!