Skip to content

Commit

Permalink
fix(nvimdev#1482): adds the ability to set a prefix to winbar
Browse files Browse the repository at this point in the history
  • Loading branch information
adriancmiranda committed Aug 22, 2024
1 parent 4ce44df commit 9f6e198
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 3 deletions.
1 change: 1 addition & 0 deletions lua/lspsaga/highlight.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ local kind = require('lspsaga.lspkind').kind
local function hi_define()
return {
-- general
SagaPrefix = { link = 'Prefix' },
SagaTitle = { link = 'Title' },
SagaBorder = { link = 'FloatBorder' },
SagaNormal = { link = 'NormalFloat' },
Expand Down
12 changes: 9 additions & 3 deletions lua/lspsaga/symbol/winbar.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,15 @@ local function path_in_bar(buf)

local bar = bar_prefix()
local items = {}

local winbar_prefix = type(ui.winbar_prefix) == 'string'
and #ui.winbar_prefix > 0
and '%#Prefix#' .. ui.winbar_prefix
or ''

local folder
if ui.foldericon then
folder = ui.winbar_prefix .. get_kind_icon(302)[2]
folder = get_kind_icon(302)[2]
end

for item in util.path_itera(buf) do
Expand All @@ -34,7 +40,7 @@ local function path_in_bar(buf)
and '%#' .. (hl or 'SagaFileIcon') .. '#' .. (icon and icon .. ' ' or '') .. '%*' .. bar.prefix .. 'FileName#' .. item
or bar.prefix
.. 'Folder#'
.. (folder and folder or ui.winbar_prefix)
.. (folder and folder or '')
.. '%*'
.. bar.prefix
.. 'FolderName#'
Expand All @@ -47,7 +53,7 @@ local function path_in_bar(buf)
end
end

local barstr = ''
local barstr = winbar_prefix .. ''
for i = #items, 1, -1 do
barstr = barstr .. items[i] .. (i > 1 and bar.sep or '')
end
Expand Down
7 changes: 7 additions & 0 deletions test/helper.lua
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,17 @@ local function lspconfig_dep()
lspconfig.lua_ls.setup({})
end

local function extract_winbar_value(input, arg)
local pattern = '%%#' .. arg .. '#([^%%#]+)'
local winbar_value = string.match(input, pattern)
return winbar_value or ''
end

return {
test_dir = test_dir,
feedkey = feedkey,
treesitter_dep = treesitter_dep,
lspconfig_dep = lspconfig_dep,
join_paths = join_paths,
extract_winbar_value = extract_winbar_value,
}
126 changes: 126 additions & 0 deletions test/winbar_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
local lsp_symbols = {
pending_request = false,
symbols = {
{
detail = '',
kind = 19,
name = 'command',
range = {
['end'] = {
character = 18,
line = 0,
},
start = {
character = 6,
line = 0,
},
},
selectionRange = {
['end'] = {
character = 13,
line = 0,
},
start = {
character = 6,
line = 0,
},
},
},
},
}
function lsp_symbols.get_symbols(_bufnr)
return lsp_symbols
end

local lspsaga_opts = {
ui = {
winbar_prefix = ' ',
border = 'rounded',
devicon = true,
foldericon = true,
title = true,
expand = '',
collapse = '',
code_action = ' ',
lines = { '', '', '', '', '' },
kind = nil,
button = { '', '' },
imp_sign = '󰳛 ',
use_nerd = true,
},
symbol_in_winbar = {
enable = true,
separator = '|',
hide_keyword = false,
ignore_patterns = nil,
show_file = true,
folder_level = 3,
color_mode = true,
delay = 300,
},
}
local lspsaga = require('lspsaga')
lspsaga.setup(lspsaga_opts)

describe('winbar', function()
local api = vim.api
local symbols__get_buf_symbols, head__get_buf_symbols
local lspsaga_symbol = require('lspsaga.symbol')
local lspsaga_head = require('lspsaga.symbol.head')
local lspsaga_winbar = require('lspsaga.symbol.winbar')
local helper = require('test.helper')

before_each(function()
--
local buf = api.nvim_create_buf(false, true)
api.nvim_set_current_buf(buf)
api.nvim_command('vsplit')
api.nvim_set_current_win(api.nvim_get_current_win())

--
symbols__get_buf_symbols = lspsaga_symbol.get_buf_symbols
head__get_buf_symbols = lspsaga_symbol.get_buf_symbols

-- Substitui a interação real com o LSP pelo mock
lspsaga_symbol.get_buf_symbols = lsp_symbols.get_symbols
lspsaga_head.get_buf_symbols = lsp_symbols.get_symbols
end)

after_each(function()
-- Restaura a função original
lspsaga_symbol.get_buf_symbols = symbols__get_buf_symbols
lspsaga_head.get_buf_symbols = head__get_buf_symbols
end)

it('should handle width limitation in winbar', function()
-- Inicialize o winbar
lspsaga_winbar.init_winbar(api.nvim_get_current_buf())

-- Simula uma situação onde há muitos itens na winbar
-- (Adapte conforme necessário para criar uma lista longa de símbolos)
local cur_win = api.nvim_get_current_win()
local max_width = math.floor(api.nvim_win_get_width(cur_win) * 0.9)
api.nvim_set_option_value('winbar', string.rep('Item|', max_width), {
scope = 'local',
win = api.nvim_get_current_win(),
})

-- Define um valor para winbar grande o suficiente para estrapolar a largura da janela
local winbar_value = lspsaga_winbar.get_bar() or ''

-- Exemplo de verificação dos componentes do winbar
local saga_prefix = helper.extract_winbar_value(winbar_value, 'Prefix')
local saga_sep = helper.extract_winbar_value(winbar_value, 'SagaSep')
local saga_object = helper.extract_winbar_value(winbar_value, 'SagaObject')

-- Verifique se os componentes foram extraídos corretamente
assert(saga_prefix, 'Prefix not found in winbar_value')
assert(saga_sep, 'Separator not found in winbar_value')
assert(saga_object, 'Symbol not found in winbar_value')

-- Opcionalmente, você pode verificar a presença do prefixo, separador e símbolo individualmente
assert(saga_prefix == ' ', 'Prefix does not match expected value')
assert(saga_sep == '|', 'Separator does not match expected value')
assert(saga_object == ' command', 'Symbol does not match expected value')
end)
end)

0 comments on commit 9f6e198

Please sign in to comment.