neovimでLSP環境を最低限で設定する(Windowsでプラグイン1個のみ)
vim使って色々やっていこうと思うと、避けられない設定関係の一つがLSP関連。
補完もチェックもいろいろとやってくれるセットなんだけど、よく説明されている内容を確認しても大量のプラグインがそれぞれ勝手に動いて、自分でコントロールできてない感じがなじめない。
neovimにはLSPが内蔵しているのに、色々とプラグインいれるのが前提になっているのが、納得できず設定しても使えない状況が続いたため、最低限の設定でLSPが動くのを確認していくことを優先して設定を行うことにした。
1.プラグインの追加
nvim-lspconfig 一択
他のプラグインは今後使うかもしれないが、今回は自分が把握できるようにするため、これだけでLSP環境を構築する。
ちなみに、これを入れるのは、LSP関連のコマンドが使えるようにするためと、言語を追加する設定を楽にするためとLsp関連のコマンドが使えるようにするため。
(↑の内容は自分で納得できたみたい。)
追加方法は
.config内のプラグインを管理しているフォルダにファイルを追加
自分の場合は~/.config/nvim/lsp/pluginsフォルダにlsp.luaを作成
return{ 'neovim/nvim-lspconfig', config = function() local lspconfig = require('lspconfig') lspconfig.pyright.setup{} end, }
設定内容はこれだけ。内容を説明すると、
2行目:Lazyでインストールするプラグインの指定
4行目:lspconfigの呼び出し
5行目:LSPクライアントのpyrightの指定
2.LSPサーバー用のソフトをインストール
この作業はmason.nvimを使えば自動でやってくれる内容
中身を把握するために、自分でやってみる。
LSPを利用するために何が必要なのかは
nvim-lspconfig/doc/server_configurations.md at master · neovim/nvim-lspconfig · GitHub
に言語ごとに記載がある。
ちなみにnvmにおいて
:help lspconfig-all
でも読めるとのこと。
ここでPythonのLSPサーバを探すとPyの項目にいくつかある。今回は記事が多かったPyrightを使ってみる。(これで対応がなれたらRuffにもチャレンジしてみるつもり)
PyrightはPythonのモジュール以外にnodeのモジュールとして使えるものがあり、そちらを使うのが基本みたい。
参考にしたのは、lsp-configのページのquickstartの項目
GitHub - neovim/nvim-lspconfig: Quickstart configs for Nvim LSP
pyrightをインストールするために下記コマンドを実行するんだけど、windowsでnpmコマンドを実行するために
winget install OpenJS.NodeJS.LTS
を実行すればいい。 この後に
npm i -g pyright
とすることで、LSPから利用可能なpyrightがインストール。 pyrightを利用することは最初のlsp.luaの5行目ですでに書いているので、pythonファイルをneovimで編集するとLSPが実行される環境ができた。
どんな感じになるか、キャプチャ画面を貼り付けた。

モジュールを読み込まずに円の面積を求めようとして、インサートモードを抜けるとLSPによるチェックが行われるのが、確認できる
LSPが使えることは分かったので、次はLSPによる補完を試してみる
neovimでPython環境を構築する(Windows簡易版)
vimでPython環境の構築〇〇年版という記事をよく見かけるけど、やろうとする度に挫折してる。
そもそもPythonを学ぼうとする初学者に仮想環境は必要だろうか?
バージョンを切り替えてプログラムを書くことなんてあるか?
という訳で、自分用にPythonを使える簡単なNeovim環境の構築方法を記載しておく。
1.Pythonのインストール
一番簡単なのはMicrosoftStoreからのインストール

(Beta)の文字が入ってないので、番号が一番大きいのをインストールしておけばいい
コマンドだけでいくぞって人はWinget
いきなりinstallは使わずにsearchする

どれ?
探し方はStoreのときと同じ
インストールは
winget install Python.Python.3.12
IDに記載されている通りに入力しておけばOK
2.Neovimでの確認
インストールしたら、Neovimから使えるか確認
:checkhealth

Python側での作業
NeovimでPythonを使うにはPython側にモジュールをインストールしないといけない
ターミナルで
pip install neovim
を実行

再度checkhealthを実行すると

蛇足
より確実に行うために、Pythonの場所を指定してあげたほうがいい
vim.g.python3_host_prog = "C:\\Users\\homaj\\AppData\\Local\\Programs\\Python\\python312\\python.exe"
wingetでインストールした場合、ユーザーフォルダのAppDataの中に実行ファイルがあるので、探しにくい。
ファイルパスは\と2個つないで書くこと
うまくいったら赤線のようになる

3.Pythonの勉強用に必要なプラグインのインストール
LSPではないです。quickrun.vimがベスト。
でもNeoVimでLuaで作っているのでjaq-nvimを使います。
これは「Just Another Quickrun plugin for Neovim」でQuickrunをneovimで実行できるようにするもの
ユーザーフォルダの
.config/nvim/lua/pluginsにjaq.luaを作成
return{ "is0n/jaq-nvim", config = function() require("jaq-nvim").setup({ cmds = { internal = { lua = "luafile %", vim = "source %", }, external = { python = "python %", } }, }) end, }
これで環境ができあがり
Pythonで書いたファイルで
:Jaq
と実行するだけで、実行結果がわかる。

