🌃

vital-Neon で Vim のテキストをピカピカと光らせよう!

2021/12/13に公開

はじめに

数ヶ月前に vim-highlightedput というプラグインを書きました。ハイライト機能付きのプットコマンドを提供するプラグインです。

highlightedput demo

このハイライト機能ですが、現状では色と持続時間を 1 フレーム分しかカスタマイズできません。こんなかんじ:

highlight HighlightedputRegion ctermbg=150 guibg=#45493e  " 色
let g:highlightedput_highlight_duration = 1000  " 持続時間 (ms)

これでも十分っちゃ十分なのですが、フェードアウト的なアニメーションも設定もできたら嬉しいんじゃないかということで、それを実現するために vital.vim の外部モジュールを書いてみました。

vital-Neon

https://github.com/obcat/vital-Neon

名前はネオンサインのネオンからとっています。なかなかカッコよくてお気に入りです。(自画自賛)

詳しい説明は省きますが、だいたいこんな感じのことができます。

  • 特定のパターンにマッチするテキストを延々と点滅させる:

blink

  • カーソル行をじわっとハイライトするマッピングを作る:

glow

  • インデントオペレータ = でインデントした行をピカッと光らせる:

flash

ハイライトにはマッチという機能を使いました (:help match-highlight)。マッチはウィンドウに対して定義されるため、ウィンドウが閉じられるとウィンドウ諸共消えてなくなります。この際、色変更のためのタイマーが残存してしまうという問題がありました。

そこで、この問題を解決するために Neovim から WinClosed イベントを輸入する PR を出してみたところ、そのまま取り込んでもらえました。うれしい。

https://github.com/vim/vim/commit/23beefed73aadb243fb67cf944e3d60fe8c038bb

差分周辺のロジックが Vim と Neovim でほとんど同じだったので、すんなりと移植できてよかったです。

Vim と Neovim の乖離はどんどんと進んでしまっていますが、こんな感じでお互いのいいところを取り合って共に発展していけるとみんなハッピーになれるんじゃないかなと思います。

さいごに

vital-Neon を書いたはいいものの、vim-highlightedput はまだ更新されていません。比較的新しめの Vim でしか使えなくなってしまうので、vim-hlput という別プラグインにしてしまおうかなと考えています。ついでにプットコマンドを模倣する部分も vim-event-TextPutPost 的なアレとして切り出して諸々いい感じにしたいのですが、こういう問題に気づいたり、テストを書くのが無限に面倒だったりでなかなか前に進めない状況です… やる気があるうちに何とか完成まで漕ぎ着けたい…

あと、vim-hlput ができたら vim-hlindent とか vim-hlshift も書いてみたいなぁ。まあぼちぼちやっていきます… おしまい。

Discussion