dotfilesをいじるついでに触るNeovim 0.11とNushell
はじめに
こんにちは、yank.nvimです。みなさんdotfiles作ってますか。ぼくは最近全然整備してませんでした。
久しぶりにArch Linuxをしたくなったので準備としてdotfilesを整理しました。そのついでに0.11になって最近色々と強化されたNeovimのLSP機能と、触ってみたかったNushellを触ってみたので、メモとしてもここに残しておきます。
この記事は、dotfilesやNeovim環境の作りかたを説明するというよりは、上記2つについての説明をするものとなるのでご了承ください。
環境
- Machine: MacBook Air (M4)
- Terminal: kitty
- Neovim
- Package Manager: lazy.nvim
Neovim 0.11
まずはNeovimからです。0.11でLSPに大幅な変化があり、ビルトイン機能だけでLSPのセットアップと自動補完までやってしまうことができるようになりました。
これまでLSPのセットアップを担っていたnvim-lspconfigはLSPの設定をまとめたものになりました。
早速設定を見ていきましょう。最初にnvim-lspconfigを導入します。
return {
"neovim/nvim-lspconfig",
lazy = false,
}
これだけです。あらすっきり。
設定とセットアップは別のファイルにまとめました。
vim.lsp.enable("rust_analyzer")
vim.lsp.enable("denols")
たったこれだけで、nvim-lspconfigのデフォルトの設定でrust-analyzerとDenoのLSPをセットアップできるのです。とてもシンプルでわかりやすいですね。
また、LuaのLSPについてはNeovim向けの設定が公式から公開されており、これに従えばNeovimの設定でもLSPが使えます。
さらに、0.11ではデフォルトで自動補完ができるようになりました。設定に関しては:h lsp-attachを参考にするといいでしょう。
vim.cmd[[set completeopt+=menuone,noselect,popup,fuzzy]]
vim.api.nvim_create_autocmd("LspAttach", {
desc = "enable completion",
callback = function(ev)
local client = assert(vim.lsp.get_client_by_id(ev.data.client_id))
local bufnr = ev.buf
local chars = {}; for i = 32, 126 do table.insert(chars, string.char(i)) end
client.server_capabilities.completionProvider.triggerCharacters = chars
vim.lsp.completion.enable(true, client.id, bufnr, {
autotrigger = true,
})
end
})
こうすることにより、自動補完が効くようになります。Ctrl-p、Ctrl-nで選択しCtrl-yを押して確定です。

Rustでの自動補完の例
Nushell
次はNushellです。 NushellとはRustで開発されたモダンなシェルで、詳細な説明は他の記事に任せますが、
- JSON、YAML、TOMLなどのパースが可能
- 型システム
- データ構造
- 分かりやすいエラー
- 強力なパイプライン機能
など、非常に強力かつ魅力的な機能を持っています。POSIX非互換なので、そこは注意です。
触ってみる
とりあえずやってみましょう。Homebrewで導入できます。
$ brew install nushell
ターミナルなどのシェルに設定してもいいですし、nuコマンドで起動もできます。
Nushellのすごいところは、lsをするだけで感じることができます。

Nushellでは様々なコマンドが独自のビルトインのものに置き換えられており、このようにlsコマンドも構造化されたデータを出力します。
他にもJSONを開くときれいにフォーマットされて出力されたりします。catで出力する分には普通なのですが、openを使うといい感じになります。

さらに出力をパイプラインで加工でき、
$ ls | where size > 500Mb | sort-by size
とすれば、カレントディレクトリの中の500MBより大きいファイルをサイズでソートするといった具合に、複雑な処理を記述できます。楽しいです。

キーバインドを作る
これを応用して、自作のキーバインドを作ってみました。先に設定を貼ります。設定をする際は、$HOME/.config/nushell/config.nuに書きます。
$env.config.keybindings ++= [{
name: history_find
modifier: control
keycode: char_p
mode: [emacs, vi_normal, vi_insert]
event: [
{
send: executehostcommand,
cmd: "commandline edit -r (history | get command | str join (char newline) | fzf)"
}
]
}]
これでCtrl-pを押すと、コマンドの履歴をファジーファインダーで選択できます。
詳細な設定は省きますが、ここでは重要な履歴を加工し、ファジーファインダーに入力するというコマンドを解説します。
history | get command | str join (char newline) | fzf
まずhistoryコマンドですが、これは履歴を返すもので、テーブルを返します。テーブルとは行と列を持つデータ構造で、先ほどのlsも返すものです。
ファジーファインダーであるfzfは標準入力から複数行の文字列を受け取るため、このテーブルを変換する必要があります。
このテーブルにはcommandとindexの列があり、このまま文字列にしてしまうとindexが混ざってしまいます。そこで、get commandを用いてテーブルからcommandの列だけを抜き取ったリストを作ります。その後は、リストを改行を挟みながら合成して1つの文字列にするために、str join (char newline)を使っています。
このようにパイプラインを使ってデータを加工することによって、さまざまなことができます。
おわりに
Neovim 0.11のLSP機能は、これまでより非常に使いやすくなっていてNeovimを使う理由がまた1つ増えたと感じました。Nushellに関してはまだまだ勉強不足ですが、いろいろやってみてとても可能性を感じたためもっと触っていきたいです。
自分のdotfiles
今回作ったdotfilesを貼っておきます。後日さまざまなものを追加する予定なのでそのときはまた記事を書きます。
Discussion