はじめに
LunarVimって何?
Neovim向けのIDEレイヤです。
非常に高速で拡張性に優れていて、Treesitter
やNativeLSP
に標準対応しています。
また、既存のNeovim設定と併用することができます。(←ここ重要)
-
作者さんのDiscordサーバー
https://discord.gg/Xb9B4Ny
インストール
注意: v0.5以降のNeovimが必要です。
packer.nvim
luaで書かれたNeovim向けのプラグイン管理プラグインです。
コレがないとLunarVimのインストール中にエラーがでます。
git clone --depth 1 https://github.com/wbthomason/packer.nvim\
~/.local/share/nvim/site/pack/packer/start/packer.nvim
Nerd Fonts
ここからダウンロードできます。
諸々のアイコンを表示するために必要です。
詳しい使い方はggってください。
LunarVim
LunarVimは現在開発段階です。
StableでもRollingでもバグはあるので、修正が早いRollingをおすすめします。
また、上で述べたように既存のnvim設定とは衝突しないため、~/.config/nvim/
等はそのままで問題ありません。
- Rolling
LV_BRANCH=rolling bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/rolling/utils/installer/install.sh)
- Stable
bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh)
途中でNode.js, Python, Rustの依存関係をインストールするか尋ねられます。
それぞれTreesitterやpynvim、ripgrep等を使う際に必要になりますので、基本的にはすべてyes
を選択してください。
インストールが正常に終了したら、LunarVimが使えるようになっているはずです。
コマンドラインにて、lvim
で LunarVim、 nvim
で既存のNeovimが起動することを確認してください。
lvim #LunarVimを起動
nvim #Neovimを既存の設定で起動
もしlvim
を実行しても冒頭のようなメニュー画面が表示されず、初期状態のNeovimが起動するようでしたら、その状態で
:PackerInstall
を実行し、パッケージのインストールが終了したらlvimを再起動してください。
実際に使ってみる
とりあえず
設定ファイルを開いてみましょう。
メニュー画面の下の方にあるConfiguration
にカーソルを持っていき、Enterで選択します。
すると~/.config/lvim/config.lua
が開き、その際に自動でLuaのLSPがインストールされます。
実際にLSPが動いていることを確かめてみましょう。
試しに""
の片方を削除してみると...
ちゃんとエラーメッセージが表示されます。
補完も効きます。
各言語のTreesitterは
:TSInstall <TAB>
LSPは
:LspInstall <TAB>
でインストールできます。
Treesitter
の対応言語はこちら、
NativeLSP
の対応言語はこちらを参照してください。
言語の名前とLSPの名前が異る場合がありますので注意してください。
例えば、RubyのLSPがsolargraph
だったり、scalaがmetals
だったりします。
そこらへんは対応言語と一緒に確認してください。
設定ファイルをいじってみる
基本的には普通のNeovim設定をLuaで書くときと同じです。
:w
すると自動で:so %
されます。
また、lvimは独自の関数を提供しています。
例えばプラグインをインストールする際に、
lvim.plugins = {
{"folke/tokyonight.nvim"},
{
"folke/trouble.nvim",
cmd = "TroubleToggle",
},
}
のような書き方ができます。
この記事では詳細な設定には踏み入りませんので、適宜公式ドキュメント等を参考にしてください。
各言語向けの設定例
C/C++
- Treesitter
:TSInstall c
:TSInstall cpp
- LSP
:LspInstall clangd
- フォーマッタ
clangd
はデフォルトでclang_format
を提供していますが、他にもuncrustify
等を使うこともできます。
local formatters = require "lvim.lsp.null-ls.formatters"
formatters.setup { { exe = "uncrustify", args = {} } }
その際、フォーマッタは自前でインストールする必要があります。
- LSPカスタマイズ例
local clangd_flags = {
"--all-scopes-completion",
"--suggest-missing-includes",
"--background-index",
"--pch-storage=disk",
"--cross-file-rename",
"--log=info",
"--completion-style=detailed",
"--enable-config", -- clangd 11+ supports reading from .clangd configuration file
"--clang-tidy",
-- "--clang-tidy-checks=-*,llvm-*,clang-analyzer-*,modernize-*,-modernize-use-trailing-return-type",
-- "--fallback-style=Google",
-- "--header-insertion=never",
-- "--query-driver=<list-of-white-listed-complers>"
}
local clangd_bin = "clangd"
local custom_on_attach = function(client, bufnr)
require("lvim.lsp").common_on_attach(client, bufnr)
local opts = { noremap = true, silent = true }
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>lh", "<Cmd>ClangdSwitchSourceHeader<CR>", opts)
end
local opts = {
cmd = { clangd_bin, unpack(clangd_flags) },
on_attach = custom_on_attach,
}
require("lvim.lsp.manager").setup("clangd", opts)
- デバッガ
:DIInstall ccppr_vsc
pretty-printing
を有効にするには、以下のように設定します。
local dap_install = require "dap-install"
dap_install.config("ccppr_vsc", {
adapters = {
type = "executable",
},
configurations = {
{
type = "cpptools",
request = "launch",
name = "Launch with pretty-print",
program = function()
return vim.fn.input('Path to exe: ', vim.fn.getcwd() .. '/', 'file')
end,
cwd = "${workspaceFolder}",
stopOnEntry = true,
setupCommands = {
{
description = "Enable pretty-printing",
text = "-enable-pretty-printing",
}
}
},
}
})
Python
- Treesitter
:TSInstall python
- サポートされているLSP、フォーマッタ、リンタ
python = { "jedi_language_server", "pylsp", "pyright" }
python = { "autopep8", "black", "isort", "reorder-python-imports", "yapf" }
python = { "flake8", "pylint" }
- LSP設定
:NlspConfig pyright
- デバッガ
:DIInstall python
local dap_install = require "dap-install"
dap_install.config("python", {})
Rust
- Treesitter
:TSInstall rust
- サポートされているLSP、フォーマッタ
rust = { "rust_analyzer" }
rust = { "rustfmt" }
- LSP設定
:NlspConfig rust_analyzer
- デバッガ
:DIInstall codelldb
local dap_install = require "dap-install"
dap_install.config("codelldb", {})
- 必要に応じて
lvim.lsp.override = { "rust" }
lvim.plugins = {
{
"simrat39/rust-tools.nvim",
config = function()
require("rust-tools").setup({
tools = {
autoSetHints = true,
hover_with_actions = true,
runnables = {
use_telescope = true,
},
},
server = {
cmd = { vim.fn.stdpath "data" .. "/lsp_servers/rust/rust-analyzer" },
on_attach = require("lvim.lsp").common_on_attach,
on_init = require("lvim.lsp").common_on_init,
},
})
end,
ft = { "rust", "rs" },
},
}
Go
- Treesitter
:TSInstall go
- サポートされているLSP、フォーマッタ
go = { "gopls" }
go = { "gofmt", "gofumpt", "goimports", "golines" }
- LSP設定
:NlspConfig gopls
- デバッガ
:DIInstall go_delve
local dap_install = require "dap-install"
dap_install.config("go_delve", {})
その他
細かい設定はこちらを参照してください。
補足
アップデート
内部からコマンドでアップデートすることができます。
:LvimUpdate
アンインストール
スクリプトで自動でやってくれます。
LunarVim関連は設定ファイルを含めてすべて消えますのでご注意ください。
bash ~/.local/share/lunarvim/lvim/utils/installer/uninstall.sh
あとがき
ここまで読んでいただきありがとうございます。
現状LunarVimに関する日本語で書かれた情報が殆どなかったため、拙い文章ではありますがこのような記事を書かせていただきました。
もし需要があれば、より詳しい設定方法等を説明した続編も書こうと考えております。
興味がある方はぜひコメントをお寄せください。