Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

日本語を含むbufferでLSPサーバーと改行が同期されない #77

Open
dondakeshimo opened this issue Nov 4, 2024 · 1 comment
Labels

Comments

@dondakeshimo
Copy link
Owner

概要

日本語を含むbufferを開いた際に、コードコメントを使用すると改行の入り方がおかしくなっている気がする。

Warning: multiple different client offset_encodings detected for buffer, this is not supported yet がmessageとして発生することがあるが、上記の改行と相関があるのかは不明。

vim-jpに投げた質問の要約

gopls, lua-ls (現状、自分が使用しているLSPのすべて) でコードコメントを挿入するとLSPサーバーと同期がずれている様子で、ありもしないdiagnosticを吐くようになってしまいました。:edit でbufferを開き直すと同期が修正されるのか、diagnosticは消えます。それぞれのLSPで微妙に挙動が違うので補足します。

  • gopls: トップレベルのスコープ?にコメントを書くとアウト。例えば関数の一行上にコメントを書くと関数定義までコメント行とみなされてしまうっぽい。関数の二行上にコメントを書いたら大丈夫…ぽい?
  • lua-ls: 日本語のコメントを書くとアウト。2文字目からコメント害の判定になっている様子で、例えば //あいう とコメントすれば、 Undifined global いう となる。offset_encodingはutf-8に設定。

nvim-lspはbufferの差分のみをLSPサーバーへ連携しているとどこかで見た記憶があるので、その辺りで悪さしているのではと仮説を立てるところまでで壁に突き当たってしまいました。何か解決方法や検証方法などご存知の方いらっしゃいましたらご教示いただけると幸いです

@dondakeshimo
Copy link
Owner Author

いただいたヒント

Neovimのcopilot.luaのここでutf-16が指定されているのが原因で index out of range になってサジェストを確定できなくなったため、以下項目を調整した事例あり。

https://github.com/zbirenbaum/copilot.lua/blob/master/lua/copilot/suggestion.lua#L489

            -- 元の vim.lsp.util.apply_text_edits をラップ
            local original_apply_text_edits = vim.lsp.util.apply_text_edits

            -- 新しい apply_text_edits を定義し、utf-8 に強制する
            vim.lsp.util.apply_text_edits = function(edits, bufnr, encoding)
                -- encoding を utf-8 に強制
                encoding = "utf-8"
                -- 元の関数を呼び出す
                original_apply_text_edits(edits, bufnr, encoding)
            end

同様に、skkeltonでもエラーが発生していた事例があり

   Error  15:31:15 msg_show.lua_error Error executing vim.schedule lua callback: ...ls/neovim/0.10.2/share/nvim/runtime/lua/vim/lsp/util.lua:485: index out of range
stack traceback:
    [C]: in function 'get_line_byte_from_position'
    ...ls/neovim/0.10.2/share/nvim/runtime/lua/vim/lsp/util.lua:485: in function 'apply_text_edits'
    ...l/share/nvim/lazy/copilot.lua/lua/copilot/suggestion.lua:489: in function ''
    vim/_editor.lua: in function <vim/_editor.lua:0>

下記調整を実施したとのこと

local current_line = vim.api.nvim_get_current_line()
local utf16_char = vim.str_utfindex(current_line, character)

range["end"].line = line
range.start.line = line
range["end"].character = utf16_char

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant