Author

Web系ソフトウェアエンジニアを志望
開発記録や個人的な技術に対する思いを綴ります

FOCUS個人開発/設計
OSArch Linux+Omarchy
STACKTypeScript・Next.js
STATUS学習中 → 就活中

NeoVim Smear-Cursorプラグインのすすめ

tech

はじめに

この記事では、NeoVim初心者から使えるカーソルエフェクト追加プラグインSmear-Cursorを紹介します。

この記事を読めば、おしゃれなカーソルエフェクトの追加方法を知ることができます。

Smear-Cursorとは?

smear-cursorのことで。 NeoVimのプラグインの一つで、執筆時点で1800スターを獲得しています。 NeoVideのようなカーソルアニメーションを追加することができます。 かなり細かくカスタマイズできるので、通常のNeoVimの見た目に飽きた人にもおすすめ!

導入時の注意点

  • mini-animateとは動作が似てて競合するのでどちらかにする必要があります。 (mini-animateはスクロールの際にページの下側でスタックすることがあったので、smear-cursorのほうが個人的にはおすすめです。)
  • アニメーションなので、グラフィック性能に余裕がない環境だと重くなるかもしれないです汗

設定ファイルの書き方

nvim/lua/plugins/smear-cursor.luaに以下のように記述します。 ※ ファイル名はなんでもOK

return {
  "sphamba/smear-cursor.nvim",
  opts = {
  -- ここに設定を書く
  },
}

筆者のカスタム

smear-cursor.nvimの記述

-- nvim/lua/plugins/smear-cursor.lua
return {
  "sphamba/smear-cursor.nvim",
  opts = {
    cursor_color = "#01d6e4",
    particles_enabled = true,
    stiffness = 0.5,
    trailing_stiffness = 0.2,
    trailing_exponent = 5,
    damping = 0.6,
    gradient_exponent = 0,
    gamma = 1,
    never_draw_over_target = true, -- if you want to actually see under the cursor
    hide_target_hack = true, -- same
    particle_spread = 0.4,
    particles_per_second = 500,
    particles_per_length = 50,
    particle_max_lifetime = 1000,
    particle_max_initial_velocity = 20,
    particle_velocity_from_cursor = 0.5,
    particle_damping = 0.15,
    particle_gravity = -20,
    particles_over_text = false,
    min_distance_emit_particles = 0,
    smear_insert_mode = false,
  },
}

筆者のカスタム例

筆者の設定のサンプル画像

追加設定

Insertモードでparticlesが文字に被って見えにくいため以下も設定しています。

-- nvim/lua/autocmds.lua
-- smear-cursor insertモードではparticlesをオフに、ノーマルモードではオンに
vim.api.nvim_create_autocmd("InsertEnter", {
  callback = function()
    require("smear_cursor.config").particles_enabled = false
  end,
})
vim.api.nvim_create_autocmd("InsertLeave", {
  callback = function()
    require("smear_cursor.config").particles_enabled = true
  end,
})

smear-cursor.nvim オプション一覧


🔧 General — 基本動作のON/OFF

オプションデフォルト役割
smear_between_bufferstrueバッファ・ウィンドウ切り替え時にスメアするか
smear_between_neighbor_linestrue行内移動・隣行移動時にスメアするか
min_horizontal_distance_smear0この水平距離以上移動した時だけスメアする
min_vertical_distance_smear0この垂直距離以上移動した時だけスメアする
smear_horizontallytrue水平方向のスメアを有効にするか
smear_verticallytrue垂直方向のスメアを有効にするか
smear_diagonallytrue斜め方向(水平でも垂直でもない)のスメアを有効にするか
smear_to_cmdtrueコマンドラインモードへの出入りでスメアするか
scroll_buffer_spacetrueスクロール時にスクリーン座標ではなくバッファ座標でスメアを描画するか

🔤 フォント・カーソル形状

オプションデフォルト役割
legacy_computing_symbols_supportfalseUnicodeのレガシーブロック文字(Cascadia Codeなど)対応フォントを使っているか。trueにするとスメアがよりなめらかになる
legacy_computing_symbols_support_vertical_barsfalse縦バーカーソル向けに上記を適用するか
use_diagonal_blockstruelegacy_computing_symbols_supporttrue のとき、斜めブロック文字を使うか
vertical_bar_cursorfalseノーマルモードのカーソルが縦バー(|)の場合は true
vertical_bar_cursor_insert_modetrueインサートモードのカーソルが縦バーの場合は true
horizontal_bar_cursor_replace_modetrueリプレイスモードのカーソルが横バー(_)の場合は true

🎨 描画・レンダリング制御

オプションデフォルト役割
never_draw_over_targetfalseスメアがターゲット文字に重ならないようにするか(アニメーション中にその文字を隠さない)
hide_target_hackfalsetermguicolors なし環境向けに、実カーソルをキャラクター描画で隠す裏技。never_draw_over_target = true と一緒に使う
max_kept_windows50レンダリング用に維持するフローティングウィンドウ数の上限
windows_zindex300スメア用フローティングウィンドウの zindex(他のフローティングより上に来るかどうか)
filetypes_disabled{}プラグインを無効にするファイルタイプのリスト

⏱️ タイミング・パフォーマンス

オプションデフォルト役割
time_interval17 msアニメーションのフレームレート(ミリ秒)。小さくするとなめらかになるが負荷増
delay_disablenilアニメーションがこの時間(ms)以上止まった場合に自動無効化。nil で無効
delay_event_to_smear1 msカーソルが止まってからアニメーション開始するまでの遅延
delay_after_key5 msキー入力後の vim.on_key 遅延。smear_terminal_mode 使用時に調整

