だいたい完成
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Rikuoh Tsujitani 2023-12-03 10:03:51 +09:00
parent 43d82a1611
commit 983f19e5d2
Signed by: riq0h
GPG key ID: 010F09DEA298C717

View file

@ -5,12 +5,12 @@ draft: true
tags: ['tech']
---
[あれから](https://riq0h.jp/2023/01/20/210601/)一年近い年月が経った。ひとたび完結の日を見た僕のinit.luaはその後も拡張し続け、ずいぶんIDE的な出で立ちに成長した。当初のサブ武器としての位置付けはどこへやら、今ではすっかり長剣の顔をして鞘に収まっている。電脳空間を切り開くデジタルウエポンはえてして可変長であり、所有者の意向次第で自在に特性を変えられるのだ。本稿では新たに増えたプラグイン群を紹介する。
[あれから](https://riq0h.jp/2023/01/20/210601/)一年近い年月が経った。ひとたび完結を見た僕のinit.luaはその後も拡張し続け、ずいぶんIDE的な出で立ちに成長した。当初のサブ武器としての位置付けはどこへやら、今ではすっかり長剣の顔をして鞘に収まっている。電脳空間を切り開くデジタルロードアウトはえてして可変長であり、所有者の意向次第で自在に特性を変えられるのだ。本稿では新たに増えたプラグイン群を紹介する。
## [jaq-nvim](https://github.com/is0n/jaq-nvim)
![](/img/230.png)
書いたコードを即座に実行してくれるプラグイン。国内では[vim-quickrun](https://github.com/thinca/vim-quickrun)がとりわけ有名だが、Vim用のプラグインなのでNeovim特有のUIに対応していない惜しさがあった。本プラグインは逆にNeovimでしか動かない代わりに最新の仕様に追従している。
いわゆるタスクランナー。書いたコードを即時に実行してくれる。国内では応用の幅広さから[vim-quickrun](https://github.com/thinca/vim-quickrun)がとりわけ有名だが、元がVim用のプラグインなのでNeovim特有のUIに対応していない惜しさがあった。jaq-nvimは逆にNeovimでしか動かない代わりにfloat windowで表示できる。
設定では実行したい言語のコマンドを指定するほか、ウインドウの枠や位置を自分の好みに決められる。どうせターミナル上にいるのだからタブを開くなり、tmuxのpopupやwindowで別途実行するなりすればいいという意見もあるが僕も前はそう思っていた、多少なりともワンクッションの手間を減らせる効能は意外にあなどれない。以下に設定例を示す。
@ -65,11 +65,11 @@ require("jaq-nvim").setup({
vim.keymap.set("n", "<leader>j", ":<C-u>Jaq<CR>", { silent = true })
```
なにげにコンパイル言語も即時に走らせられるので言語学習のお供にもかなり役立つ。
なにげにコンパイル言語もすぐに走らせられるので言語学習のお供にも役立つ。
## [colorful-winsep.nvim](https://github.com/nvim-zh/colorful-winsep.nvim)
![](/img/231.png)
splitしたwindowの枠に色をつける……たったこれだけのことが期待以上の視認性向上をもたらしてくれたのはまさに目からうろこだった。特に`laststatus = 3`にして単一のstatusしか表示させていない人は大いに助かるだろう。以下に設定例を示す。
splitしたwindowの枠に色をつける……たったそれだけのことが予想以上に視認性向上をもたらしてくれたのはまさに目からうろこだった。特に`laststatus = 3`にして単一のstatusしか表示させていない人はとても助かるだろう。以下に設定例を示す。
```lua
--colorful-winsep
@ -81,12 +81,12 @@ require("colorful-winsep").setup({
})
```
実際にはstatusをよく確認すればファイルパスの違いで見分けはつかなくもないが、高速で編集位置を移動している最中に直感的に気づきを得るのはなかなか難しい。しかし自分の好みの色でハイライトされていると一瞬の躊躇なく迷わずに済む。
実際にはstatusをよく確認すればファイルパスの違いで見分けはつかなくもないが、編集位置を高速で移動している最中に直感的に気づきを得るのはなかなか難しい。自分の好みの色でハイライトされていると一瞬の躊躇なく迷わずに済む。
## [nvim-dap](https://github.com/mfussenegger/nvim-dap)
Neovimを含む現代のエディタがLSPLanguage Server Protocolの恩恵を受けているのはよく知られた話だ。いつになく気前のよいMicrosoftがオープンソースで公開してくれているので、我々は種々のプラグインを通してリソースを活用できる。実はデバッガーもDSPDebug Adapter Protocolと呼ばれる仕様が公開されており、今やNeovim上でIDE並みのデバッグ環境をも手に入れられる。
Neovimを含む現代のエディタがLSPLanguage Server Protocolの恩恵を受けているのはよく知られた話だ。いつになく気前のよいMicrosoftがオープンソースで公開してくれているので、我々は種々のプラグインを通してそれらを利用できる。同様に、実はデバッガもDSPDebug Adapter Protocolなる仕様が公開されており、今やNeovim上でIDE並みのデバッグ環境が手に入る。
恥ずかしながら僕はVimでデバッグをしようと考えたことさえなかったので初めて知った時はかなり感動した。名実ともにすべてがVimですべての作業が行えるとなれば、大規模開発におけるエディタの地位はますます再評価されるだろう。例によって順次、設定例を示していく
恥ずかしながら僕はVimでデバッグをしようと考えたことがなかったので、初めて知った時はかなり感動した。名実ともにすべての作業がVimで行えるとなれば、大規模開発におけるエディタの立ち位置はますます見直されていくだろう。例によって設定を示す
```lua
local function map(mode, lhs, rhs, opts)
@ -113,24 +113,31 @@ map("n", "<leader>d", ":lua require'dapui'.toggle()<CR>", { silent = true })
map("n", "<leader><leader>d", ":lua require'dapui'.eval()<CR>", { silent = true })
```
この例では`<leader>;`でブレークポイントを指定できる。しかし当然、これだけでは肝心のデバッガ本体が存在しないので機能しない。LSPにおいて任意の言語サーバを導入するように、デバッガも逐一導入して設定しなければならない。ほぼ入れただけでよしなにやってくれるものもあれば、ひと手間が必要な場合もある。
この例では`<leader>;`でブレークポイントを指定する。しかし当然、これのみでは肝心のデバッガ本体が存在しないため動かない。LSPクライアントで任意の言語サーバを導入するように、デバッガも各自導入して設定しなければならない。ほぼ入れただけでよしなにやってくれるものもあれば、ひと手間が必要な場合もある。
たとえば、RubyやGoはそれぞれ対応する設定プラグインを導入すると実質ーコンフィグで動いてくれる。lazy.nvimなら`config = true`を加えさえすればとりあえず動く。他方、Pythonはデバッガのパスを明記しないと起動しなかった。あえて記すならこんな感じになる
たとえばデバッガをMasonで管理していて、そっちの方を使いたい時は下記の要領でファイルパスを書かないといけない。nvim-dap-goは書かなくてもPATHが通っている外部のコマンドを勝手に実行してくれるが、Pythonは明記しないと怒られる仕様だった
```lua
{ "suketa/nvim-dap-ruby", config = true, ft = "ruby" },
{ "leoluz/nvim-dap-go", config = true, ft = "go" },
{ "leoluz/nvim-dap-go", ft = "go" },
{ "mfussenegger/nvim-dap-python", ft = "python" },
--DAP-Python
--nvim-dap-go
require("dap-go").setup({
delve = {
path = ".local/share/nvim/mason/packages/delve/dlv",
},
})
--nvim-dap-python
require("dap-python").setup(vim.fn.stdpath("data") .. "/mason/packages/debugpy/venv/bin/python")
```
なお、TypeScriptやJavaに至ってはあまりにも面倒臭すぎて動作検証を放棄してしまった。ちなみに上記の例では[Mason.nvim]()でインストールしたデバッガを指定している。
なお、Javaに至ってはあまりにも設定が面倒臭すぎて動作検証を放棄してしまった。Masonのjdtlsを使ってうまくやれた人がいたら逆に教えてほしい
## [nvim-dap-ui]()
![](/img/232.gif)
以上の設定で一応デバッグは行えるようになったが、それにしても画面がおざなりすぎるのは否めない。そこでこのプラグインを導入すると、たちまちデバッグ専用に設えられたpaneがジャキーンと展開される。さながら変形によって破壊力が上がる武器のようだ。ただし敏捷性<アジリティ>は落ちる。ここぞという時に展開して一撃で獲物を仕留める……そんな印象を受ける。
ここまでで一応デバッグは行える形になったが、それにしても画面がおざなりすぎるのは否めない。そこでこのプラグインを導入すると、keymapに応じてデバッグ専用に設えられたwindowがジャキーンと展開される。さながら変形によって破壊力が上がる武器のようだ。ただし敏捷性<アジリティ>は落ちる。ここぞという時に展開して一撃で獲物を仕留める……そんな印象を受ける。
```lua
require("dapui").setup({
@ -193,12 +200,12 @@ require("dapui").setup({
})
```
設定項目は非常に多い。そのうち細かく変えようと思ってあえてデフォルト設定を書き連ねていたが、なんだかんだで大していじっていない。見ての通り、各機能の位置関係やアイコン類を変更できる。僕はREPLの表示領域を広めにした。いずれにしてもこれでIDEと同等の作業環境が手に入る。
設定項目は非常に多い。そのうち細かく変えるつもりであえてデフォルト設定を書き連ねていたが、なんだかんだで大していじっていない。見ての通り、各windowの位置関係やアイコン類を変更できる。僕はREPLの表示領域を広めにした。いずれにしてもこれでIDEと同等の作業環境が手に入る。
## [Lspsaga](https://nvimdev.github.io/lspsaga/)
![](/img/233.png)
本稿のトリを務めるのはLSP関連の表示をリッチにせしめるプラグインだ。表示のみならずNeovim本体では提供していない部分もカバーしてくれる。このプラグインの存在は以前から知っていたものの、使いこなせる自信がいまいち持てず今まで放置していた。だが一度入れてしまえば案外なんとかなるもので、むしろ[lsp_lines](https://github.com/ErichDonGubler/lsp_lines.nvim)などの一部プラグインを統廃合することに成功した。設定例は以下の通り。
本稿のトリを務めるのはLSP関連の機能をリッチにせしめるプラグインだ。UIのみならずNeovim本体では提供していない部分もカバーしてくれる。このプラグインの存在は以前から知っていたものの、使いこなせる自信がいまいち持てず今まで放置していた。だが一度入れてしまえば案外なんとかなるもので、[lsp_lines](https://github.com/ErichDonGubler/lsp_lines.nvim)などの一部プラグインを統廃合することに成功した。設定例は以下の通り。
```lua
require("lspsaga").setup({
@ -230,8 +237,8 @@ vim.lsp.handlers["textDocument/publishDiagnostics"] =
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false })
```
もっとも、すべての機能をこれに割り振るのもかえって冗長なので一部はTelescopeに任せて機能の分散化を図っている。画面上の装飾もなるべく抑えて`lightbulb`や`winbar`は無効化している。総合的にはあまりうるさい画面にならず機能性の恩恵を受け取れる形に持ち込めたと思う。
もっとも、すべての制御をこれに割り当てるのもかえって冗長なので一部はTelescopeに任せて機能の分散化を図っている。装飾もなるべく抑えて`lightbulb`や`winbar`は無効化している。総合的にはあまりうるさい画面にならず賢くまとまったと思う。
## おわりに
やはりLSPやDAP関連の機能は重たいのか、当初は50msを切っていたNeovimの起動速度が100msを超えてしまった。それなりの遅延処理を施してもせいぜい80ms程度なので、よほど設定を煮詰めないかぎりRyzen 5600G程度のCPUパワーではきっとこの辺りが限界なのだろう。とはいえ、それでも本物のIDEと比べれば依然として高速な環境には違いない。いつの日か真にすべての開発作業がターミナルの内側で完結できることを願う。
やはりLSPやDAP関連の機能は重たいのか、当初は50msを切っていたNeovimの起動速度が100msを超えてしまった。遅延処理をぼちぼち施してもせいぜい80ms程度なので、よほど設定を煮詰めないかぎりRyzen 5600G程度のCPUパワーではきっとこの辺りが限界なのだろう。とはいえ、それでも本物のIDEと比べれば依然として高速な開発環境には違いない。いつの日か真にすべての開発作業がターミナルの内側で完結できることを願う。