nvim-kickstartで2023年のモダンなNeovim開発環境を手軽に作る

大丈夫、1分で環境構築できるから

ごあいさつ

公私ともに非常にバタバタした。いやー、本当に忙しかった!更新してなかった間にも色々気になった商品や本などがあるのでいずれ書き記していきたい。

今回は気になっていたものの一つ、Neovimの開発環境をサクッと作るnvim-kickstartレポジトリを試す。レポジトリのメンテナ、youtubeの解説者はNeovimデベロッパーのTJ DeVries。

Neovimとnvim-kickstart

Neovimはコンソール上で動作するウルトラ軽量なテキストエディタ。かつてはEmacsとVimとの間でテキストエディタ戦争があったらしいが、Visual Studio Codeが登場したことにより多くの人はVSCodeへ移行し、戦争は終結した。

しかしVSCodeを使わないとチームでハブられる昨今でも、マウスやカーソルキーを使うこと無くスピーディーなテキスト編集が可能なVimエディタは根強い人気があり、コアなユーザーを中心にVimは使われ続けている。

NeovimはVimからフォークしたプロジェクトであり、VimのほとんどをLuaというプログラミング言語で書き換えたものである。独自のVimscript言語によりカスタマイズ・プラグイン開発をするVimは年々ガラパゴス化しているとの批判があるのに対して、現代的なプログラミング言語のLuaでエディタを自由自在にカスタマイズできるNeovimは柔軟かつスピーディーな開発体制もあって年々人気が高まっている。

2022年のStack Overflowにおけるアンケート調査ではNeovimが「最もユーザーに愛されているエディタ」になったことも話題になっていた。

Neovimの最大の特長はユーザーの好みに合わせていくらでもカスタマイズできる点であり、Lua言語で設定ファイルを作るのはさながら波平が盆栽を手入れするかのよう。コーディングを効率化するためにテキストエディタの設定にこだわり休日が溶ける、なんてことはザラである。

「テキストエディタなんぞに時間をかけるなんて本末転倒じゃないか」と思う人も少なくないが、nvim-kickstartはそんな人のためにあるのかもしれない。このレポジトリではNeovimにLanguage Server Protocol(LSP)やカラースキームなどの小難しい設定がほとんど完了した状態の設定ファイルが配布されている。

今回はこのレポジトリを使ってサクッとNeovimを導入しつつ、nvim-kickstartのデフォルト設定を眺めていく。

こんな感じの完成形になった

nvim-kickstartのクローンして一瞬で環境構築

nvimはインストール済みの前提で進める。 もしインストールしてなかったらGitHubからnightlyをインストールして好きなところに展開するも良いし、bobを入れておけばnightlyのアップデートが楽になるのでよりおすすめ。

動画では「init.luaをコピペするだけで良い」と言っているが、現在ではinit.lua以外のファイルもあるのでクローンしてしまった方が良い。

.config/nvimがNeovim設定ファイル置き場なので、そこにクローンする。

1
2
3
cd ~/.config

git clone git@github.com:nvim-lua/kickstart.nvim.git nvim

クローンが終わったらnvimコマンドでNeovimを立ち上げる。すると早速パッケージマネージャのlazy.nvimとLSP関連のプラグインがDLされる。以上で終わり。

今までNeovimの設定ファイルを何度も自分で書き直してきたが、LDP関連のところが本当に躓きやすい。 このレポジトリはクローンしたら立ち所にLSPが使えるようになるので、本当に初心者には良い。

kickstartの中身を理解する

kickstartのコンセプトはkickstartの中身を理解してから自分なりにアレンジしてね、ということなので頑張って中身を理解していきたい。

まずはどういう設定の仕方をしているのかと、デフォルトのキーマップなどから理解しようと思う。

lazy.nvimについて

Neovimの醍醐味はプラグインを使って機能を拡張していくことだ。

以前はpacker.nvimというプラグインマネージャーがスタンダードだったが、packer.nvimは6年の歴史があり「そろそろ新しいのが出てきても良いんじゃ無いか」という雰囲気だった。そこに登場したのがlazy.nvimで、これがpackerのインターフェースはそのままに、かゆいところに手が届くもんだから一気に乗り換えが進んでいる。

…ということは知ってたが、lazy.nvimは今回初めて使う。

