Hi,

On Mon, Mar 9, 2026 at 5:15 PM mattn <[email protected]> wrote:

> Today, many text editors and IDEs support the Language Server Protocol
> (LSP). As you all know, LSP is a protocol that provides features such as
> code completion, syntax highlighting, and error detection, supporting a
> wide range of programming languages.
>
> Vim will most likely still be alive ten years from now, and so will LSP.
> There is more than enough merit in adding LSP support to Vim's core
> functionality.
>
> I would like to discuss and decide on Vim's direction now, while we have
> the opportunity. There are broadly two approaches:
>
> *Plan 1.* Vim core implements the LSP client itself
> *Plan 2.* Vim core implements the building blocks needed for an LSP client
>
> The first plan needs little explanation. Having Vim core implement the LSP
> client directly is the most straightforward way to provide LSP support.
> This would allow users to take advantage of LSP features simply by using
> Vim.
>
> The second plan is for Vim core to implement the building blocks needed
> for an LSP client. This means Vim core would provide the foundation for LSP
> client functionality. This would enable plugins such as vim-lsp and
> yegappan/lsp to build fast and stable LSP clients by leveraging core
> functionality.
>

I prefer the second option as that is more flexible and allows more custom
plugins to be developed.


> As far as I know, the following are currently a burden for LSP clients
> implemented as Vim plugins:
>
>    - Obtaining text diffs
>    - Applying TextEdits
>
>
The enhancements to the listener functionality in Vim 9.2 are supposed to
simplify the method to get the
changes. I haven't tried it out yet as I want the LSP plugin to work with
Vim 9.0.

I also added the diff() function to simplify getting the diff between a
cached version of a buffer and the
latest version.


>
>
> When obtaining text diffs in Vim script, you would typically call 
> getbufline(1,
> '$'), but when the text is tens of thousands of lines long, this function
> call becomes costly — for example, applying semantic highlights can take
> several seconds. LSP clients should send only the changed portions to the
> server.
>
> As for applying TextEdits, anyone who has implemented an LSP client will
> understand — applying TextEdits requires accurately and efficiently
> reflecting changes to a buffer based on specified positions and lengths,
> making it a complex and costly operation.
>
> Implementing these in Vim script is extremely difficult, and performance
> issues are likely to arise. If we choose Plan 2, I believe we need to
> implement the following three building blocks in Vim core:
>
>    - fname_to_uri(), fname_from_uri()
>    - A way to obtain text diffs using listener_add(), or a getchanges()
>    function to get the current text diff
>    - applytextedits() to apply TextEdits to a buffer
>
>
> We also need functions to better handle snippets with multiple variables.

Regards,
Yegappan

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/CAAW7x7nvge1G_MMauUxrTM6FpyrYUu%3DmY%3DaMS5jN%3DZrSfawwOw%40mail.gmail.com.

Raspunde prin e-mail lui