実行した際の注意事項
- 何も設定しなかったら、真ん中にフローティングウィンドウで表示
- 実行結果が表示された後に[Process exited 0]と表示されたらOK
- 画面を閉じるのは「:q」で
最初、Pythonを認識してない場合には9009のエラーが表示されてた
lazy.nvimへの移行(プラグインマネージャの変更)
NeoVimのライトな使い方しかしていなかったせいか、特にここ1年問題もなくフツーに使えてた。
でも、プラグインの管理に使っていたPacker.nvimのメンテナンス終了のアナウンス。
NOTICE: This repository is currently unmaintained. For the time being (as of August, 2023), it is recommended to use one of the following plugin managers instead:
じゃあ、ちょうどいいからプラグインの管理プラグインを変更して、プラグインも見直してみようかと。 Packerがお勧めしているのはこの二つ。
lazy.nvim: Most stable and maintained plugin manager for Nvim.
pckr.nvim: Spiritual successor of packer.nvim. Functional but not as stable as lazy.nvim.
じゃあ安定性を優先してlazy.nvimに。
ちなみに、色々やるならdpp.vimが面白いのは間違いないと思う。
github.com
インストールと初期設定
Packerを使っていたときには、
というやり方でやってた。
これがlazyになると、
と、管理が楽になった。
一番最初の.config/nvimの中身はこれだけ
─nvim
│ init.lua
│
└─lua
001_core.lua
002_keymap.lua
100_lazy.lua
init.luaはこれだけ
-- luaで作成 require('001_core') require('002_keymap') require('100_lazy')
001_coreと002_keymapの内容は
からあまり変わってない。
肝心の100_lazy.luaはこんな感じ
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", -- latest stable release lazypath, }) end vim.opt.rtp:prepend(lazypath) require('lazy').setup('plugins', opts)
これは最後の行以外は、プラグインの説明ページを貼り付けただけ。
ちなみに、最初のほうに書いているのは、決まったフォルダにlazy.nvimがあるかをチェックして
lazy.nvimがなかったらgit cloneコマンドでlazy.nvimをとってくるという内容
プラグインの保管場所は「vim.fn.stdpath("data") .. "/lazy/lazy.nvim"」ということ
これがどこかを調べたいならコマンドラインモードで
:lua print(vim.fn.stdpath("data"))
でチェックすることができる
100_lazy.luaの最後に記載した「plugins」がプラグインの設定ファイル名plugins.luaを使いますという意味になるみたい。
これをpluginsというフォルダにすることで、1プラグイン1ファイルで設定していくことが可能になる。
試しにカラースキームのKanagawaをインストールするとこんな感じ
└─nvim
│ init.lua
│
└─lua
│ 001_core.lua
│ 002_keymap.lua
│ 100_lazy.lua
│
└─plugins
kanagawa.lua
ちなみに配布元はこちら
このプラグインをインストールするときに「100_lazy.lua」にはなにも記載していない。
kanagawa.luaはこんな感じ
return{ 'rebelot/kanagawa.nvim', event = "VimEnter", config = function() vim.cmd.colorscheme "kanagawa" end, }
設定ファイルは「return{」で始まって「}」で終わる
最初にどこからダウンロードするか?githubだとこの書き方でOK
次はどのタイミングでプラグインを読み込むか?
lazy.nvimはプラグインを読み込むタイミングを遅らせることで、neovim本体の起動時間を早めることができる
今回はvimを開いたときなので「event="VimEnter"」になる。タイミングは色々あるので、配布元のページを確認したほうがいい。
最後にconfigの行で、プラグインを使ってなにをするのかやkeymapをここに書いていく。
書き方がいくつかあるみたいなので、統一した書き方ができるようにしておきたい。
この状態でNeovimを再起動したら、プラグインのインストール画面が最初に自動で起動する。
qキーでインストール画面が閉じられて、今回はKanagawaのカラースキームが設定されて表示された。
Neovimでのgit用プラグインneogit
gitは使って当たり前のこの状況で、vimでコード書いて、ターミナルでgitコマンドを実行というのは非常にもたつく。
なのでvim上でadd,commit,pushができると便利。
vimのプラグインもあればいろいろあるんですが、neovim用ということで、選んだのはこれ
いつものようにplugins.luaに
use{ 'TimUntersberger/neogit' }
を追記して、再起動、:PackerInsall 、:PackerCompileで再起動すればOK
(このプラグインはPlenary.nvimが必要だけど、Telescopeのときにインストールしてるから問題なし。 )
keymapの設定はしてないので
:Neogit
と入力して新しいタブが開く。このときgitで管理してないフォルダ(.gitがないフォルダ)で開いてもなにも表示されない。

