neovimでLSP環境を最低限で設定する(Windowsでプラグイン1個のみ)

vim使って色々やっていこうと思うと、避けられない設定関係の一つがLSP関連。
補完もチェックもいろいろとやってくれるセットなんだけど、よく説明されている内容を確認しても大量のプラグインがそれぞれ勝手に動いて、自分でコントロールできてない感じがなじめない。 neovimにはLSPが内蔵しているのに、色々とプラグインいれるのが前提になっているのが、納得できず設定しても使えない状況が続いたため、最低限の設定でLSPが動くのを確認していくことを優先して設定を行うことにした。

1.プラグインの追加

nvim-lspconfig 一択
他のプラグインは今後使うかもしれないが、今回は自分が把握できるようにするため、これだけでLSP環境を構築する。

ちなみに、これを入れるのは、LSP関連のコマンドが使えるようにするためと、言語を追加する設定を楽にするためとLsp関連のコマンドが使えるようにするため。
(↑の内容は自分で納得できたみたい。)

github.com

追加方法は .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が使えることは分かったので、次はLSPによる補完を試してみる

neovimでPython環境を構築する(Windows簡易版)

vimPython環境の構築〇〇年版という記事をよく見かけるけど、やろうとする度に挫折してる。
そもそもPythonを学ぼうとする初学者に仮想環境は必要だろうか?
バージョンを切り替えてプログラムを書くことなんてあるか?

という訳で、自分用にPythonを使える簡単なNeovim環境の構築方法を記載しておく。

1.Pythonのインストール

一番簡単なのはMicrosoftStoreからのインストール

MicrostoreでPythonを検索
どれ?

(Beta)の文字が入ってないので、番号が一番大きいのをインストールしておけばいい

コマンドだけでいくぞって人はWinget

いきなりinstallは使わずにsearchする

wingetでPython3を検索

どれ?

探し方はStoreのときと同じ
インストールは

winget install Python.Python.3.12  

IDに記載されている通りに入力しておけばOK

2.Neovimでの確認

インストールしたら、Neovimから使えるか確認
:checkhealth

Python3が見つからなくてエラー

Python側での作業

NeovimでPythonを使うにはPython側にモジュールをインストールしないといけない
ターミナルで

pip install neovim  

を実行

pip install neovimの実行
これでneovim以外に必要なモジュールも一緒にインストールされる
再度checkhealthを実行すると
checkhealthでPython認識した場合

蛇足

より確実に行うために、Pythonの場所を指定してあげたほうがいい

vim.g.python3_host_prog = "C:\\Users\\homaj\\AppData\\Local\\Programs\\Python\\python312\\python.exe"

wingetでインストールした場合、ユーザーフォルダのAppDataの中に実行ファイルがあるので、探しにくい。
ファイルパスは\と2個つないで書くこと
うまくいったら赤線のようになる

python3_host_progの設定がきちんとなった場合

3.Pythonの勉強用に必要なプラグインのインストール

LSPではないです。quickrun.vimがベスト。
でもNeoVimでLuaで作っているのでjaq-nvimを使います。
これは「Just Another Quickrun plugin for Neovim」でQuickrunをneovimで実行できるようにするもの  

github.com

ユーザーフォルダの
.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
と実行するだけで、実行結果がわかる。 20240704232149

実行した際の注意事項

  • 何も設定しなかったら、真ん中にフローティングウィンドウで表示
  • 実行結果が表示された後に[Process exited 0]と表示されたらOK
  • 画面を閉じるのは「:q」で

最初、Pythonを認識してない場合には9009のエラーが表示されてた

lazy.nvimへの移行(プラグインマネージャの変更)

NeoVimのライトな使い方しかしていなかったせいか、特にここ1年問題もなくフツーに使えてた。

でも、プラグインの管理に使っていたPacker.nvimのメンテナンス終了のアナウンス。

