mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(lsp): opts.reuse_win does not jump if buf is already open #33476
Problem:
`vim.lsp.buf.[implementation|definition|...]({ reuse_win = true })` does not
jump cursor to existing window if buffer is already open.
Steps to reproduce:
1. `nvim repro.lua`
2. Insert anything that lsp can read to open the library definition/implementation, e.g., `vim.keymap.set`
3. open `repro.lua` buffer and the library buffer side by side.
4. type `gd` over `set` to jump to the library definition.
The open buffer is scrolled to the target line, but cursor does not jump.
Solution:
Call nvim_set_current_win if necessary.
(cherry picked from commit 6926fc1615)
			
			
This commit is contained in:
		@@ -215,7 +215,13 @@ local function get_locations(method, opts)
 | 
			
		||||
        vim.fn.settagstack(vim.fn.win_getid(win), { items = tagstack }, 't')
 | 
			
		||||
 | 
			
		||||
        vim.bo[b].buflisted = true
 | 
			
		||||
        local w = opts.reuse_win and vim.fn.win_findbuf(b)[1] or win
 | 
			
		||||
        local w = win
 | 
			
		||||
        if opts.reuse_win then
 | 
			
		||||
          w = vim.fn.win_findbuf(b)[1] or w
 | 
			
		||||
          if w ~= win then
 | 
			
		||||
            api.nvim_set_current_win(w)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        api.nvim_win_set_buf(w, b)
 | 
			
		||||
        api.nvim_win_set_cursor(w, { item.lnum, item.col - 1 })
 | 
			
		||||
        vim._with({ win = w }, function()
 | 
			
		||||
 
 | 
			
		||||
@@ -5230,7 +5230,7 @@ describe('LSP', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('lsp.buf.definition', function()
 | 
			
		||||
    it('jumps to single location', function()
 | 
			
		||||
    it('jumps to single location and can reuse win', function()
 | 
			
		||||
      exec_lua(create_server_definition)
 | 
			
		||||
      local result = exec_lua(function()
 | 
			
		||||
        local bufnr = vim.api.nvim_get_current_buf()
 | 
			
		||||
@@ -5256,8 +5256,10 @@ describe('LSP', function()
 | 
			
		||||
        vim.api.nvim_win_set_cursor(win, { 3, 6 })
 | 
			
		||||
        local client_id = assert(vim.lsp.start({ name = 'dummy', cmd = server.cmd }))
 | 
			
		||||
        vim.lsp.buf.definition()
 | 
			
		||||
        vim.lsp.stop_client(client_id)
 | 
			
		||||
        return {
 | 
			
		||||
          win = win,
 | 
			
		||||
          bufnr = bufnr,
 | 
			
		||||
          client_id = client_id,
 | 
			
		||||
          cursor = vim.api.nvim_win_get_cursor(win),
 | 
			
		||||
          messages = server.messages,
 | 
			
		||||
          tagstack = vim.fn.gettagstack(win),
 | 
			
		||||
@@ -5269,6 +5271,15 @@ describe('LSP', function()
 | 
			
		||||
      eq('x', result.tagstack.items[1].tagname)
 | 
			
		||||
      eq(3, result.tagstack.items[1].from[2])
 | 
			
		||||
      eq(7, result.tagstack.items[1].from[3])
 | 
			
		||||
 | 
			
		||||
      n.feed(':vnew<CR>')
 | 
			
		||||
      api.nvim_win_set_buf(0, result.bufnr)
 | 
			
		||||
      api.nvim_win_set_cursor(0, { 3, 6 })
 | 
			
		||||
      n.feed(':=vim.lsp.buf.definition({ reuse_win = true })<CR>')
 | 
			
		||||
      eq(result.win, api.nvim_get_current_win())
 | 
			
		||||
      exec_lua(function()
 | 
			
		||||
        vim.lsp.stop_client(result.client_id)
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
    it('merges results from multiple servers', function()
 | 
			
		||||
      exec_lua(create_server_definition)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user