fix(lsp): set tabSize from 'shiftwidth', not 'softtabstop' (#17787)

The use of 'softtabstop' to set tabSize was introduced in 5d5b068,
replacing 'tabstop'.  If we look past the name tabSize and at the actual
purpose of the field, it's the indentation width used when formatting.
This corresponds to the Vim option 'shiftwidth', not 'softtabstop'.
The latter has the comparatively mundane purpose of controlling what
happens when you hit the tab key (and even this is incomplete, as it
fails to account for 'smarttab').
This commit is contained in:
Tim Pope 2022-03-20 13:41:46 -04:00 committed by GitHub
parent 463738938d
commit af427dedf6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 15 deletions

View File

@ -1458,17 +1458,17 @@ extract_completion_items({result})
https://microsoft.github.io/language-server-protocol/specification#textDocument_completion https://microsoft.github.io/language-server-protocol/specification#textDocument_completion
get_effective_tabstop({bufnr}) *vim.lsp.util.get_effective_tabstop()* get_effective_tabstop({bufnr}) *vim.lsp.util.get_effective_tabstop()*
Returns visual width of tabstop. Returns indentation size.
Parameters: ~ Parameters: ~
{bufnr} (optional, number): Buffer handle, defaults to {bufnr} (optional, number): Buffer handle, defaults to
current current
Return: ~ Return: ~
(number) tabstop visual width (number) indentation size
See also: ~ See also: ~
|softtabstop| |shiftwidth|
*vim.lsp.util.jump_to_location()* *vim.lsp.util.jump_to_location()*
jump_to_location({location}, {offset_encoding}) jump_to_location({location}, {offset_encoding})

View File

@ -1894,16 +1894,16 @@ end
function M.make_workspace_params(added, removed) function M.make_workspace_params(added, removed)
return { event = { added = added; removed = removed; } } return { event = { added = added; removed = removed; } }
end end
--- Returns visual width of tabstop. --- Returns indentation size.
--- ---
---@see |softtabstop| ---@see |shiftwidth|
---@param bufnr (optional, number): Buffer handle, defaults to current ---@param bufnr (optional, number): Buffer handle, defaults to current
---@returns (number) tabstop visual width ---@returns (number) indentation size
function M.get_effective_tabstop(bufnr) function M.get_effective_tabstop(bufnr)
validate { bufnr = {bufnr, 'n', true} } validate { bufnr = {bufnr, 'n', true} }
local bo = bufnr and vim.bo[bufnr] or vim.bo local bo = bufnr and vim.bo[bufnr] or vim.bo
local sts = bo.softtabstop local sw = bo.shiftwidth
return (sts > 0 and sts) or (sts < 0 and bo.shiftwidth) or bo.tabstop return (sw == 0 and bo.tabstop) or sw
end end
--- Creates a `DocumentFormattingParams` object for the current buffer and cursor position. --- Creates a `DocumentFormattingParams` object for the current buffer and cursor position.

View File

@ -2374,18 +2374,16 @@ describe('LSP', function()
end) end)
describe('lsp.util.get_effective_tabstop', function() describe('lsp.util.get_effective_tabstop', function()
local function test_tabstop(tabsize, softtabstop) local function test_tabstop(tabsize, shiftwidth)
exec_lua(string.format([[ exec_lua(string.format([[
vim.api.nvim_buf_set_option(0, 'softtabstop', %d) vim.api.nvim_buf_set_option(0, 'shiftwidth', %d)
vim.api.nvim_buf_set_option(0, 'tabstop', 2) vim.api.nvim_buf_set_option(0, 'tabstop', 2)
vim.api.nvim_buf_set_option(0, 'shiftwidth', 3) ]], shiftwidth))
]], softtabstop))
eq(tabsize, exec_lua('return vim.lsp.util.get_effective_tabstop()')) eq(tabsize, exec_lua('return vim.lsp.util.get_effective_tabstop()'))
end end
it('with softtabstop = 1', function() test_tabstop(1, 1) end) it('with shiftwidth = 1', function() test_tabstop(1, 1) end)
it('with softtabstop = 0', function() test_tabstop(2, 0) end) it('with shiftwidth = 0', function() test_tabstop(2, 0) end)
it('with softtabstop = -1', function() test_tabstop(3, -1) end)
end) end)
describe('vim.lsp.buf.outgoing_calls', function() describe('vim.lsp.buf.outgoing_calls', function()