🌕

Neovimメモ 2023年1月26日

2023/01/27に公開
1

この記事を読んでも

  • Neovimが画期的に使いやすくなる
  • 新しいプラグインを導入できる

はないです。

明記しない限り、nightly (v0.9.0-dev)は、
2023年1月26日のnightly(v0.9.0-dev-810+gb8288df99)のことです。

コミュニティ

Neovim Conf 2022のアーカイブ

Neovim Conf開催したときの開発環境

全体

  • Day1
  • Day2
    • Youtubeは公式のアーカイブを見つけることができませんでした
    • Twitchは途中で放送が切れたせいか、2つに分かれていました
      Part 1
      Part 2

プレゼン

プレゼンのプレイリスト

発表者のプロフィールは
Neovim Confの公式サイトを参考してください。

発表内容などのタイムテーブル

Neovimのニュースレター "This Week in Neovim" がなくなるかもしれない

"This Week in Neovim"(以後、TWiN)は、1週間の

  • Neovim Coreの変更内容
  • 新規プラグイン
  • 既存プラグインのアップデート内容

などを日本時間だと毎週月曜日の夕方あたりに投稿しています。

TWiNを立ち上げたphaazon(Dimitri Sabadie)は

ブログ記事で書きました。

プラグイン作者がTWiNへ投稿して、その投稿を組み合わせてTWiNにする。
これがphaazonの理想のように私は印象を持ちました。

コミュニティが協力して、TWiNを作成し、TWiNをコミュニティのものにしたいんだと感じました。
TWiNをコミュニティのものにして、コミュニティ主導で管理して、phaazonがいなくてもTWiNを運用するのが目標なんだと思います。
phaazonの個人ブログではなく、Zennのように複数の人が投稿するものにTWiNをしたかったんだと思います。

現状のphaazon一人が頑張って殆ど作成するのは、phaazonの理想とはかけ離れています。
TWiNを公開し、続けていけば、読んだ人が投稿してくれると考えていたようです。
しかし、投稿してくれる人は少なかったようです。

投稿しやすいように大きなリファクタリングをして、Redditに投稿しても、TWiNへの投稿は増えなかったようです。
このRedditの投稿でphaazonは
"プラグイン作者がTWiNを考え、自分たちのニュースを自分たちで提供するようにしたかった" の様なことをコメントしています。

TWiNへの投稿方法はREADMEに記載しています。

記事への反応

この記事への反応は大いにありました。
TWiNのことだけではなく、次の2点についても書いているからだと思います。

Redditのスレッド

この記事への反応の効果で、行き詰まっていた、NeovimのコアチームとのTWiNプロジェクトの話し合いが、 良い方向へ進めばいいと願っています。

私もブログ記事を読みましたが、多分1番多くのNeovimプラグインを見てきた人が考えているNeovimのプラグインの問題点は面白く、考えさせられました。

mind.nvim と hop.nvim の今後について

ブログ記事では、phaazonが開発している次の2つのプラグインの開発方針についても書いています。

  • mind.nvim
    メモやタスク、考えを整理しやすくするプラグイン
    (使ってないので合っているのか分かりません)
    Neovimのプラグインではなくして、Neovim以外のエディタでも使えるようにする。
  • Hop.nvim
    指定した文字へ高速で移動するプラグイン
    活発な活動はしない。暇がないため。
    メンテナンスとバグ修正を続ける予定です。

プラグインのメタデータ仕様のドラフトの開発は止まっている

The Neovim package specification

2022年3月以降、コミットがありません。
メインコントリビュータがNeovimの開発から離れたせいかもしれません。

Neovim Core

Neoevimがv1.0を宣言するための条件リスト

Path to version 1.0 #20451

リンク先に書かれていますが、"Path to version 1.0" と "Roadmap" は違います。

"justinmk" がRedditで投稿したコメントを読み
自分なりに日本語に解釈したところ、次の通りになりました。

  • Path to version 1.0 :: version 1.0 になるために必要な条件のリスト
  • Roadmap :: Neovimの開発の方向性を説明するためのテーマ一覧。
    テーマはいつでも変更・中止される。

Vim9ScriptをLuaにするトランスパイラ

トランスパイラのvim9jit

開発者による紹介動画

