Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions configuration.nix
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,13 @@ isMaximal: {
lualine = {
enable = true;
theme = "catppuccin";

integrations.breadcrumbs = {
vanilla.enable = !isMaximal;
nvim-navic.enable = isMaximal;
navbuddy.enable = isMaximal;
lspsaga.enable = false;
};
};
};

Expand Down Expand Up @@ -264,10 +271,6 @@ isMaximal: {
colorizer.enable = true;
modes-nvim.enable = false; # the theme looks terrible with catppuccin
illuminate.enable = true;
breadcrumbs = {
enable = isMaximal;
navbuddy.enable = isMaximal;
};
smartcolumn = {
enable = true;
setupOpts.custom_colorcolumn = {
Expand Down
3 changes: 1 addition & 2 deletions docs/manual/release-notes/rl-0.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@
- Added {option}`vim.ui.borders.enable` for global and individual plugin border
configuration.

- LSP integrated breadcrumbs with {option}`vim.ui.breadcrumbs.enable` through
nvim-navic
- LSP integrated breadcrumbs with `vim.ui.breadcrumbs.enable` through nvim-navic

- LSP navigation helper with nvim-navbuddy, depends on nvim-navic (automatically
enabled if navic is enabled)
Expand Down
6 changes: 3 additions & 3 deletions docs/manual/release-notes/rl-0.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,12 +297,12 @@ The changes are, in no particular order:
Lualine. Only `vim.ui.breadcrumbs.lualine.winbar` is supported for the time
being.

- {option}`vim.ui.breadcrumbs.lualine.winbar.enable` has been added to allow
- `vim.ui.breadcrumbs.lualine.winbar.enable` has been added to allow
controlling the default behaviour of the `nvim-navic` component on Lualine,
which used to occupy `winbar.lualine_c` as long as breadcrumbs are enabled.
- `vim.ui.breadcrumbs.alwaysRender` has been renamed to
{option}`vim.ui.breadcrumbs.lualine.winbar.alwaysRender` to be conform to
the new format.
`vim.ui.breadcrumbs.lualine.winbar.alwaysRender` to be conform to the new
format.

- Add [basedpyright](https://github.com/detachhead/basedpyright) as a Python LSP
server and make it default.
Expand Down
3 changes: 3 additions & 0 deletions docs/manual/release-notes/rl-26.12.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
- `minimap/codewindow`: disabled/dropped till it supports main branch
tree-sitter.

- `ui/breadcrumbs`: was removed and completely rebuild under
`statusline.lualine.integrations.breadcrumbs`.

## Changelog {#sec-release-26-12-changelog}

[snoweuph](https://github.com/snoweuph)
Expand Down
8 changes: 8 additions & 0 deletions modules/extra/deprecations.nix
Original file line number Diff line number Diff line change
Expand Up @@ -84,5 +84,13 @@ in {
Disabled, because it doesn't support tree-sitter main branch.
'')
]

# 2026-08-16
[
(mkRenamedOptionModule ["vim" "ui" "breadcrumbs" "enable"] ["vim" "statusline" "lualine" "integrations" "breadcrumbs" "nvim-navic" "enable"])
(mkRenamedOptionModule ["vim" "ui" "breadcrumbs" "lualine" "winbar" "enable"] ["vim" "statusline" "lualine" "integrations" "breadcrumbs" "nvim-navic" "enable"])
(mkRenamedOptionModule ["vim" "ui" "breadcrumbs" "lualine" "winbar" "alwaysRender"] ["vim" "statusline" "lualine" "integrations" "breadcrumbs" "nvim-navic" "alwaysRender"])
(mkRenamedOptionModule ["vim" "ui" "breadcrumbs" "navbuddy" "enable"] ["vim" "statusline" "lualine" "integrations" "breadcrumbs" "navbuddy" "enable"])
]
];
}
7 changes: 0 additions & 7 deletions modules/plugins/lsp/config.nix
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,8 @@ in {
${mkBinding mappings.toggleFormatOnSave "function() vim.b.disableFormatSave = not vim.b.disableFormatSave end"}
end

${optionalString config.vim.ui.breadcrumbs.enable ''local navic = require("nvim-navic")''}
default_on_attach = function(client, bufnr)
attach_keymaps(client, bufnr)
${optionalString config.vim.ui.breadcrumbs.enable ''
-- let navic attach to buffers
if client.server_capabilities.documentSymbolProvider then
navic.attach(client, bufnr)
end
''}
end

local capabilities = vim.lsp.protocol.make_client_capabilities()
Expand Down
231 changes: 223 additions & 8 deletions modules/plugins/statusline/lualine/config.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@
lib,
...
}: let
inherit (builtins) map;
inherit (lib.attrsets) filterAttrs mapAttrs';
inherit (lib.lists) map count;
inherit (lib.modules) mkIf mkMerge mkDefault;
inherit (lib.trivial) boolToString;
inherit (lib.nvim.dag) entryAnywhere;
inherit (lib.nvim.dag) entryAnywhere entryAfter;
inherit (lib.nvim.lua) toLuaObject;
inherit (lib.generators) mkLuaInline;

cfg = config.vim.statusline.lualine;
bCfg = config.vim.ui.breadcrumbs;

cfgIntBreadcrumbs = cfg.integrations.breadcrumbs;
in {
config = mkMerge [
{
Expand All @@ -37,17 +39,230 @@ in {
]);
}

(mkIf (bCfg.enable && bCfg.lualine.winbar.enable && bCfg.source == "nvim-navic") {
vim.statusline.lualine.setupOpts = {
# TODO: rewrite in new syntax
winbar.lualine_c = mkDefault [
{
assertions = [
{
assertion =
count (x: x) (with cfgIntBreadcrumbs; [
vanilla.enable
nvim-navic.enable
lspsaga.enable
])
<= 1;

message = ''
Only one lualine breadcrumb integration can be enabled at once.
'';
}
];
}

(mkIf cfgIntBreadcrumbs.vanilla.enable {
vim.statusline.lualine.setupOpts."${cfgIntBreadcrumbs.location}"."lualine_${cfgIntBreadcrumbs.section}" = [
(
mkLuaInline ''
function()
local buffer = vim.api.nvim_get_current_buf()

local supported = false
for _, client in pairs(vim.lsp.get_clients({ bufnr = buffer })) do
if client.server_capabilities.documentSymbolProvider then
supported = true
break
end
end

if not supported then
return ""
end

local responses = vim.lsp.buf_request_sync(
buffer,
"textDocument/documentSymbol",
{ textDocument = { uri = vim.uri_from_bufnr(buffer) } },
100
)

local symbols
for _, response in pairs(responses or {}) do
if response.result then
symbols = response.result
break
end
end

if not symbols then
return ""
end

local cursor_line, cursor_column = unpack(vim.api.nvim_win_get_cursor(0))
cursor_line = cursor_line - 1
local names = {}

local function find_symbols(symbols)
for _, symbol in ipairs(symbols or {}) do
local range = symbol.range

if
range
and (cursor_line > range.start.line or cursor_line == range.start.line and cursor_column >= range.start.character)
and (
cursor_line < range["end"].line
or cursor_line == range["end"].line and cursor_column <= range["end"].character
)
then
names[#names + 1] = symbol.name
find_symbols(symbol.children)
return
end
end
end

find_symbols(symbols)
return table.concat(names, "%#${cfgIntBreadcrumbs.vanilla.separator.color}#${cfgIntBreadcrumbs.vanilla.separator.symbol}%*")
end
''
)
];
})

(mkIf cfgIntBreadcrumbs.nvim-navic.enable {
vim = {
startPlugins = [
"nvim-lspconfig"
"nvim-navic"
];
statusline.lualine.setupOpts."${cfgIntBreadcrumbs.location}"."lualine_${cfgIntBreadcrumbs.section}" = [
[
"navic"
(mkLuaInline "draw_empty = ${boolToString bCfg.lualine.winbar.alwaysRender}")
(mkLuaInline "draw_empty = ${boolToString cfgIntBreadcrumbs.nvim-navic.alwaysRender}")
]
];

pluginRC.breadcrumbs-navic = entryAfter ["lspconfig"] ''
local navic = require("nvim-navic")
require("nvim-navic").setup({
highlight = true,
})
'';

autocmds = [
{
event = ["LspAttach"];
callback = mkLuaInline ''
function(event)
local bufnr = event.buf
local client = vim.lsp.get_client_by_id(event.data.client_id)
if client.server_capabilities.documentSymbolProvider then
require("nvim-navic").attach(client, bufnr)
end
end
'';
}
];
};
})

(mkIf cfgIntBreadcrumbs.navbuddy.enable {
vim = {
statusline.lualine.integrations.breadcrumbs.nvim-navic.enable = true;

startPlugins = [
"nvim-navbuddy"
"nui-nvim"
];

pluginRC.breadcrumbs-navbuddy = entryAfter ["lspconfig" "breadcrumbs-navic"] ''
local navbuddy = require("nvim-navbuddy")
local actions = require("nvim-navbuddy.actions")
navbuddy.setup ${toLuaObject (
cfgIntBreadcrumbs.navbuddy.setupOpts
// {
mappings =
mapAttrs'
(name: key: {
inherit name;
value =
{
close = mkLuaInline "actions.close()";
nextSibling = mkLuaInline "actions.next_sibling()";
previousSibling = mkLuaInline "actions.previous_sibling()";
parent = mkLuaInline "actions.parent()";
children = mkLuaInline "actions.children()";
root = mkLuaInline "actions.root()";

visualName = mkLuaInline "actions.visual_name()";
visualScope = mkLuaInline "actions.visual_scope()";

yankName = mkLuaInline "actions.yank_name()";
yankScope = mkLuaInline "actions.yank_scope()";

insertName = mkLuaInline "actions.insert_name()";
insertScope = mkLuaInline "actions.insert_scope()";

appendName = mkLuaInline "actions.append_name()";
appendScope = mkLuaInline "actions.append_scope()";

rename = mkLuaInline "actions.rename()";
delete = mkLuaInline "actions.delete()";

foldCreate = mkLuaInline "actions.fold_create()";
foldDelete = mkLuaInline "actions.fold_delete()";

comment = mkLuaInline "actions.comment()";
select = mkLuaInline "actions.select()";

moveDown = mkLuaInline "actions.move_down()";
moveUp = mkLuaInline "actions.move_up()";

togglePreview = mkLuaInline "actions.toggle_preview()";

vsplit = mkLuaInline "actions.vsplit()";
hsplit = mkLuaInline "actions.hsplit()";

telescope = mkLuaInline ''
actions.telescope({
layout_strategy = "horizontal",
layout_config = {
height = 0.60,
width = 0.75,
prompt_position = "top",
preview_width = 0.50,
},
})
'';

help = mkLuaInline "actions.help()";
}.${
name
};
})
(filterAttrs (_: key: key != null) cfgIntBreadcrumbs.navbuddy.mappings);
}
)}

'';
};
})

(mkIf cfgIntBreadcrumbs.lspsaga.enable {
vim = {
lsp.lspsaga = {
enable = true;
setupOpts.symbol_in_winbar.enable = true;
};
statusline.lualine.setupOpts."${cfgIntBreadcrumbs.location}"."lualine_${cfgIntBreadcrumbs.section}" = [
(
mkLuaInline ''
function()
return require("lspsaga.symbol.winbar").get_bar()
end
''
)
];
};
})

(mkIf cfg.enable {
vim = {
startPlugins = ["lualine-nvim"];
Expand Down
Loading
Loading