エディタのLSP Clientが
- 仕様通りのClient
- 仕様とは異なる実装のClient
どちらになっているか、を検証したい
- 仕様とは異なる実装のサーバーを使って、継続する複数行にまたがるフォーマットをかける
- 仕様通りに修正したサーバーを使って、同じ操作をする
結果として意図通りの結果になるのはどちらか、を観察する
version: 2
tools:
echo-fix: &echo-fix
format-command: zsh -c 'print "foo\nbar\nbaz"'
format-stdin: true
languages:
json:
- <<: *echo-fix
(この設定は、JSONファイルを常に foo\nbar\nbaz
に書き換えてしまう、という設定になっている)
上記の設定で言えばJSONを対象にしているため、JSONに対して実行できる様にする
ファイルの中身が
foo
bar
baz
に書き換えられた場合は、意図通りの挙動。
https://github.com/kyoh86/efm-langserver/tree/fix-281
をインストールして、既存のefm-langserver実装と差し替える
※インストールにGoがいるので、Goなんてない!という場合はこちらでクロスコンパイルしたものをお渡しします
ファイルの中身が
foo
bar
baz
に書き換えられた場合は、意図通りの挙動。
3.
で意図通りの挙動になった場合は、仕様とは異なるクライアント実装になっている。
5.
で意図通りの挙動になった場合は、仕様通りのクライアント実装になっている。
Neovimの内部実装LSP Clientは、長らく 「Language Serverから返ってきたText Editレスポンスのうち、位置が同じものは、返ってきたレスポンスを逆順に処理する」 という仕様とは異なる実装になっていた。
(※この実装がどこに依拠していたのかは不明)
これが6月7日のコミットで「仕様通りの」 「Language Serverから返ってきたText Editレスポンスを返ってきた順のまま処理する」 Clientに是正された。
efm-langserverはNeovimの仕様とは異なる実装に合わせた形で実装されている。 そのため、Neovimの方が修正されたことで、Neovimでは efm-langserverのレスポンスが逆順に適用されるようになってしまった。
efm-langserverに修正を加えたいが、各種他クライアントも仕様とは異なる実装に依っており、 修正が逆にユーザーの意図しない挙動に繋がってしまう。