🌊 スメアのダイナミクス(物理感)

バネ&ダンパー系の物理モデルでスメアの動きを制御します。

オプションデフォルト範囲役割
stiffness0.6[0, 1]スメアのの硬さ。1 に近いほど素早くターゲットへ追いつく
trailing_stiffness0.45[0, 1]スメアのの硬さ。stiffness より小さいと尾を引く
anticipation0.2移動前に逆方向へ少し予備動作するファクター(スプリング感)
damping0.85[0, 1]速度の減衰率。小さく(0.65 など)すると行き過ぎてバウンスする
trailing_exponent3中間点が頭寄り・尾寄りどちらに分布するか。1 未満で尾寄り、1 超で頭寄り
distance_stop_animating0.1> 0尾がターゲットからこの距離(文字単位)内に入ったらアニメーション終了
max_length25スメアの最大長(文字数)

インサートモード専用パラメータ

オプションデフォルト
stiffness_insert_mode0.5
trailing_stiffness_insert_mode0.5
damping_insert_mode0.9
trailing_exponent_insert_mode1
distance_stop_animating_vertical_bar0.875
max_length_insert_mode1

🖼️ ラスタライズ・描画品質

スメアをどのようなブロック文字で描画するかを制御する細かい設定群です。

オプションデフォルト役割
color_levels16色のグラデーション段階数(最小 1)。cterm_cursor_colors 使用時は手動設定不要
gamma2.2色ブレンド時のガンマ値
gradient_exponent1.0縦方向グラデーション。0 で均一、1 で線形減衰
max_shade_no_matrix0.750 に近いほどはみ出し表現が増え、1 に近いほどマトリクス表現が増える
matrix_pixel_threshold0.7マトリクス描画でのピクセル閾値。0 で全ピクセル、1 でピクセルなし
matrix_pixel_threshold_vertical_bar0.25縦バーカーソル向けの同閾値
matrix_pixel_min_factor0.5マトリクスピクセルの最小輝度係数
volume_reduction_exponent0.3スメアの体積(太さ)の減衰具合。0 で減衰なし、1 で完全減衰
minimum_volume_factor0.7体積減衰の下限係数。0 で制限なし、1 で減衰なし
max_slope_horizontal(1/3)/1.5水平描画に切り替える傾きの閾値
min_slope_vertical2*1.5垂直描画に切り替える傾きの閾値
max_angle_difference_diagonalπ/16 rad斜め描画に切り替える角度差の閾値
max_offset_diagonal0.2斜め描画の最大オフセット(セル幅単位)
min_shade_no_diagonal0.2斜めブロックを使わない最小シェード。0 で少なく、1 で多く
min_shade_no_diagonal_vertical_bar0.5縦バーカーソル向けの同設定

✨ パーティクル(炎エフェクト系)

particles_enabled = true にすると火花が散るエフェクトが追加されます。
README の 🔥 Fire Hazard セクションで紹介されている設定はこれを活用しています。

オプションデフォルト役割
particles_enabledfalseパーティクルエフェクトを有効にするか。true の場合は never_draw_over_target = true も推奨
particle_max_num100最大パーティクル数
particle_spread0.5パーティクルの広がり幅(0: 点、1: カーソル全幅)
particles_per_second2001 秒あたりの放出数
particles_per_length1.0カーソル移動距離(文字幅)あたりの放出数
particle_max_lifetime300 msパーティクルの最大寿命
particle_lifetime_distribution_exponent5寿命の分布の偏り
particle_max_initial_velocity10初速の最大値(文字幅/秒)
particle_velocity_from_cursor0.2カーソルの速度をパーティクルに受け継ぐ割合(0: なし、1: 全量)
particle_random_velocity100ランダムな速度の最大値(文字幅/秒)
particle_damping0.2パーティクルの速度減衰
particle_gravity20重力加速度(文字幅/秒²)。正で下向き、負で上向き
min_distance_emit_particles1.5この距離以上移動した時だけパーティクルを放出(文字幅単位)
particle_switch_octant_braille0.3点字記号を使う寿命割合(legacy_computing_symbols_support = true 時のみ有効)
particles_over_textfalseパーティクルをテキスト上にも描画するか

🎭 モード別スメア ON/OFF

オプションデフォルト役割
smear_insert_modetrueインサートモードでスメアするか
smear_replace_modefalseリプレイスモードでスメアするか
smear_terminal_modefalseターミナルモードでスメアするか(有効にする場合 delay_after_key の調整も推奨)

🎨 カラー設定(color.lua より)

オプションデフォルト役割
cursor_colornil(Cursor HL から取得)スメアの色。16進カラーコード、ハイライトグループ名、または "none"(テキスト色に合わせる)
cursor_color_insert_modenilインサートモード時のスメアの色
normal_bgnil(Normal HL から取得)背景色(透過背景環境での調整用)
transparent_bg_fallback_colorlegacy_computing_symbols_support = false の透過背景環境でのシャドウ色
cterm_cursor_colorstermguicolors 非使用時のグラデーション色リスト(例: { 240, 245, 250, 255 }
cterm_bgtermguicolors 非使用時の背景色(例: 235

さいごに

導入手順は、

  1. nvim/lua/plugins/smear-cursor.luaを作成する
  2. お好みのエフェクトを記述する
  3. (nvim/lua/config/autocmds.luaを設定する)
  4. nvimを再起動する

です!

ぜひ試してみてください!