基本的な書き方は以下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require("lazy").setup(
  {
  'nvim-neo-tree/neo-tree.nvim',
  branch = 'v2.x',
  config = function ()
    require('neo-tree').setup({
    close_if_last_window = true,
    window = {
      width = 30,
    } }
  }
) 

packer.nvimとほとんど同じ使い方だが、微妙に引き数名が違う。移行ガイドが参考になる。

name packer.nvimでの名称 使いどころ
init setup インストール時に実行するコマンド
dependencies requires 依存プラグイン
version tag バージョン指定
keys keybindings 使い方が違う。

keysが特に使いやすい。ここでkey-bindingsを指定しておけば、nnoremapしなくてもよい。 nvim-kickstartではwhich-keyが最初から入っているので、キーマップはキーから始まるものに設定し、descにもわかりやすい説明文を書いておくと良い。 勝手にwhich-keyに反映されてくれる。

1
2
3
4
5
6
7
8
  {
    'iamcco/markdown-preview.nvim',
    run = function() vim.fn['mkdp#util#install']() end,
    event = "BufRead",
    keys = {
      {"<leader>mp", "<Plug>MarkdownPreview", desc = "Markdown Preview"}
    },
  },

Telescopeを使ってNeovimを縦横無尽

Telescopeが起動したときの画面 ここではgrepモードを起動している

動画では「キーマップが分からなくなったら:Telescope keymapsで確認できるぜ!」と言われている。これにより確認できるが、癖の無い、使いやすいキーマップをあらかじめセットしてくれている。

TelescopeはNeovimにしかないプラグインで、fzfというファジーファインダーと組み合わせることで高速な検索が実現される。検索するのはファイル中の文字、ファイル名、関数名、とにかくなんでもあり。これもセットアップするにはTelescopeのドキュメントを読む必要があったのだが、kickstartでは環境構築済みである。なんとすばらしい。

init.luaを覗くと以下のキーマップが登録されていた。

keymap 機能
<leader><space> 現在開いているバッファを探す
<leader>? 最近開いたファイルを探す
<leader>/ 現在のファイルでfuzzy search
<leader>sf 現在のディレクトリでファイルを探す([S]earch [F]ile)
<leader>sh ヘルプを探す([S]earch [H]elp)
<leader>sw 現在カーソルのあっている単語を探す([S]earch [W]ord)
<leader>sg フリーワード検索([S]earch [G]rep)
<leader>sd Diagnosticsを検索([S]earch [D]iagnostics)

なお<leader>キーはspaceキーに設定されている

Telescopeを使った拡張はまだまだこんなもんじゃない(はず)なので、良い使い方を見つけたらカスタムしていきたい。

treesitter

treesitterは構文解析のプラグインである。「所詮シンタックスハイライトだけだろ?」と思っていたが、kickstartでは実に色々な活用がされていて目から鱗だった。treesitterでできるとは知らずにわざわざ別のプラグインを使ってた節もあったので、treesitterはきちんと勉強しようと思う。

keymap 機能
<c-space> 選択範囲を広げる
<c-s> スコープを広げる
<M-space> 選択範囲を狭める
]m 次の関数
]m 次の関数
]] 次のclass
]M 次の関数(outer)
[[ 前のclass(outer)
[] 前のclass
[M 前の関数(outer)
[[ 前のclass(outer)

以下はcdなどの後に使うサブコマンド。

サブコマンド 機能
aa Around parameter
ia Inner parameter
af Around function
if Inner parameter
ac Around class
ic Inner class

クラスや関数は言語によって扱いやすさが違うと思う。少なくともpythonを書いている間、ビジュアルモードでクラス全体を選択したいケースはあまり発生しない。

LSP

Language server protocol(LSP)は補完機能のあれ。Neovimをカスタムしまくってる人の画面を見ると良い感じのLSPが動いてたりするが、kickstartのLSPは必要最低限といった感じ。

ぶっちゃけNeovimでゴリゴリのコーディングをするつもりは最初から無く、VSCode Neovimを使ってVSCode用にNeovimを最適化することが目標なので、LSPまわりをカスタムする気は現状あまりない。

以下のキーマップが入っていた。

keymap 機能
<leader>rn カーソルの変数・関数名をリネーム
<leader>ca コードアクション(インポートを並び替えたりなど。LSPサーバーによる。)
gd Go to definition
gr Go to reference(Telescopeで立ち上がる)
gI Go to Implementation
<leader>D Type Definition(pythonならクラスの定義に飛ぶ)
<leader>ds Document中のsymbolを全て表示(Telescopeで立ち上がる)
K 関数などのドキュメンテーションをホバーで表示
<c-k> ↑とほぼ同じ
gD Go to decleration
<C-d> サジェストを下へスクロール
<C-f> サジェストを上へスクロール
<C-Space> サジェストを受け入れて補完する
<Tab> 次の候補へ
<S-Tab> 前の候補へ
keymap 機能
<leader>wa ワークスペースにフォルダを作成([W]orkspace [A]dd Folder)
<leader>wr ワークスペースのフォルダを削除([W]orkspace [R]emove Folder)
<leader>wl ワークスペースのフォルダフルパスを表示

まとめ

今回はnvim-kickstartを導入してみて、モダンなNeovim設定に触れてみた。

Lazy.nvimの細かい使い方など、隅々までドキュメンテーション読まないと最新の書き方に追いつけないような部分もしっかり実装されているので、非常にためになった。 確か2022年暮れ~2023年明けくらいにこのレポジトリが発足したと思うが、継続的にコードはメンテナンスされているのでgit pullすれば常に最新情報に触れられるかもしれない。

次回以降はkickstartをカスタムした内容をまとめる予定。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。