github.com

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を使っていたときには、

  1. Packer自身のインストール
  2. どのプラグインをインストールするか、プラグイン一覧に記載
  3. プラグイン毎にファイルを作成

というやり方でやってた。

これがlazyになると、

  1. lazy.nvim のインストール(Packerより簡単。設定ファイルへの記載内容も少ない)
  2. プラグイン毎にファイルを作成したら、プラグインのインストールも最初に行ってくれる。

と、管理が楽になった。

一番最初の.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の内容は

init.lua を作る - たまにはvim

からあまり変わってない。

肝心の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

ちなみに配布元はこちら

github.com

このプラグインをインストールするときに「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用ということで、選んだのはこれ

github.com

いつものようにplugins.lua

   use{ 'TimUntersberger/neogit' }

を追記して、再起動、:PackerInsall 、:PackerCompileで再起動すればOK
(このプラグインはPlenary.nvimが必要だけど、Telescopeのときにインストールしてるから問題なし。 )

keymapの設定はしてないので :Neogit
と入力して新しいタブが開く。このときgitで管理してないフォルダ(.gitがないフォルダ)で開いてもなにも表示されない。

.gitがないところで開いても意味ない

1.Neogitの起動

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

Unstageにファイルがあるのがわかる
この状態だとUnstagedにplugins.luaが表示される。

2.ファイルをstagedへ

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

ファイル1つだけなので、わかりにくいけど、unstaged→stagedに移動してる

3.ファイルをcommit

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

コメントを何も記入してないコミット画面
保存して終了しようとするとcommitする?と確認してくるので、yをおすとstagedがunmergedに
Unmergedが表示されてる

4.ファイルをPush

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

Push後。

こうやってadd(stage)、commit、pushが全部vim上でできた。 この画面も:qで終了するだけ。

NeovimでのFuzzyFileFinder「Telescope」を使ってみる

vimでFuzzyFinderといったら国内ではShougoさんのUniteやDeniteから始まり今はdduが広まってきてます。
海外はCTRL-Pやfzfが有名ですが、Neovim環境というとTelescopeが有名な模様。

github.com

なんでTelescopeなのか?

zenn.dev

この記事とか読んで、ほんとはddu使いたかったけど、職番環境でDeno使えなかったら。
Telescopeだとluaで書いているので、プラグイン2つ入れたら使える。

インストールはPackerで。 Pluginを管理しているplugins.lua

   use{ 'nvim-lua/plenary.nvim'}
   use{ 'nvim-telescope/telescope.nvim'}

を追加。再起動して、 :PackerInstall
:PackerCompile
するだけで終了。

再起動して :Telescope find_files
と入力するだけで、すぐ動く。

Telescop起動したところ

ファイル名や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 プラグイン

 起動したときの表示を変更したくなったのでプラグインを入れてみた。

github.com

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テーマを読み込んで起動するようにしている。

サイトには説明がなかったが、

www.reddit.com

ここに説明や例があった。 プラグインをインストールしたら
:h alpha-example
:h alpha-configuration
でヘルプファイルを見れるとのこと。

細かい編集は行わずに、そのまま起動してみた。
活用したらいろいろとできそう。

起動時の画面

luaでNeovimのコンフィグファイルを書くときのTip

少しずつプラグインが増えてきて、それに合わせて設定ファイルが増えてくる。 思ったのと違ったと思って、プラグインを削除しても、コンフィグファイルが残っているとエラーが表示される。 それを避けるためにコンフィグファイルの冒頭にプラグインが読み込まれているか確認したほうがいい。

vimrc の分割管理を上手くやる 2020年版

この記事を読んでからずっと真似していて、

if empty(globpath(&rtp, 'autoload/lsp.vim'))
  finish
endif

を使ってた。

これがluaになったときにどうしたらいいのかと悩んでたけど、

github.com

ここにちゃんと書いてたのに気づいてなかった。 モジュールの項目に

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

冒頭にこの内容を記載してから、プラグインごとの設定を書いて整理しやすい状態を作っていけそう。