Rustで実装しています。
次の2つのマージされたプルリクエストで使用されています。

これを使えば、全てではないですがVim9ScriptのプラグインをNeovimに移植できるようです。

Neovimコアへの追加機能と類似プラグイン

特定のプラグインと同じような機能をNeovimコアに追加、もしくは開発中みたいです。
プラグインの全ての機能ではなく、一部の機能だけを追加する場合もあります。

justinmkがRedditでコメントしていました。
返答しているプラグインの選択理由は分かりませんでした。

実装済

開発中

Neovimコアに追加しないプラグイン機能と理由

  • インデントの表示を変更する
    見た目は変わるが役にたつものではなく、表示速度が遅くなるため
    類似するプラグイン: indent-blankline.nvim
  • オートペア ([ を入力したら ] が自動で挿入される)
    オートペアのプラグインがあっても、実際の仕事が減るのを見たことない
    類似するプラグイン: auto-pairs

オプションのデフォルト値の変更案

オプションの値に関するアンケートがRedditであり、
227人の回答が集められました。

デフォルトではない値が80%以上のオプションは、
その値をデフォルトにしようという話が進まれており、
回答の80%以上である次のオプションのデフォルト値が変更される可能性があります。

  • termguicolors: true
  • number: true
  • ignorecase: true
  • smartcase: true
  • expandtab: true

アンケート結果を話題にしているissueデフォルト変更に関するissue
では次のようなコメントがあります。

テストやドキュメント生成、テキストの整列などの沢山の便利ツールが入っているmini.nvimの開発者が、アンケートの作成者です。

画面左の行番号部分をカスタマイズできるようになった

画面左の行番号部分をカスタマイズするオプション statuscolumn が実装されました。

2023年1月26日現在、 nightlyにしかない機能です。

これにより、ステータスラインの様に行番号部分を自分好みに変更できます。

statuscolumn 用のプラグインもあります。
プラグインの開発者は statuscolumn のPRを作成した人です。

EditorConfigの対応が追加された

editorconfig.nvimのようなプラグインがなくても、標準でEditorConfigが適応されるようになりました。

2023年1月26日現在、 nightlyにしかない機能です。

editorconfig.nvimの開発者が、PRの作成者です。

.editorconfig があると、自動でEditorConfigは適用されます。

次のようになります。

# 行末までの空白を削除する機能を有効にします
$ echo -e "[*.txt]\ntrim_trailing_whitespace = true" > .editorconfig
# 行末までの空白があるファイルを作成します
$ echo "trim_trailing_whitespace   " > test.txt
$ cat --show-ends test.txt  # 行末が `$` で表示されます
trim_trailing_whitespace   $

# 書き込みをして、editorconfigを動かし、行末の空白を削除します。
$ nvim --headless --clean -c "wq" test.txt
"test.txt" "test.txt" 1L, 25B written

$ cat --show-ends test.txt  # 行末が `$` で表示されます
trim_trailing_whitespace$   # 行末の空白が削除されている

見やすくするため、一部出力変更しています。

$ nvim --headless --clean -c "wq" test.txt ですが、
最後に改行がないので、

$ nvim --headless --clean -c "wq" test.txt
"test.txt" "test.txt" 1L, 28B written$ cat --show-ends test.txt

になる可能性もあります。
しかし、見にくいので上のコンソール結果では改行しています。
この後もコンソール結果を出力しているものでは、同じことをしています。

nvim --clean について

--clean で、設定やプラグインは読みこまず、新規インストール時のNeovimと極力同じ環境にします。
editorconfigはビルドインプラグインなので、 -u NONE にはしません。
-u NONE にすると、editorconfigが動きません。

:Man コマンドもビルドインプラグインなので、 -u NONE にするとできません。
ヘルプファイル時に目次を表示する、 gO も動きません。

.editorconfig とカレントディレクトリ

.editorconfig は、カレントディレクトリになくても適用されます。
親ディレクトリを調べて .editorconfig があったら、その設定を適用します。

$ echo -e "[*.txt]\ntrim_trailing_whitespace = true" > .editorconfig
$ mkdir sub
$ cd sub # ディレクトリを移動する

