🧊

TUIのNeovimでも、Neovideみたくカーソルをアニメーションできる

数多あるNeovimのGUIの1つに、Neovideというものがあり。

neovide/neovide: No Nonsense Neovim Client in Rust https://github.com/neovide/neovide

このGUIの特徴の1つとして、カーソル移動の軌跡をヌルっとアニメーションさせられるというのがある。

初見ではすぐ飽きると思ってたけど、しばらく使ってみるとこれが意外とわかりやすくていい・・・って感想に。(きっと歳のせいもあるんやろうな)

ただ一身上の都合により、TUIのNeovimしか受け入れられないカラダなので、GUIであるNeovideを使うことはできない。

Neovideの中で:terminalして、そこから同じNeovideのウィンドウでファイルを編集できればワンチャンあったけど、どうやらそれはできないらしい。

How do i launch neovide inside a terminal instead of it opening in another window · neovide/neovide · Discussion #1104 https://github.com/neovide/neovide/discussions/1104

neovim-remoteなるプロセスを経由させれば、なんとかできんこともないらしいけど、うーむ。

まあできたとしても手癖で:qしちゃってすべて終了!みたいになるのは目に見えてるしな。

mini.animate

というわけで、TUIでもそれらしいUXを得ることはできないか?と探し回った結果、一番それっぽくできたのがこのプラグイン。

echasnovski/mini.animate: Neovim Lua plugin to animate common Neovim actions. Part of ‘mini.nvim’ library. https://github.com/echasnovski/mini.animate/tree/main

本当にmini一家にはなんでもあってすごい。氏はもっと評価されてほしい。

このプラグインを有効にすると、カーソルだけでなく、スクロールやリサイズなんかもアニメーションさせられる。

サポートされてるのは以下の通り。

  • cursor
  • scroll
  • resize
  • open
  • close

そしてカーソルの軌跡のアニメーションも4パターンから選べる。

  • line: 始点から終点へ直線的に(斜めにも)
  • angle: 終点の直上・直下にまず平行移動し、そのあと直角に(マンハッタン距離的な)
  • walls: 終点で左右に広がる波の壁みたいなエフェクト
  • spiral: 渦を巻きつつ終点へ

という感じ。(spiralはネタ枠っぽいなって思ったけどw)

あとはアニメーションのタイミングもカスタマイズできる。

個人的に使ってるNeovideのソレに最も似せた設定がこちら。

local animate = require("mini.animate")
animate.setup({
    cursor = {
        timing = animate.gen_timing.exponential({ easing = "out", duration = 100, unit = "total" }),
        path = animate.gen_path.line({ predicate = function() return true end }),
    },
})

gen_path.xxxpredicateで常にtrueを返すと、たとえ1マスの移動でもエフェクトが発生するようにできる。

というわけで、これでTUIなNeovimのままでも、カーソルの軌跡をアニメーションさせられた!

CJKでの表示崩れ

上述の設定を使った場合、日本語もとい正確にはdouble widthな文字の上でエフェクトが発生すると、そこの表示が崩れるっていうバグがあった。

mini.animate: Text rendering on CJK line is corrupted with predicate: () => true · Issue #648 · echasnovski/mini.nvim https://github.com/echasnovski/mini.nvim/issues/648

というIssueを立てたら、Neovim本体のバグだったらしく、なんと上流もまとめて解決してもらえた。

Putting extmark inside double width character may cause rendering issues · Issue #26949 · neovim/neovim https://github.com/neovim/neovim/issues/26949

感謝感激である。

ただこの修正が入るのは0.10以降らしく、そのリリース予定は3月?と少し先だったので、手元ではしばらくdev版を使うことにした。

0.10 Milestone https://github.com/neovim/neovim/milestone/36

そのほか

stonelasley/flare.nvim: Configurable Cursor highlighting. https://github.com/stonelasley/flare.nvim

当初求めてたものとは違うけど、

  • 軌跡はなくてよい
  • 終点だけ強調できればいい(mini.animateでいうwalls

という場合は、こっちのプラグインも選べるかもしれない。