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

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

VImで使用するChangelogメモ

日々の記録をつけることはとても重要ですが、業務日誌みたいなものまでいかず、とにかくメモを残しておきたいということで、常に使っているのがChangelogでのメモ。横着プログラミング 第1回: Unixのメモ技術のサイトで見たことがある人も多いかと思うけど、このメモをずっと続けてる。大事なのが続けることで、メモし忘れても今日はメモを始めて何日目か?天気は何か?だけはめもしてる。

このメモをvimを使って続けていて、あまりに基本的なんだけど、すぐ忘れてしまうので、ここに記載しておく。

基本はデフォルトで入っているftpluginのみを使用 keymapにLeaderの設定を忘れずに 本来は複数人がいろんな場所から記録するメモだけど、一人だけ同じ場所でやってるのでユーザー名はシンプルに

参考にするのはvim-jp » Hack #28: changelogを記述する

普通のvimscriptだと

  let g:changelog_timeformat = "%Y-%m-%d"
  let g:changelog_username = "homaji"

今はNeovimのためにluaにしているので

vim.g.changelog_timeformat = "%Y-%m-%d"
vim.g.changelog_username = "homaji"

keymap設定で、<Leader>は半角スペースに設定 [第3回] Neovimのすゝめ – キーマップを作成する │ wonwon eaterここを参考にしたけど、ではなく半角スペースってのがよかった。
Space and Shift なんてマニアックなものを使ってるとただのSpaceがうまく認識しないことも多いけど、" "を認識ということであれば問題ない。 というわけでkeymapの設定に追加

vim.g.mapleader = ' '

ここまでやれば<Leader>+ o でエントリーを追加できる。

Changelogを使用するときに注意することは

ここまでやっておけば、快適なメモ生活ができるのであとは毎日蓄積していくことがとにかく大事。

Neovimのステータスラインとウィンドウの切り替え

vimの設定をするときによく使うlaststatus。
何も考えずにlaststatus=2とやってたけど、この機能が変更されてるとは知らなかった。

laststatus = 0 → ステータスライン非表示 laststatus = 1 → 画面分割をして2個以上あるときに表示1個なら非表示 laststatus = 2 → ステータスラインを常に表示

Neovimの新しい機能が laststatus = 3 → 常に最下部に表示しているウィンドウのステータス情報を表示

基本設定になるので、lua/001_core.luaに 設定を追記

vim.opt.laststatus = 3

この機能はカッコイイんだけど、ウィンドウが増えると、いまどのウィンドウにいるかわからなくなるので、それ用のプラグイン入れることにした。

github.com

プラグインを管理しているlua/plugins.lua

    use{'tkmpypy/chowcho.nvim'}

を追記。

init.lua 追記

require('102-chowcho')

lua/102-chowcho.lua を作成

require('chowcho').run()

:PackerInstall
:PackerCompile
をしてOK

:Chowcho とコマンドを入力したら画面の番号が表示

Chowcho

そのまま番号を入力したら、選択してウィンドウに移動。