$ echo "trim_trailing_whitespace   " > test.txt
$ cat --show-ends test.txt  # 行末が `$` で表示されます
trim_trailing_whitespace   $

$ nvim --headless --clean -c "wq" test.txt
"test.txt" "test.txt" 1L, 25B written

$ cat --show-ends test.txt  # 行末が `$` で表示されます
trim_trailing_whitespace$   # 行末の空白が削除されている

.editorconfig がカレントディレクトリにあっても、 .editorconfig があるディレクトリ配下にないファイルには適応されません。

$ mkdir sub
# サブディレクトリに `.editorconfig` を作成する
$ echo -e "[*.txt]\ntrim_trailing_whitespace = true" > sub/.editorconfig

$ echo "trim_trailing_whitespace   " > test.txt
$ cat --show-ends test.txt  # 行末が `$` で表示されます
trim_trailing_whitespace   $

$ nvim --headless --clean -c "wq" test.txt
"test.txt" "test.txt" 1L, 25B written

# `.editorconfig` が適用されていないので、行末までの空白は削除されない
$ cat --show-ends test.txt   # 行末が `$` で表示されます
trim_trailing_whitespace   $ # 行末の空白が削除されています

.editorconfig の内容を変更したら

Neovim内で .editorconfig の内容を変更しても、すでに開いているバッファには適用されません。
edit コマンドを使用して開き直すと、変更後の設定が適用されます。

insert_final_newline = false の動作について

変更される可能性があります。

2023年1月26日現在、nightlyでは、 insert_final_newline = false で最後に改行がある場合、改行を削除します。

なので、次のようになります。

$ echo -e "[*.txt]\ninsert_final_newline = false" > .editorconfig
$ echo "insert_final_newline = false" > insert.txt  # 改行あり
$ echo -n "insert_final_newline = false" > no.txt   # 改行なし

$ nvim --headless --clean -c "wq" insert.txt
"insert.txt" "insert.txt" [noeol] 1L, 28B written
$ nvim --headless --clean -c "wq" no.txt
"no.txt" "no.txt" [noeol] 1L, 28B written

$ diff insert.txt no.txt  # 差分はなし

これはeditorconfig-vimと動作が違います。
editorconfig-vimの場合、insert_final_newline = false で最後に改行がある場合、何もしません。改行を削除しません。

仕様の書き方が悪く、改行を削除するのが正しいのか、改行をそのままにするのが正しいのか、editorconfig公式でも決まっていません。
改行をそのままにするのが正しいなら、Neovimの標準のeditorconfigの動作も変更になります。

editorconfig の値を取得する

editorconfigの "properties" テーブルにコールバック関数を追加すれば、編集しているファイルに対する editorconfig の値を取得できます。

editorconfig.lua

require('editorconfig').properties.trim_trailing_whitespace = function(bufnr, val, opts)
  print("バッファ番号: " .. bufnr)
  -- プロパティの値が `properties.trim_trailing_whitespace` の場合、
  -- `trim_trailing_whitespace` の値を参照します。
  print("プロパティの値: " .. val)
  print("編集中のファイルに適用されているeditorconfigの値全て")
  vim.pretty_print(opts)
end

.editorconfig

[*.txt]
trim_trailing_whitespace = true

nvim --headless --clean -u editorconfig.lua test.txt -c quit の結果

バッファ番号: 1
プロパティの値: true
編集中のファイルに適用されているeditorconfigの値全て
{
  trim_trailing_whitespace = "true"
}

プロパティの値がないとコールバック関数は実行されません。
そのため、 次のように編集しているファイルに対して、trim_trailing_whitespace が設定されていないとコールバック関数は実行されません。

上で設定したコールバック関数が実行されない .editorconfig の例

[*.txt]
insert_final_newline = false
[*.txt]
insert_final_newline = false

[*.adoc]
trim_trailing_whitespace = true
editorconfigにはないプロパティも設定できます

editorconfig.lua

require('editorconfig').properties.apple = function(bufnr, val, opts)
  print("バッファ番号: " .. bufnr)
  print("プロパティの値: " .. val)
  print("編集中のファイルに適用されているeditorconfigの値全て")
  vim.pretty_print(opts)
end

.editorconfig

[*.txt]
trim_trailing_whitespace = true
apple = banana

