普段、よほどのことがなければデバッガは使わずに、printデバッグすることが多い。[[Neovim]]だと同様の需要は他のエディタ以上にありそうなので、効率化できないかを確かめてみる。
## debugprint.nvim
まずは対応言語数が多く、シンプルな[[debugprint.nvim]]から試す。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - andrewferrier/debugprint.nvim: Debugging in NeoVim the print() way!
</div>
<div class="link-card-v2-content">
Debugging in NeoVim the print() way! Contribute to andrewferrier/debugprint.nvim development by creating an acco ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/813df66d930ca5ecc69908e68667fecfd150e7f5c535f0f9f2e94fbe5b922d40/andrewferrier/debugprint.nvim" />
<a href="https://github.com/andrewferrier/debugprint.nvim?tab=readme-ov-file"></a>
</div>
前評判の通り、使い勝手はとても良いが、複数行に対する機能が弱そうなので一旦様子見。
```ts
// filteredUsers のデバッグをしたい場合にうまくできない...
const filteredUsers = users.filter((user) =>
!condition.name ||
user.first_name.includes(condition.name) ||
user.last_name.includes(condition.name)
);
```
## nvim-chainsaw
お次は[[nvim-chainsaw]]。名前は物騒。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - chrisgrieser/nvim-chainsaw: Quick and feature-rich insertion of various kinds of log statements.
</div>
<div class="link-card-v2-content">
Quick and feature-rich insertion of various kinds of log statements. - chrisgrieser/nvim-chainsaw
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/b1bcabdf26995ab532c1b1b88852a7090028c289c708d8eb63a42a11a094295e/chrisgrieser/nvim-chainsaw" />
<a href="https://github.com/chrisgrieser/nvim-chainsaw"></a>
</div>
[[debugprint.nvim]]よりも情報がミニマムだが、多くのfunction IFがあり、カスタマイズ性は設定含めて高そう。guttarの🪚アイコンもポップで好み。
[[debugprint.nvim]]の弱点も解消されており、おおむね問題なさそうに見えるが、もう1つ有名なやつがあるのでそちらも確認してみる。
## timber.nvim
最後は[[timber.nvim]]を使ってみた。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - Goose97/timber.nvim: Neovim plugin to quickly insert log statements and capture log output
</div>
<div class="link-card-v2-content">
Neovim plugin to quickly insert log statements and capture log output - Goose97/timber.nvim
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/46c944274d24b1f7a3adb41f0dbfcca4325004ac82b66e9d8797079b1a160d0b/Goose97/timber.nvim" />
<a href="https://github.com/Goose97/timber.nvim"></a>
</div>
個人的には一番直感的に利用できたので[[timber.nvim]]を使うことにした。純粋に[[バッファ (Vim)|バッファ]]の内容のみを変更する点がシンプルで気に入った。[[nvim-treesitter]]との連携で、[[nvim-chainsaw]]とほぼ同等の位置にログを挿入してくれるので、決め手はそこだけかな。
```lua
return {
"Goose97/timber.nvim",
event = "LspAttach",
keys = {
{
"gld",
function()
require("timber.actions").clear_log_statements({ global = false })
end,
},
{
"glt",
function()
require("timber.actions").search_log_statements()
end,
},
},
opts = {
log_templates = {
default = {
javascript = [[console.log("%log_marker L%line_number %log_target", %log_target)]],
typescript = [[console.log("%log_marker L%line_number %log_target", %log_target)]],
lua = [[print("%log_marker L%line_number %log_target " .. %log_target)]],
go = [[log.Printf("%log_marker L%line_number %log_target: %v\n", %log_target)]],
rust = [[println!("%log_marker L%line_number %log_target: {:#?}", %log_target);]],
python = [[print(f"%log_marker L%line_number {%log_target=}")]],
},
},
batch_log_templates = {
default = {
javascript = [[console.log("%log_marker L%line_number", { %repeat<"%log_target": %log_target><, > })]],
typescript = [[console.log("%log_marker L%line_number", { %repeat<"%log_target": %log_target><, > })]],
lua = [[print(string.format("%log_marker L%line_number %repeat<%log_target=%s><, >", %repeat<%log_target><, >))]],
go = [[log.Printf("%log_marker L%line_number %repeat<%log_target: %v><, >\n", %repeat<%log_target><, >)]],
rust = [[println!("%log_marker L%line_number %repeat<%log_target: {:#?}><, >", %repeat<%log_target><, >);]],
python = [[print(f"%log_marker L%line_number %repeat<{%log_target=}><, >")]],
},
},
},
}
```