[vim/vim] LSP Support in Vim Core (Discussion #19621)

39 views
Skip to first unread message

mattn

unread,
Mar 9, 2026, 8:15:57 PM (3 days ago) Mar 9
to vim/vim, Subscribed

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.

As far as I know, the following are currently a burden for LSP clients implemented as Vim plugins:

  • Obtaining text diffs
  • Applying TextEdits

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


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/repo-discussions/19621@github.com>

mattn

unread,
Mar 9, 2026, 8:18:59 PM (3 days ago) Mar 9
to vim/vim, Subscribed

This is reference implementation of getting text diffs using listener_add()

prabirshrestha/vim-lsp#1653


Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/repo-discussions/19621/comments/16059588@github.com>

Maxim Kim

unread,
Mar 9, 2026, 9:56:30 PM (3 days ago) Mar 9
to vim/vim, Subscribed

What about combined approach?

An official lsp plugin bundled with vim. With additional building blocks you mentioned in the last paragraph when and if needed.

There would be quite a few global/local settings users would need to set up and exposing/using them via core c would be quite cumbersome compared to vimscript.


Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/repo-discussions/19621/comments/16060588@github.com>

Yegappan Lakshmanan

unread,
Mar 9, 2026, 11:59:25 PM (3 days ago) Mar 9
to vim...@googlegroups.com, reply+ACY5DGDF327NKC3L3V...@reply.github.com, vim/vim, Subscribed
Hi,

On Mon, Mar 9, 2026 at 5:15 PM mattn <vim-dev...@256bit.org> 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 

vim-dev ML

unread,
Mar 9, 2026, 11:59:53 PM (3 days ago) Mar 9
to vim/vim, vim-dev ML, Your activity

Hi,

On Mon, Mar 9, 2026 at 5:15 PM mattn ***@***.***> 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


Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/repo-discussions/19621/comments/16061639@github.com>

Yegappan Lakshmanan

unread,
Mar 10, 2026, 11:15:35 AM (2 days ago) Mar 10
to vim...@googlegroups.com, reply+ACY5DGDF327NKC3L3V...@reply.github.com, vim/vim, Subscribed
Another feature we need is support for string identifiers within the
Vim channel interface.
While the Language Server Protocol specification allows for both
numeric and string identifiers
in JSON-RPC messages, the Vim channel interface currently only
supports numeric ones.

Regards,
Yegappan

vim-dev ML

unread,
Mar 10, 2026, 11:16:01 AM (2 days ago) Mar 10
to vim/vim, vim-dev ML, Your activity

On Mon, Mar 9, 2026 at 8:59 PM Yegappan Lakshmanan ***@***.***> wrote:
>
> Hi,
>
> On Mon, Mar 9, 2026 at 5:15 PM mattn ***@***.***> 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.
>

Another feature we need is support for string identifiers within the
Vim channel interface.
While the Language Server Protocol specification allows for both
numeric and string identifiers
in JSON-RPC messages, the Vim channel interface currently only
supports numeric ones.

Regards,
Yegappan


Reply to this email directly, view it on GitHub.
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/repo-discussions/19621/comments/16070456@github.com>

Christian Brabandt

unread,
Mar 10, 2026, 11:52:25 AM (2 days ago) Mar 10
to vim/vim, vim-dev ML, Comment

That would be that one here: #19003 I guess


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16070882@github.com>

mattn

unread,
Mar 11, 2026, 9:08:03 PM (16 hours ago) Mar 11
to vim/vim, vim-dev ML, Comment

In your opinion, should Vim implement an LSP client rather than being a component for LSP clients?


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16090686@github.com>

Maxim Kim

unread,
Mar 11, 2026, 10:57:49 PM (14 hours ago) Mar 11
to vim/vim, vim-dev ML, Comment

A C based LSP client built-in to vim?

It would be good to have. Is it feasible given the fact several independent plugins are available and the burden it would add for the maintainers? I don't know.


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16091390@github.com>

mattn

unread,
12:03 AM (13 hours ago) 12:03 AM
to vim/vim, vim-dev ML, Comment

Thank you. We're currently in the phase of deciding which of those to pursue, so your input is very helpful.


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16091869@github.com>

Yegappan Lakshmanan

unread,
12:57 AM (12 hours ago) 12:57 AM
to vim/vim, vim-dev ML, Comment

I think this should be implemented in Vim9script so that more people can contribute to this. I looked into implementing the LSP support in core Vim a few years ago along the lines of the existing Netbeans support. But decided against doing that as only a few people will contribute to the C based implementation.


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16092219@github.com>

Foxe Chen

unread,
7:59 AM (5 hours ago) 7:59 AM
to vim/vim, vim-dev ML, Comment

I'm just curious, what makes implementing string identifiers non-trivial? Would it be possible to use a hash table to match LSP requests with responses?


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16096962@github.com>

Yegappan Lakshmanan

unread,
11:15 AM (2 hours ago) 11:15 AM
to vim/vim, vim-dev ML, Comment

@64-bitman Yes. The LSP feature depends on the Vim channel feature. The channel code can be extended to support string identifiers. Someone needs to work on this.


Reply to this email directly, view it on GitHub.
You are receiving this because you commented.Message ID: <vim/vim/repo-discussions/19621/comments/16099463@github.com>

Reply all
Reply to author
Forward
0 new messages