nvim --headless --clean -u editorconfig.lua test.txt -c quit の結果

バッファ番号: 1
プロパティの値: banana
編集中のファイルに適用されているeditorconfigの値全て
{
  apple = "banana",
  trim_trailing_whitespace = "true"
}
optsには編集中のファイルのみに適用されている値が入ります

editorconfig.lua

require('editorconfig').properties.format = function(bufnr, val, opts)
  print("バッファ番号: " .. bufnr)
  print("プロパティの値: " .. val)
  print("編集中のファイルに適用されているeditorconfigの値全て")
  vim.pretty_print(opts)
end

.editorconfig

root = true

[*]
end_of_line = lf
charset = utf-8

[*.txt]
trim_trailing_whitespace = true
format = editorconfig-checker

[*.norg]
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = tab
max_line_length = 80

[*.dj]
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
max_line_length = 80

nvim --headless --clean -u editorconfig.lua test.txt -c quit の結果

バッファ番号: 1
プロパティの値: editorconfig-checker
編集中のファイルに適用されているeditorconfigの値全て
{
  charset = "utf-8",
  end_of_line = "lf",
  format = "editorconfig-checker",
  root = true,
  trim_trailing_whitespace = "true"
}
プロパティが格納されている引数の値は文字列です

editorconfig.lua

require('editorconfig').properties.boolean = function(bufnr, val, opts)
  print("バッファ番号: " .. bufnr)
  print("プロパティの値: " .. val)
  print("編集中のファイルに適用されているeditorconfigの値全て")
  vim.pretty_print(opts)

  print("プロパティの値の引数は文字列に変換されます")
  print("引数のbufnrの型は" .. type(bufnr))
  print("引数のvalの型は" .. type(val))
  print("引数のopts.booleanの型は" .. type(opts.boolean))

  if val then
    print("`val` は文字列になるので、プロパティの値が `false` の場合でも、" ..
          "`if val then some() end` の `some()` は実行されます")
  end
end

.editorconfig

[*.txt]
trim_trailing_whitespace = true
boolean = false
number = 1
string = str
space = no quote
underscore = no_quote
key = no-quote
single_quote = 'apple'
double_quote = "apple"
japanese = 日本語
array = {1,2,3}
array_string = "{1,2,3}"
dict = {a = 1}
dict_string = "{a = 1, b = 2}"
key-name = kebab

nvim --headless --clean -u editorconfig.lua test.txt -c quit の結果

バッファ番号: 1
プロパティの値: false
編集中のファイルに適用されているeditorconfigの値全て
{
  array = "{1,2,3}",
  array_string = '"{1,2,3}"',
  boolean = "false",
  dict = "{a = 1}",
  dict_string = '"{a = 1, b = 2}"',
  double_quote = '"apple"',
  japanese = "日本語",
  key = "no-quote",
  ["key-name"] = "kebab",
  number = "1",
  single_quote = "'apple'",
  space = "no quote",
  string = "str",
  trim_trailing_whitespace = "true",
  underscore = "no_quote"
}
プロパティの値の引数は文字列に変換されます
引数のbufnrの型はnumber
引数のvalの型はstring
引数のopts.booleanの型はstring
`val` は文字列になるので、プロパティの値が `false` の場合、`if val then some() end` の `some()` は実行されます

ディレクトリを作成する write の ++p フラグ

:write ++p sub/apple/banana.txt コマンドを実行した際、 sub/apple ディレクトリがなくても、ファイルは作成されます。
++p フラグのおかげで、 sub/apple ディレクトリを作成してくれるからです。

2023年1月27日現在、 nightlyにしかない機能です。

$ ls sub sub/apple  # ディレクトリがないことを確認する
ls: cannot access 'sub': No such file or directory
ls: cannot access 'sub/apple': No such file or directory

