|
| 1 | ++++ |
| 2 | +title = "QfSync.nvim: QuickFixのバッファとのずれをなくして便利に使う" |
| 3 | +date = 2025-09-08 |
| 4 | +description = "About blog post" |
| 5 | + |
| 6 | +[extra] |
| 7 | +comment = true |
| 8 | + |
| 9 | +[taxonomies] |
| 10 | +tags = ["Vim駅伝", "Neovim", "Vim"] |
| 11 | ++++ |
| 12 | + |
| 13 | +この記事は[Vim駅伝](https://vim-jp.org/ekiden/)の2025-09-08の記事です。 |
| 14 | +Vim駅伝は常に参加者を募集しています。詳しくは[こちらのページ](https://vim-jp.org/ekiden/about/)をご覧ください。 |
| 15 | + |
| 16 | +前回の記事は [s-show](https://github.com/s-show) さんの [Neovim の小技集 - モード判定からカラーハイライトまで](https://kankodori-blog.com/post/2025-09-05/) でした。 |
| 17 | + |
| 18 | +# 始めに |
| 19 | + |
| 20 | +皆さんはVimの機能の一つであるQuickFixを使っていますか? |
| 21 | + |
| 22 | +私は、リファクタリングしたい箇所を `:vimgrep` だったりFuzzy Finderで検索して便利に使っています。 |
| 23 | +リファクタリングしたい箇所をQuickFix上にリストアップできたら、ジャンプしてリファクタリングを実行していきます。 |
| 24 | + |
| 25 | +しかし編集した結果、行数が変わると同じファイルのそれ以降のQuickFixの要素のジャンプ先がずれて少し面倒な思いをすることがあります。 |
| 26 | +これをプラグインの力で解決したい!! |
| 27 | + |
| 28 | +ところで、Neovimにはextmark (`:h extmarks`) という機能があります。 |
| 29 | + |
| 30 | +[【Neovim】好きな位置にテキストを埋め込んだりハイライトできる「ExtMark」の使い方](https://www.rasukarusan.com/entry/2021/08/22/202248) |
| 31 | + |
| 32 | +extmarkはなんと、編集に追従して位置を保持することが出来ます(どういうことか分からない方は上の記事のgifを見てください)。 |
| 33 | +それを使ってQuickFixの要素の位置を保存してみようと思います。 |
| 34 | + |
| 35 | +# 作った |
| 36 | + |
| 37 | +extmarkを使ってQuickFixの位置を保存するプラグインを作りました。 |
| 38 | + |
| 39 | +[satler-git/qfsync.nvim](https://github.com/satler-git/qfsync.nvim) |
| 40 | + |
| 41 | +## 簡単な使い方 |
| 42 | + |
| 43 | +```lua |
| 44 | +local qfsync = require("qfsync") |
| 45 | + |
| 46 | +qfsync.add_marks() -- 要素に対応するextmarkを作成 |
| 47 | +qfsync.sync() -- extmarkから位置を復元 |
| 48 | + |
| 49 | +qfsync.sync_all() -- 上記の両方を実行 |
| 50 | +``` |
| 51 | + |
| 52 | +これだけです。キーマップにするなり、autocmdにするなりして使えます。 |
| 53 | + |
| 54 | +(`BufEnter` に設定したら他のプラグインと競合して?(まだ原因があいまい) 要素が消えることがありました。もし再現できたら教えてください) |
| 55 | + |
| 56 | +## ポイント |
| 57 | + |
| 58 | +QuickFixには `user_data` というカスタムデータを保持できるフィールドがあります。 |
| 59 | +その中に `ext_id` というフィールドを作ってそこにextmarkのIDを保存しています。 |
| 60 | + |
| 61 | +# 終わりに |
| 62 | + |
| 63 | +そもそもこれが初めてのプラグインでした。そのためLuaプラグインの構造や作法などが分からず、戸惑いました。 |
| 64 | +とっかかりは少し難しかったですが、ごちゃごちゃやっていたら最終形は意外と小さくてシンプルな実装になりました。 |
| 65 | +これがVimか〜という感じです。 |
| 66 | + |
| 67 | +また、ヘルプがめちゃくちゃありがたかったです。なんだかんだ使いこなせてない気がするのでもっと使いこなしたいです。 |
| 68 | + |
0 commit comments