1.Neogitの起動
例えば~/.config/nvim/lua/plugins.luaを編集して保存。そのフォルダーで
:Neogit
を実行すると、別タブでNeogitが起動する。

2.ファイルをstagedへ
ファイルに移動して「s」キーでstagedに移動する

3.ファイルをcommit
「c」キーでcommit。一回ヘルプ画面がでてくるけど、そこでも「c」キー入力でコミット画面に。何も設定してないので画面分割で表示。コメントを記載して「:wq」


4.ファイルをPush
最後に「P」(大文字のp)でPush
ここでも再度確認してくるので、内容を確認してpush。メッセージが何度かでて、ファイルがpushされる。

こうやってadd(stage)、commit、pushが全部vim上でできた。 この画面も:qで終了するだけ。
NeovimでのFuzzyFileFinder「Telescope」を使ってみる
vimでFuzzyFinderといったら国内ではShougoさんのUniteやDeniteから始まり今はdduが広まってきてます。
海外はCTRL-Pやfzfが有名ですが、Neovim環境というとTelescopeが有名な模様。
なんでTelescopeなのか?
この記事とか読んで、ほんとはddu使いたかったけど、職番環境でDeno使えなかったら。
Telescopeだとluaで書いているので、プラグイン2つ入れたら使える。
インストールはPackerで。 Pluginを管理しているplugins.luaに
use{ 'nvim-lua/plenary.nvim'} use{ 'nvim-telescope/telescope.nvim'}
を追加。再起動して、
:PackerInstall
:PackerCompile
するだけで終了。
再起動して
:Telescope find_files
と入力するだけで、すぐ動く。

ファイル名やpathの一部だけで探してくれるので快適。検索欄に日本語入力してもいけた。
終了するときはESCかCTRL+Cで終了。
ESCはこの画面のNormalモードのとき。最初は画面した側の入力欄でInsertモードになってるので、1回目のESCでNormalモードに。NormalモードでのESCで終了になる。
Telescopeではどんな内容を探すのかというのでPickerというのが準備されてる。
ファイル名だけでなく、いろいろあるので組み込みのを使ったり、増やしたりとほんと多機能。
最初は多いので、find_filesとbuffersとhelp_tagsだけ試してみてもいいんじゃないかと。
buffer切り替え用のbuffersはほんと便利。
キーマップを設定することでコマンドの入力も簡単に
-- これは記入済 vim.keymap.set('n', 's', '<NOP>',{noremap = true}) -- 今回追加分 vim.keymap.set('n', 'sf', '<cmd>lua require("telescope.builtin").find_files()<cr>',{noremap = true}) vim.keymap.set('n', 'sb', '<cmd>lua require("telescope.builtin").buffers()<cr>',{noremap = true}) vim.keymap.set('n', 'sh', '<cmd>lua require("telescope.builtin").help_tags()<cr>',{noremap = true})
こうすればNormalモードで
- s + f でファイル検索
- s + bでバッファ一覧
- s + hでヘルプ一覧
が表示される。これから機能追加していくけど、公式ページの説明見るだけでも面白そう。
Neovim起動時の表示を差し替えるAlpha-nvim プラグイン
起動したときの表示を変更したくなったのでプラグインを入れてみた。
Packerでインストールするために plugins.luaに追記
use{'goolord/alpha-nvim'}
再起動してコマンド実行
:PackerInstall
:PackerCompile
コンフィグファイルをlua\104-alpha.luaに記載して読み込むために init.luaに追記
require('104-alpha')
104-alpha.luaを作成して記載
local status_ok, alpha = pcall(require, "alpha") if not status_ok then return end require('alpha').setup(require'alpha.themes.dashboard'.config)
プラグインの有無を確認し dashboardテーマを読み込んで起動するようにしている。
サイトには説明がなかったが、
ここに説明や例があった。
プラグインをインストールしたら
:h alpha-example
:h alpha-configuration
でヘルプファイルを見れるとのこと。
細かい編集は行わずに、そのまま起動してみた。
活用したらいろいろとできそう。

luaでNeovimのコンフィグファイルを書くときのTip
少しずつプラグインが増えてきて、それに合わせて設定ファイルが増えてくる。 思ったのと違ったと思って、プラグインを削除しても、コンフィグファイルが残っているとエラーが表示される。 それを避けるためにコンフィグファイルの冒頭にプラグインが読み込まれているか確認したほうがいい。
この記事を読んでからずっと真似していて、
if empty(globpath(&rtp, 'autoload/lsp.vim')) finish endif
を使ってた。
これがluaになったときにどうしたらいいのかと悩んでたけど、
ここにちゃんと書いてたのに気づいてなかった。 モジュールの項目に
local ok, _ = pcall(require, 'module_with_error') if not ok then -- not loaded end
との例が。 ほかの人のコンフィグを見て、以下のように書いてる。
例えばlualineのプラグイン設定の場合
local status_ok, lualaine = pcall(require, "lualine") if not status_ok then return end
冒頭にこの内容を記載してから、プラグインごとの設定を書いて整理しやすい状態を作っていけそう。