# `sub/apple` ディレクトリがないためエラーになる
$ nvim --headless -u NONE -c "write sub/apple/banana.txt" -c "quit"
"sub/apple/banana.txt"
Error detected while processing command line:
E212: Can't open file for writing: no such file or directory
$ file sub/apple/banana.txt
sub/apple/banana.txt: cannot open `sub/apple/banana.txt' (No such file or directory)
# ファイルは作成されていない

# `++p` フラグがあるため、 `sub/apple` ディレクトリを作成してくれる
$ nvim --headless -u NONE -c "write ++p sub/apple/banana.txt" -c "quit"
"sub/apple/banana.txt" "sub/apple/banana.txt" [New] 0L, 0B written
$ file sub/apple/banana.txt
sub/apple/banana.txt: empty # ファイルは作成されている

設定

TJとThePrimeagenのNeovim設定構築動画

Neovim Conf 2022の司会者2人の設定構築動画が投稿されました。

LSPの設定もしています。
パッケージマネージャはPacker.nvimを使用しています。
Lazy.nvimではありません。

Migrating from Packer.nvim to Lazy.nvim
などを参考にして、Packer.nvimからLazy.nvimに移行してください。

パッケージマネージャーのLazy.nvim専用のスタータキット LazyVim v1リリース

LazyVim

パッケージマネージャー(Lazy.nvim)と開発者が同じです。

Redditのスレッドで開発者が次のようなコメントをしています


LazyVimも含め、次のような設定済みのNeovim設定の名称が分かりません。
上ではスタータキットと書いていますが、合っている可能性低いです。

プラグイン

ドキュメント生成・自動リリースがあるプラグインテンプレート

Neovim plugin boilerplate

特徴

  • ドキュメント生成
  • 自動リリース
  • テスト
  • フォーマットチェック
  • リンター(luacheck)はなし

ドキュメント生成と自動リリースのGitHub Actionsを参考にしたRedditのスレッド

ターミナルバッファの操作を改善するプラグイン

term-edit.nvim

ノーマルモードのカーソル位置を、ターミナルモードのカーソル位置にするプラグインです。

現在のnightly、ターミナルモードとノーマルモードでカーソル位置は共有されません。

そのため次のようになります。 | がカーソル位置です。

  1. ターミナルモードで donut の後にカーソルを移動する
    apple banana donut|
  2. ノーマルモードにして banana の後にカーソルを移動する
    apple banana|donut
  3. ターミナルモードにすると、1の donut の後がカーソルの位置になる
    apple banana donut|
  4. ターミナルモードで cakeを入力する
    apple banana donut cake|

term-edit.nvimを使うと、次のように変更されます。

  1. ターミナルモードで donut の後にカーソルを移動する
    apple banana donut|
  2. ノーマルモードにして banana の後にカーソルを移動する
    apple banana|donut
  3. i でターミナルモードにすると、banana の後がカーソルの位置になる。
    ノーマルモードのカーソル位置が、そのままターミナルモードのカーソル位置になる
    apple banana|donut
  4. ターミナルモードで cakeを入力する
    apple banana cake|donut

Neovimに標準搭載されるかもしれないです。
"justinmk" がRedditで "間違いなくNeovimのコアに欲しいもの" とコメントしています。

Open AIを使用するプラグイン

2つの違いは分かりませんでした。

ドキュメント

Neovim内でv0.8からv0.9の変更点を見る

:help newsをやると、v0.8かv0.9までの変更点が見れます。
破壊的変更や新機能で章が分かれてて、見やすいです

nightlyでしかできません。 v0.8.2 ではできませんでした。

nvim-lua-guideがアーカイブになった

nvim-lua-guideをベースとして、大幅に作り直したものがヘルプファイルに追加されたからです。

:help lua-guide

nvim-lua-guideの和訳をしているnvim-lua-guide-jaも、今後は更新されないと思います。

その他

Neovimのプラグイン&カラースキームを探せるWebサイト

スターかフォークの多さ順に並べる検索サイト

Neovimmm

Neovimに関するリポジトリをスターかフォークの多さ順に表示します。

プラグイン専門ではありません。
そのため、Neovim自体やfzf、awesome-neovim、dotfilesも含まれます。

検索もありますが、こちらはスターかフォークの多さ順に並びません。
並び順も分かりません。

ローカル内のカラースキームのプレビューを見れるプラグイン

Neovim使用者が使っているターミナルエミュレータ

Kittyとwezの比率が予想より大きかったです。

GitHubで編集を提案

Discussion

ありあなありあな

LazyVimも含め、次のような設定済みのNeovim設定の名称が分かりません。

Vimディストリビューションという呼称が一般的なようです。