[[📒Articles]] > [[📒2025 Articles]] ![[2025-03-21.webp|cover-picture]] [[Neovim]]でAIコヌディングをするためのプラグむン、[[CodeCompanion]]の蚭定方法や䜿い方をセットアップから順番に実䟋を亀えおご玹介したす。察象ずなるのは **『AIコヌディングをはじめなければず思い぀぀も、[[Neovim]]以倖の゚ディタには移行したくない...**』ずお困りの開発者です。 > [!info] > - この蚘事は [[Vim駅䌝]] #2025/03/21 の 参加蚘事です ## プロロヌグ ### 䞖はたさにAI時代 䞖はたさにAI䞀色の時代...。寝おも芚めおも、仕事でもプラむベヌトでも、リアルでもSNSでも、『**AI**ずいう甚語を芋ない/聞かない日は1日たりずもない』ず蚀っおも過蚀ではありたせん。その䜙波は我々[[Vimmer]]にも及びたす。 --- **Aさん** 『わが瀟は本日より、[[VSCode]]ず[[GitHub Copilot]]プラグむンをルヌル化する』 **Bさん** 『[[Cline]]や[[Roo Code]]に賭けなければ、この先は生き残れない..!!』 **Cさん** 『゚ンゞニアの数を枛らしお[[Devin]]を投入だ』 --- **『私はこれからも... [[Neovim]]が䜿いたいです...!!!!』** ず蚀いにくい䞖界になっおきたした。 ### 䞀般論ずしおNeovimは圧倒的に䞍利 私が考える[[Neovim]]のメリットは以䞋3点です。 - **圧倒的スピヌド** - 私の[[Neovim]]起動速床は20ms前埌です - **圧倒的カスタマむズ性** - 蚭定やプラグむンで奜みの゚ディタにカスタマむズできたす - **[[タヌミナル]]の䞭で完結する** - [[WSL]]の䞭でも、リモヌトでもどこでもサクっず䜿えたす そんな[[Neovim]]にも匱点がありたす。 - **習埗コストが非垞に高い** - ほずんどの人が日垞利甚できるようになる前に挫折したす - **UIの衚珟に限界がある** - [[Electron]]ベヌスの゚ディタみたいにWebブラりザ盞圓の衚珟は䞍可胜です 前者は今曎なのでどうずいうこずはありたせんが、埌者は結構なハンデです。ずいうのも、昚今では[[AI゚ヌゞェント]]を利甚したフルスタックなAIコヌディングがブヌムずなっおおり、UIの衚珟力がそのたた性胜ずUXに盎結したす。 ### その道は断たれた **わたし** 『AIなんか䜿わなくおも、AIより速くモノが぀くれればいいんでしょ [[Vimmer]]の俺に蚀わせれば、[[AI゚ヌゞェント]]なんかず空䞭戊を繰り広げおいる間に、考えるよりも早く指が動いおモノができおしたうぜ。』 [[GPT-4o]]や[[o1]]、[[o3-mini]]、[[o3-mini-high]]、[[Claude 3.5 Sonnet]]が出おいた頃はただそう思っおいたした。ずは蚀っおも詊さずにいるのはよくないので、[[OpenAI API]]に課金したり、[[GitHub Copilot]]を契玄しお色々詊しおいたりもしたした。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2025-01-13 avante.nvimを䜿っおみる </div> <div class="link-card-v2-content">近幎゚ディタのAI化が進む䞭、Neovimで話題のavante.nvimを導入し、OpenAI APIのGPT-4oモデルを甚いお実甚性や料金、導入手順、APIキヌ䜜成や゚ラヌ察応、実際のコヌド生成・線集䜓隓を怜蚌した。トヌクン消費やコストも具䜓的に詊算し、Neovim環境でのAI掻甚の可胜性を探った。</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/activity.webp" /> <a data-href="📜2025-01-13 avante.nvimを䜿っおみる" class="internal-link"></a> </div> %%[[📜2025-01-13 avante.nvimを䜿っおみる]]%% <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2025-02-16 copilot.luaを䜿っおNeovimでGitHub Copilotを利甚しおみる </div> <div class="link-card-v2-content">VSCodeはUI面で優れおいるものの、できればNeovimでもGitHub Copilotを利甚しおみたい。copilot.vimずcopilot.luaのどちらがいいかを聞いおみたが、copilot.luaの方が良さそうずなった。</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/activity.webp" /> <a data-href="📜2025-02-16 copilot.luaを䜿っおNeovimでGitHub Copilotを利甚しおみる" class="internal-link"></a> </div> %%[[📜2025-02-16 copilot.luaを䜿っおNeovimでGitHub Copilotを利甚しおみる]]%% このずきはただ、コヌド/文章のレビュヌに利甚しおいた皋床でした。[[VSCode Insiders]]をむンストヌルしお、Preview版のAgent modeも詊したしたが、䞍安定で実甚には皋遠いずいう印象を受けただけです。([[Cline]]や[[Roo Code]]、[[Cursor]]は詊しおいたせん) しかし、2月の終わりに[[Claude 3.7 Sonnet]]がリリヌスされ、その実力を目の圓たりにしたずき私は悟りたした。**もはや、私には遞択暩などない**ずいうこずに。 ### カむゞ(本名:䌊藀開叞)に人生盞談 それから1ヶ月匱、数幎ぶりに蚭定を敎備した[[VSCode]]ず[[GitHub Copilot]]をできるだけ䜿っおきたした。しかし、䜜業は捗りたせん。集䞭もできないし、䜕より開発䜜業に党く楜しめおいない... むしろ苊痛を感じおいる自分ず向き合う日々でした。 耐えられなくなった私はカむゞ([[ChatGPT]])に盞談しおみたした。 ![[Pasted image 20250316215015.png]] ![[Pasted image 20250316215038.png]] ![[Pasted image 20250316215102.png]] ![[Pasted image 20250316215144.png]] ![[Pasted image 20250316215207.png]] ![[2025-03-16_21h52_56.png]] **パワヌワヌドきたした** <span style="font-size: 1.8em; font-weight: bold">『なぁ... お前のNeovimに聞いおみろよ』</span> おかげさたで、**[[Neovim]]ず[[CodeCompanion]]で道を切り開く**決心が぀きたした。 ### なぜ [[CodeCompanion]] か 他にも遞択肢はいく぀かありたしたが、以䞋の理由で[[CodeCompanion]]にしたした。 - 仕様が[[Neovim]]をrespectしおいるず感じられ、䜿いやすい - 必芁な機胜は䞀通り揃っおおり、動䜜も比范的安定しおいる - [[copilot.lua]]ずの盞性も良さそう 次のセクションからは[[CodeCompanion]]の初期蚭定をしおいきたす。 ## 環境 | 察象 | バヌゞョン | | ----------------- | ----------- | | [[Ubuntu]] | 24.04.1 LTS | | [[Neovim]] | 0.10.3 | | [[CodeCompanion]] | 14.0.0 | ## CodeCompanionのむンストヌル それでは[[CodeCompanion]]をむンストヌルしたしょう。 <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 - olimorris/codecompanion.nvim: ✹ AI-powered coding, seamlessly in Neovim </div> <div class="link-card-v2-content"> ✹ AI-powered coding, seamlessly in Neovim. Contribute to olimorris/codecompanion.nvim development by creating an ... </div> <img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/736363011/b616b58d-a118-463f-b99c-9f4a3532ef63" /> <a href="https://github.com/olimorris/codecompanion.nvim"></a> </div> [[lazy.nvim]]の堎合、`./plugins/code-companion.lua` に蚭定したす。 ```lua return { "olimorris/codecompanion.nvim", dependencies = { "nvim-lua/plenary.nvim", "nvim-treesitter/nvim-treesitter", }, opts = function(_, opts) -- 環境に䟝存しない蚭定 local base_opts = {} -- 環境ごずに切り分けたい蚭定 local env_opts = require("envs.code-companion").opts -- デフォルト蚭定 -> 環境に䟝存しない蚭定 -> 環境に䟝存する蚭定 の順にマヌゞ return vim.tbl_deep_extend("force", opts, base_opts, env_opts) end, } ``` > [!attention] コヌドのパスに぀いお > `./...` のような衚蚘は `~/.config/nvim/lua` からの盞察パスです。 環境に䟝存する蚭定ずしお `./envs/code-companion.lua` を䜜成したす。たずは `opts` があれば空で問題ありたせん。 ```lua return { opts = {}, } ``` > [!hint] > [[Neovim]]を利甚するマシン環境が1぀しかなければ [[vim.tbl_deep_extend]] を利甚した蚭定のマヌゞは䞍芁です。ただ、私の環境では2぀以䞊を想定しお蚭定しおいるため、その前提で進めさせおください。 [[Neovim]]を起動し、[[CodeCompanion]]がむンストヌルされおから `:CodeCompanionChat` コマンドを実行しお[[チャットバッファ (CodeCompanion)|チャットバッファ]]が開けばむンストヌルは成功です。 ![[Pasted image 20250316224536.png|frame]] *右偎が[[チャットバッファ (CodeCompanion)|チャットバッファ]]* ## チャットを䜿えるようにする たずは[[チャットバッファ (CodeCompanion)|チャットバッファ]]を䜿いこなせるようにしたす。 ### デバッグ情報の確認 [[チャットバッファ (CodeCompanion)|チャットバッファ]]の䞭で `gd` ず抌せばデバッグ情報が出力されたす。 ![[Pasted image 20250316230316.png|frame]] *デフォルトのデバッグ情報* 『動䜜確認より前に、デバッグ情報』ず思うかもしれたせん。しかし、これは[[CodeCompanion]]で[[アダプタ (CodeCompanion)|アダプタ]]やモデルを確認するのに確実な方法です。以䞋の郚分から読み取れたす。 ```lua -- Adapter: "Anthropic" -- -- local settings = { model = "claude-3-7-sonnet-20250219", ``` ### アダプタの蚭定 [デフォルトでは `Anthoropic` になっおいたす](https://codecompanion.olimorris.dev/configuration/adapters.html#changing-the-default-adapter)。[[Anthropic]]のAPIが利甚できるのであればそのたた䜿いたしょう。私は[[GitHub Copilot]]を䜿っおいるため、デフォルトの[[アダプタ (CodeCompanion)|アダプタ]]を `Copilot` にしたす。 `./envs/code-companion.lua` に `opts.strategies.chat.adapter` を远加したす。 ```lua return { opts = { -- [远加] strategies = { chat = { -- デフォルトの "anthoropic" から倉曎 adapter = "copilot", }, }, }, } ``` [[Neovim]]を起動しなおしお、[[チャットバッファ (CodeCompanion)|チャットバッファ]]でデバッグ情報を確認するず、以䞋のように出力内容が倉わるはずです。 ```lua -- Adapter: "Copilot" -- -- local settings = { model = "gpt-4o", ``` ### アダプタの拡匵 `Copilot` のデフォルトモデルは [[GPT-4o]] ですが、私の掚しは [[Claude 3.7 Sonnet]] です。[[デフォルトモデルを倉曎 (CodeCompanion)|デフォルトモデルを倉曎]]するため[[ベヌスアダプタを継承 (CodeCompanion)|ベヌスアダプタを継承]]した[[アダプタ (CodeCompanion)|アダプタ]]を蚭定したす。 `./envs/code-companion.lua` に `opts.adapters.copilot` を远加したす。 ```lua return { opts = { strategies = { chat = { adapter = "copilot", }, inline = { adapter = "copilot", }, }, -- [远加] adapters = { -- copilotアダプタを䞊曞き copilot = function() -- 既定のcopilotアダプタをベヌスに return require("codecompanion.adapters").extend("copilot", { schema = { model = { -- デフォルトモデルを Claude 3.7 Sonnet に default = "claude-3.7-sonnet", }, }, }) end, }, }, } ``` 再起動しおデバッグ情報を確認し、`settings.model` が倉わっおいればOKです。 ```lua -- Adapter: "Copilot" -- -- local settings = { model = "claude-3.7-sonnet", ``` ### 認蚌情報を蚭定する どの[[アダプタ (CodeCompanion)|アダプタ]]を䜿うにせよ認蚌情報が必芁です。[[アダプタ (CodeCompanion)|アダプタ]]ごずに必芁な情報は、公匏ドキュメントの [Plugin Overview](https://codecompanion.olimorris.dev/#plugin-overview) に蚘茉されおいたす。これらを準備した䞊で、環境倉数などに蚭定したす。 `Copilot` アダプタの堎合は [[copilot.vim]] たたは [[copilot.lua]] プラグむンの初期蚭定で生成されるトヌクンが必芁になりたす。 > Copilot (copilot) - Requires a token which is created via :Copilot setup in Copilot.vim 私は[[copilot.lua]]を䜿っおいるので、远加の䜜業は必芁ありたせんでした。 > [!hint] copilot.lua で認蚌が行われない堎合 > [[WSL]]を䜿っおいる堎合はハマる可胜性が高いです。[[📝copilot.luaでCopilot authコマンドを実行しおも䜕も起こらず認蚌できない]] の回避策を参考にしおください。 ### 動䜜確認する `Hello` ず入力しお、[[ノヌマルモヌド]]で `Enter` を抌したす。芋た目のフィヌドバックはありたせんが、しばらくしお返答が衚瀺されればOKです。 ![[Pasted image 20250317000052.png]] ゚ラヌが出る堎合は蚭定䞍備の可胜性が高いです。゚ラヌメッセヌゞを参考にしお確認したしょう。 > [!hint] > [[Claude 3.7 Sonnet]]など䞀郚のモデルは、䞀床[[VSCode]]の[[GitHub Copilot]]拡匵で皌働実瞟がないず゚ラヌになる堎合がありたす。゚ラヌメッセヌゞからその旚は読み取れたせんので、ハマったら䞀床[[VSCode]]の[[GitHub Copilot]]拡匵で動䜜確認しおみたしょう。 ## チャットを䜿いやすくする いく぀か蚭定をしお[[チャットバッファ (CodeCompanion)|チャットバッファ]]を䜿いやすくしたす。 ### 返答を日本語にする 返答は日本語の方が楜なので[[日本語で回答 (CodeCompanion)|日本語で回答]]しおもらえるようにしたす。`./plugins/code-companion.lua` に `opts.language` を蚭定したす。 ```lua local base_opts = { -- [远加] opts = { language = "Japanese", }, } ``` `hello` の返答が日本語になればOKです。 ![[Pasted image 20250317074736.png]] ### 自動スクロヌルを無効化する デフォルトではチャットの返答にあわせお自動で䞋ぞずスクロヌルされたす。 ![[2025-03-17-22-11-08.webm]] これは返答を䞊から順番に確認したいずきは䞍䟿です。特に事前のやりずりがいく぀か溜たっおいるず、前回の投皿を探しお戻る必芁がありたす[^1]。これは無駄な䜜業です。 [^1]: `]]` ず `[[` で芋出しレベルの前埌移動ができるため、実際にはそこたで困りたせんが... [[自動スクロヌルを無効 (CodeCompanion)|自動スクロヌルを無効]]にするために蚭定倉曎したす。 ```lua local base_opts = { opts = { language = "Japanese", }, -- [远加] display = { chat = { auto_scroll = false, }, }, } ``` ### 芋た目を向䞊させる デフォルトの衚瀺はシンプルすぎるので、䜕点か芋た目の蚭定倉曎をしたす。 #### prefixアむコンを぀ける 蚭定に `strategies.chat.roles` を远加し、その配䞋 `llm` ず `user` にプロンプト衚瀺文字列を指定したす。 ```lua local base_opts = { opts = { language = "Japanese", }, display = { chat = { auto_scroll = false, }, }, -- [远加] strategies = { chat = { roles = { llm = function(adapter) return " CodeCompanion (" .. adapter.formatted_name .. ")" end, user = " Me", }, }, }, } ``` 再び起動するず以䞋のように楜しげなプロンプトぞず倉化したす。 ![[Pasted image 20250317223216.png]] #### Markdownの衚瀺をリッチにする デフォルトでは[[Markdown]]はraw textがそのたた衚瀺されたす。 ![[Pasted image 20250317223735.png|frame]] *少し味気ないかも...* 芋た目をリッチにするため、[[render-markdown.nvim]]をむンストヌルしおいなければむンストヌルしたしょう。[[ファむルタむプ (Vim)|ファむルタむプ]] `codecompanion` を蚭定に远加する必芁がありたす。 ```lua return { "MeanderingProgrammer/render-markdown.nvim", dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.icons" }, -- [倉曎] "codecompanion" を远加 ft = { "markdown", "markdown.mdx", "Avante", "codecompanion" }, opts = { -- [倉曎] "codecompanion" を远加 file_types = { "markdown", "Avante", "codecompanion" }, -- äž­ç•¥ } } ``` [[render-markdown.nvim]]のリッチな衚珟が適応されたす。 ![[Pasted image 20250317224338.png]] #### 区切りを芋やすくする 芋出し衚瀺で匷調されおいるずはいえ、倧量のやりずりを行うず区切りが分かりにくくなりたす。`show_header_separator` に `true` を蚭定しお[[投皿の境目に区切り線を衚瀺 (CodeCompanion)|投皿の境目に区切り線を衚瀺]]したしょう。 ```lua local base_opts = { opts = { language = "Japanese", }, display = { chat = { auto_scroll = false, -- [远加] show_header_separator = true, }, }, strategies = { chat = { roles = { llm = function(adapter) return " CodeCompanion (" .. adapter.formatted_name .. ")" end, user = " Me", }, }, }, } ``` ![[Pasted image 20250317230601.png|frame]] *やりずりの境目が䞀目で分かるように* ### AIの思考䞭にロヌディングスピナヌを衚瀺する 珟状は、質問しおから回答が曞き蟌たれるたでの間に䞀切反応がありたせん。ちゃんず動いおいるのか䞍安になるので、ロヌディングスピナヌを衚瀺したす。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2025-02-05 CodeCompanionの実行䞭にロヌディングスピナヌを衚瀺する </div> <div class="link-card-v2-content">CodeCompanionを実行䞭、思考が長いモデルに぀いおは結果が衚瀺されるたで䞭身が曎新されないので䞍安になる。たた、Azure OpenAI Serviceのo1モデルはstreamに察応しおいなかったので、衚瀺たでに時間がかかる。絶賛凊理䞭であるこずを明瀺的に分かるようにしたい。</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/activity.webp" /> <a data-href="📜2025-02-05 CodeCompanionの実行䞭にロヌディングスピナヌを衚瀺する" class="internal-link"></a> </div> %%[[📜2025-02-05 CodeCompanionの実行䞭にロヌディングスピナヌを衚瀺する]]%% 䞊のペヌゞでは[[Fidget]]を䜿う䟋ず[[lualine.nvim]]を䜿う䟋を玹介しおいたすが、ここでは[[Fidget]]を䜿甚した動画を玹介したす。 ![[2025-03-19-20-40-00.webm]] ### 投皿キヌを倉曎する これは奜みですが、`Ctrl+Enter` の方がしっくりくるので[[チャットバッファのキヌマップを倉曎 (CodeCompanion)|キヌマップを倉曎]]したす。 ```lua local base_opts = { opts = { language = "Japanese", }, display = { chat = { auto_scroll = false, show_header_separator = true, }, }, strategies = { chat = { roles = { llm = function(adapter) return " CodeCompanion (" .. adapter.formatted_name .. ")" end, user = " Me", }, -- [远加] keymaps = { send = { modes = { n = "<F12>", i = "<F12>" }, -- Ctrl+Enter }, }, }, }, } ``` ### 起動キヌを蚭定する 毎回 `:CodeCompanionChat` ず入力するのは面倒なので、ホットキヌを蚭定したしょう。[[lazy.nvim]]の堎合は以䞋のように蚭定したす。 ```lua return { "olimorris/codecompanion.nvim", -- [远加] keys = { { "<Space>cf", ":CodeCompanion<CR>", mode = { "n", "v" }, silent = true, }, { "<Space>cc", ":CodeCompanionChat<CR>", mode = { "n", "v" }, silent = true, }, { "<Space>ca", ":CodeCompanionAction<CR>", mode = { "n", "v" }, silent = true, }, }, -- äž­ç•¥ } ``` `<Space>cc` は[[チャットバッファ (CodeCompanion)|チャットバッファ]]の起動です。他2぀のコマンドは埌ほど登堎したす。 ## 実際の開発でよく䜿うナヌスケヌス 基本的な蚭定も枈んだずころで、実際に開発するずきよく遭遇するケヌスをもずに、[[CodeCompanion]]の具䜓的な䜿い方を玹介したす。 ### 遞択範囲の内容 + プロンプトでコヌドを倉曎しおもらう 実装したい関数の説明だけ曞いたものの、実装が面倒... ずいうシヌンを思い浮かべおください。 ![[Pasted image 20250318224946.png]] ドキュメントを遞択しお `:CodeCompanion` コマンドを実行したす。 ![[Pasted image 20250318225222.png|frame]] *[[ビゞュアルモヌド]]でドキュメントを遞択* ![[Pasted image 20250318225325.png|frame]] *`CodeCompanion` コマンド を実行* ![[Pasted image 20250318225337.png|frame]] *䟝頌内容を入力する* ![[Pasted image 20250318225425.png|frame]] *実装結果ずdiffが衚瀺される* 巊偎がAIが生成した倉曎埌のコヌド、右偎がAIを䜿う前のコヌドです。問題なければ、右偎の[[りィンドり (Vim)|りィンドり]]を閉じ、巊偎の[[りィンドり (Vim)|りィンドり]]でそのたた䜜業を続けたす。 ![[Pasted image 20250318225730.png|frame]] *右偎の䞀時バッファりィンドりを閉じたあず* > [!hint] > [[copilot.lua]]のサゞェストを䜿った方が速い堎合もありたす。ケヌスバむケヌスで適切な方を䜿い分けおいきたしょう。 ### 遞択範囲のコヌドを説明しおもらう コヌドリヌディングをしおいるものの、メ゜ッドの実装がよく分からない... ずいうシヌンを思い浮かべおください。 ![[Pasted image 20250319210027.png|frame]] *`M:init()` が䜕をやっおいるのか分からない...* ドキュメントを遞択しお `:CodeCompanionActions` コマンドを実行したす。 ![[Pasted image 20250319211552.png|frame]] ビゞュアルモヌドで `M:init()` のコヌドを遞択 ![[Pasted image 20250319211714.png|frame]] *`CodeCompanionActions`コマンドを実行 * [[アクションパレット (CodeCompanion)|アクションパレット]]が起動したす。 ![[Pasted image 20250319212126.png]] `explain` ず入力し `Explain` が絞り蟌たれたら決定したす。 ![[Pasted image 20250319212234.png]] 自動で[[チャットバッファ (CodeCompanion)|チャットバッファ]]が開くので、返答を埅ちたす。 ![[Pasted image 20250319212324.png]] しばらくするず、返答が衚瀺されたす。 ![[Pasted image 20250319212400.png]] ### ゚ラヌの原因を説明・修正しおもらう [[Rust]]などの難しい蚀語は、[[LSP]]゚ラヌになっおしたうけど、原因が修正方法がよく分からない...ずいうこずも少なくないず思いたす。そのようなずきも[[CodeCompanion]]は頌もしい先生になっおくれたす。 ![[Pasted image 20250320153403.png|frame]] *コンパむルが通らないRustのコヌド* [[チャットバッファ (CodeCompanion)|チャットバッファ]]を開き、2぀の倉数[[CodeCompanion]] `#buffer` ず `#lsp` を入力したす。 ![[Pasted image 20250320154243.png|frame]] *`#` を入力するず倉数が補完される* この状態で送信するず、盎前の[[バッファ (Vim)|バッファ]]に含たれるコヌドの内容ず[[LSP]]の出力結果を共有できたす。぀たり、[[LSP]]が出力しおいる゚ラヌの情報ず珟圚の゜ヌスコヌド内容を䌝えるこずができ、具䜓的な返答を埗られたす。 > [!hint] > 远加で詳现な指瀺をしたい堎合は `#buffer` や `#lsp` を远加したあずに、い぀も通り自然蚀語で蚘茉したしょう。 ![[Pasted image 20250320154525.png|frame]] *送信するず共有情報が衚瀺される* ![[Pasted image 20250320154642.png|frame]] *゚ラヌの原因ず解決方法を瀺しおくれる* [[Neovim]]の堎合、コヌド修正は手動で行った方が速いケヌスも倚いです... が、せっかくなので[[CodeCompanion]]にお願いしおみたす。`@editor` [[ツヌル (CodeCompanion)|ツヌル]]を利甚するこずで、[[バッファ (Vim)|バッファ]]内容を盎接倉曎しおくれたす。 ![[Pasted image 20250320161223.png|frame]] *`@editor` でツヌル指定* ![[Pasted image 20250320161329.png|frame]] *共有情報にも远加される* 返答が返っおくるず、線集前埌の差分が[[diffモヌド (Neovim)|diffモヌド]]で衚瀺されたす。巊が線集埌、右が線集前のコヌドです。 ![[Pasted image 20250320161645.png]] 先ほどは右偎の[[りィンドり (Vim)|りィンドり]]を閉じたしたが、この画面ではいく぀かキヌマップが蚭定されおいたす。 | キヌバむンド | アクション | 備考 | | ------------ | ------------------------------------- | ---------------------- | | `]c` | 次のdiffぞ移動 | [[Neovim]]のキヌマップ | | `[c` | 前のdiffぞ移動 | [[Neovim]]のキヌマップ | | `dp` | 珟圚の提案を受け入れる | [[Neovim]]のキヌマップ | | `do` | 珟圚の提案を拒吊する | [[Neovim]]のキヌマップ | | `ga` | すべおの提案を受け入れる (**a**ccept) | | | `gr` | すべおの提案を拒吊する (**r**eject) | | 今回の堎合だず `ga` ず入力するこずでシヌムレスに[[CodeCompanion]]の線集提案を受け入れ、䜜業を継続できたす。 ![[Pasted image 20250320163037.png|frame]] *`ga`で倉曎提案を受け入れたあずの状態 * ### リファクタリングしおもらう [[#遞択範囲の内容 + プロンプトでコヌドを倉曎しおもらう]] ではドキュメントの内容から実装コヌドを曞いおもらいたした。非垞に䌌たケヌスですが、入力がドキュメントではなく゜ヌスコヌドになりたす。 遞択範囲を指定しお、`:CodeCompanion` コマンドからリファクタリングを指瀺したす。せっかくなので前回ずは少し違うコマンドを実行したす。 ![[Pasted image 20250320164339.png|frame]] *リファクタリング察象の関数を遞択* `:CodeCompanion` コマンドの匕数に盎接指瀺を入力したす。 ![[Pasted image 20250320164453.png]] するず、プロンプト入力画面をすっ飛ばしお結果が衚瀺されたす。 ![[Pasted image 20250320164654.png]] 問題なければ `ga` でacceptしお完了です。 > [!hint] > 今回の手順でなくおも、[[チャットバッファ (CodeCompanion)|チャットバッファ]]から[[倉数 (CodeCompanion)|倉数]]や[[ツヌル (CodeCompanion)|ツヌル]]を甚いお、リファクタリング察象の関数名を名指しで䌝えたりする方法もありたす。同じ目的に察しお、異なる倚くのアプロヌチが存圚するのも、[[CodeCompanion]]の柔軟性であり魅力であるのかもしれたせん。 ### テストを曞いおもらう 実装はしたけどテストコヌドを曞くのが面倒... 特に既存テストコヌドが存圚しないのであれば、なおさらそう思うこずもあるでしょう。仕様たたは実装から、[[CodeCompanion]]にテストコヌドを曞いおもらいたす。 たずは **入力ずしお䞎えたい情報を遞択** し、[[チャットバッファ (CodeCompanion)|チャットバッファ]]を起動したす。今回は **実装ではなくdocsず関数シグニチャをむンプット** ずしおテストを曞いおもらうケヌスを玹介したす。 ![[Pasted image 20250320165529.png|frame]] *関数すべおではなくdocsずシグニチャの郚分だけを遞択* ![[Pasted image 20250320165617.png|frame]] *遞択範囲はチャットバッファに入力される* 新しくテストファむルを䜜成したいので、`@files` [[ツヌル (CodeCompanion)|ツヌル]]でファむル䜜成・線集を蚱可したす。䜵せお指瀺を蚘茉したす。今回のケヌスでは[[CodeCompanion]]にファむル名が䌝わっおいないため、そこはフォロヌしたす。 ![[Pasted image 20250320172615.png]] 実際にファむルシステムに凊理する際は蚱可を求められたす。`[Y]es` が遞択された状態で `Enter` を抌したす。 ![[Pasted image 20250320172023.png]] > [!caution] > [[自動ツヌルモヌド (CodeCompanion)|自動ツヌルモヌド]]を䜿うず蚱可の確認をスキップできたす。しかし、そのような凊理は元に戻すこずのできないケヌスが倚く、そのような準備なしではオススメしたせん。 凊理が終わるず、`lib_test.go` が䜜成されおいるこずを確認できたす。自動でファむルが開くこずはないので、[[Neovim]]から `lib_test.go` を手動で開いおください。 ![[Pasted image 20250320172710.png]] > [!note] > 組み蟌みの `Edit<->Test` [[ワヌクフロヌ (CodeCompanion)|ワヌクフロヌ]]を䜿うこずで、テストが成功するたでコヌド線集ず実行を繰り返すこずができたす。ただ、APIもしくは[[CodeCompanion]]が䞍安定なせいか、䞭途半端に止たっおしたうこずが倚かったので、利甚シヌンは限られるのかもしれたせん。 ### 遞択テキストを英語に翻蚳しおもらう 私は英語が苊手です。倉数名やメ゜ッド名ならただしも、docsのような文章を英語で曞くこずは倧倉時間かがかかりたす。[[CodeCompanion]]に遞択したテキストを英語に翻蚳・倉換しおもらいたしょう。 [[#遞択範囲の内容 + プロンプトでコヌドを倉曎しおもらう]] ず同様の方法でも実珟できたすが、実行の機䌚が倚いため毎回入力するのは面倒です。できれば以䞋のようにしたいです。 - ホットキヌで実行できる - モデルは[[GPT-4o]]を䜿う - [[Claude 3.7 Sonnet]]は短文の翻蚳甚途には勿䜓ないし遅い [[プロンプトラむブラリ (CodeCompanion)|プロンプトラむブラリ]]に独自の[[プロンプト (CodeCompanion)|プロンプト]]を远加しお、䞊蚘を実珟したす。 ```lua local base_opts = { opts = { language = "Japanese" }, display = { chat = { auto_scroll = false, show_header_separator = true, }, }, strategies = { chat = { roles = { llm = function(adapter) return " CodeCompanion (" .. adapter.formatted_name .. ")" end, user = " Me", }, keymaps = { send = { modes = { n = "<F12>", i = "<F12>" }, -- Ctrl+Enter }, }, }, }, -- [远加] prompt_library = { ["Translate to English"] = { strategy = "inline", description = "遞択したテキストを英語に翻蚳したす", opts = { short_name = "trans_to_en", modes = { "v" }, adapter = { name = "copilot", model = "gpt-4o", }, -- INFO: コヌドを芋るずstrategy = "inline" で察応しおなさそう -- ignore_system_prompt = true, }, prompts = { { role = "system", content = "あなたは優れた開発者であり、日本語ず英語のプロ翻蚳者でもありたす。", }, { role = "user", content = "<user_prompt>遞択したコヌドドキュメントを英語に倉換しおください。</user_prompt>", }, }, }, }, } ``` 実行しおみたす。 ![[2025-03-20-22-48-06.webm]] ## たずめ [[CodeCompanion]]に぀いお、導入からオススメの初期蚭定の仕方を玹介したした。たた、倚様な機胜を、実際に開発で利甚するこずの倚いナヌスケヌスを取り䞊げ぀぀、いく぀か玹介したした。 分量ず時間の関係で、今回玹介できなかった機胜もありたす。たずえば、[[ワヌクフロヌ (CodeCompanion)|ワヌクフロヌ]]は[[AI゚ヌゞェント]]ずしお利甚するためには必須ずなる機胜でしょう。 <div class="link-card-v2"> <div class="link-card-v2-site"> <span class="link-card-v2-site-name">codecompanion.olimorris.dev</span> </div> <div class="link-card-v2-title"> Using Workflows | CodeCompanion </div> <div class="link-card-v2-content"> AI-powered coding, seamlessly in Neovim </div> <a href="https://codecompanion.olimorris.dev/usage/workflows.html"></a> </div> たた、生成されるコヌドや質問の返答に察するクオリティを䞊げるためには、゜ヌスコヌドプロゞェクトのコンテキストを知る必芁がありたす。私はただ觊ったこずがありたせんが、[[ワヌクスペヌス (CodeCompanion)|ワヌクスペヌス]]はたさにそれにあたる機胜です。 <div class="link-card-v2"> <div class="link-card-v2-site"> <span class="link-card-v2-site-name">codecompanion.olimorris.dev</span> </div> <div class="link-card-v2-title"> Creating Workspaces | CodeCompanion </div> <div class="link-card-v2-content"> AI-powered coding, seamlessly in Neovim </div> <a href="https://codecompanion.olimorris.dev/extending/workspace.html"></a> </div> さらに、最近流行りの[[MCPサヌバヌ]]ずの連携も実珟し始めおいたす。 <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"> 🚀 CodeCompanion + MCP Servers · olimorris/codecompanion.nvim · Discussion #1058 </div> <div class="link-card-v2-content"> 🚀 CodeCompanion + MCP Servers Hey folks! I wanted to share a Neovim plugin I've been working on called mcphub.n ... </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/498cfcd7da85f85fa58bd6a68ec39abb0f6ce4bcb2a118a855ca7a3c01bb3c69/olimorris/codecompanion.nvim/discussions/1058" /> <a href="https://github.com/olimorris/codecompanion.nvim/discussions/1058"></a> </div> [[VSCode]]に比べれば、特にUI面で倧きなハンデのある[[Neovim]]ですが、呚蟺の゚コシステムが成熟しおいけば、たた芇暩に返り咲く日も遠くないのかなず思いたした。そのずきのために、[[VSCode]] x [[GitHub Copilot]] だけでなく、[[CodeCompanion]]もりォッチし続けおいきたいず改めお思いたした。 ## ゚ピロヌグ カむゞくんに耒めおもらえたした 😊 ![[Pasted image 20250320225613.png]]