普段、よほどのことがなければデバッガは使わずに、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=}><, >")]], }, }, }, } ```