narrowing-nvimを作った

はじめに

Emacsを使っていた頃、Org Modeのnarrowing機能を多用していて、選択した範囲だけを別バッファで編集できるのがとても便利でした。Neovimに移行してからも似たような機能が欲しく、chrisbra/NrrwRgnというプラグインを使っていたのですが、いくつか不満点があったので、自分でプラグインを作ることにしました。

作ったのがこちらです:tkancf/narrowing-nvim

narrowingとは

narrowingは、テキストエディタで編集範囲を一時的に絞り込む機能です。例えば、1000行のファイルで100〜200行目だけを編集したい場合、その範囲だけを別のバッファに切り出して編集し、編集が終わったら元のファイルに反映する、といった使い方ができます。

この機能の便利な点は

  • 大きなファイルの特定部分に集中できる
  • 誤って他の部分を編集してしまうリスクを減らせる
  • 編集対象の範囲が明確になる

特に長くなってきたドキュメントの編集時に威力を発揮します。

既存プラグインの課題

NrrwRgnは素晴らしいプラグインで、基本的な機能は十分に提供していました。しかし、使っているうちにいくつか改善したい点が出てきました

Floating Windowに非対応

NrrwRgnは従来のsplitウィンドウしかサポートしていなかったため、特に小さい画面での作業時に不便でした。

Vimscriptで実装されている

NrrwRgnはVimscriptで書かれています。これ自体は問題ではありませんが、最近のNeovimプラグインエコシステムはLuaが主流になってきており、Luaで揃えたいなという気持ちがありました。

個人的に欲しい機能の追加

Vimのfold機能をよく使うので、foldした範囲をnarrowingする機能があると良いなと思っていました。
自作であれば機能追加は好みで取り込めます。

narrowing-nvimの実装

アイディアをClaude Codeに依頼したらほぼ作ってくれました。
いくつかエラーが発生した際にエラーメッセージを与えたぐらいしかしてないです。

設定可能なオプション

ユーザーの好みに合わせてカスタマイズできるよう、柔軟な設定オプションを提供しています

require("narrowing").setup({
  window = {
    type = "float",        -- "float" または "split"
    position = "center",   -- ウィンドウの配置
    width = 0.95,          -- 画面幅に対する割合
    height = 0.9           -- 画面高さに対する割合
  },
  keymaps = {
    enabled = false,       -- デフォルトのキーマップを無効化
    narrow = "<leader>nr", -- カスタムキーマップ
  },
  sync_on_write = true,    -- 保存時に自動同期
  protect_original = true  -- 元のバッファを読み取り専用に
})

使い方

インストール

lazy.nvimを使っている場合

{
  "tkancf/narrowing-nvim",
  config = function()
    require("narrowing").setup()
  end,
}

基本的な使い方

ビジュアルモードで範囲を選択してから

:'<,'>Narrowing

narrowingバッファで編集が終わったら、:wで保存すると元のバッファに変更が反映されます。

使ってみた感想

実際に数週間使ってみて、以下の点で満足しています

Floating Windowの快適さ

画面全体を使って編集できるので、特に小さい画面のラップトップで作業する時の体験が大幅に改善しました。編集に集中できる環境が簡単に作れるのは想像以上に快適です。

今後の展望

現在の実装で基本的な機能は満たしていますが、今後追加したい機能もいくつかあります

  • Treesitterを使った意味的な範囲選択(関数単位、クラス単位など)

また、バグ報告や機能要望も歓迎です。GitHubのIssueで気軽にフィードバックいただければと思います。

関連リンク