From 42447cd3bf0f505c93dfe2e9c659edd5184e61ab Mon Sep 17 00:00:00 2001 From: diniamo Date: Sun, 16 Jun 2024 19:56:31 +0200 Subject: [PATCH] tabline/bufferline: add highlights --- .../tabline/nvim-bufferline/config.nix | 2 +- .../nvim-bufferline/nvim-bufferline.nix | 710 +++++++++--------- 2 files changed, 362 insertions(+), 350 deletions(-) diff --git a/modules/plugins/tabline/nvim-bufferline/config.nix b/modules/plugins/tabline/nvim-bufferline/config.nix index aaacd33..59363f8 100644 --- a/modules/plugins/tabline/nvim-bufferline/config.nix +++ b/modules/plugins/tabline/nvim-bufferline/config.nix @@ -40,7 +40,7 @@ in { }; luaConfigRC.nvimBufferline = entryAnywhere '' - require("bufferline").setup({options = ${toLuaObject cfg.setupOpts}}) + require("bufferline").setup(${toLuaObject cfg.setupOpts}) ''; }; }; diff --git a/modules/plugins/tabline/nvim-bufferline/nvim-bufferline.nix b/modules/plugins/tabline/nvim-bufferline/nvim-bufferline.nix index 94236aa..90ae482 100644 --- a/modules/plugins/tabline/nvim-bufferline/nvim-bufferline.nix +++ b/modules/plugins/tabline/nvim-bufferline/nvim-bufferline.nix @@ -21,370 +21,382 @@ in { }; setupOpts = mkPluginSetupOption "Bufferline-nvim" { - mode = mkOption { - type = enum ["tabs" "buffers"]; - default = "buffers"; - description = "Mode to use for bufferline"; - }; - - style_preset = mkOption { - type = enum ["default" "minimal" "no_bold" "no_italic"]; - default = "default"; - apply = value: mkLuaInline "require('bufferline').style_preset.${value}"; - description = "The base style of bufferline"; - }; - - themable = mkOption { - type = bool; - default = true; - description = '' - Whether or not highlight groups to be overriden. - - While false, bufferline.nvim sets highlights as default - ''; - }; - - numbers = mkOption { - type = either (enum ["none" "ordinal" "buffer_id" "both"]) luaInline; - default = mkLuaInline '' - function(opts) - return string.format('%s·%s', opts.raise(opts.id), opts.lower(opts.ordinal)) - end - ''; - description = "Whether or not to show buffer numbers"; - }; - - close_command = mkOption { - type = either str luaInline; - default = mkLuaInline '' - function(bufnum) - require("bufdelete").bufdelete(bufnum, false) - end - ''; - description = "Command to run when closing a buffer"; - }; - - right_mouse_command = mkOption { - type = nullOr (either str luaInline); - default = "vertical sbuffer %d"; - description = "Command to run when right clicking a buffer"; - }; - - left_mouse_command = mkOption { - type = nullOr (either str luaInline); - default = "buffer %d"; - description = "Command to run when left clicking a buffer"; - }; - - middle_mouse_command = mkOption { - type = nullOr (either str luaInline); + highlights = mkOption { + type = either attrs luaInline; default = null; - description = "Command to run when middle clicking a buffer"; + description = '' + Overrides the highlight groups of bufferline. + + See `:help bufferline-highlights`. + ''; }; - indicator = { - icon = mkOption { - type = nullOr str; + options = { + mode = mkOption { + type = enum ["tabs" "buffers"]; + default = "buffers"; + description = "Mode to use for bufferline"; + }; + + style_preset = mkOption { + type = enum ["default" "minimal" "no_bold" "no_italic"]; + default = "default"; + apply = value: mkLuaInline "require('bufferline').style_preset.${value}"; + description = "The base style of bufferline"; + }; + + themable = mkOption { + type = bool; + default = true; + description = '' + Whether or not highlight groups to be overriden. + + While false, bufferline.nvim sets highlights as default + ''; + }; + + numbers = mkOption { + type = either (enum ["none" "ordinal" "buffer_id" "both"]) luaInline; + default = mkLuaInline '' + function(opts) + return string.format('%s·%s', opts.raise(opts.id), opts.lower(opts.ordinal)) + end + ''; + description = "Whether or not to show buffer numbers"; + }; + + close_command = mkOption { + type = either str luaInline; + default = mkLuaInline '' + function(bufnum) + require("bufdelete").bufdelete(bufnum, false) + end + ''; + description = "Command to run when closing a buffer"; + }; + + right_mouse_command = mkOption { + type = nullOr (either str luaInline); + default = "vertical sbuffer %d"; + description = "Command to run when right clicking a buffer"; + }; + + left_mouse_command = mkOption { + type = nullOr (either str luaInline); + default = "buffer %d"; + description = "Command to run when left clicking a buffer"; + }; + + middle_mouse_command = mkOption { + type = nullOr (either str luaInline); + default = null; + description = "Command to run when middle clicking a buffer"; + }; + + indicator = { + icon = mkOption { + type = nullOr str; + default = null; + description = '' + The indicatotor icon to use for current buffer. + + ::: {.warning} + This **must** be ommitted while style is not `icon` + ::: + ''; + }; + + style = mkOption { + type = enum ["icon" "underline" "none"]; + default = "underline"; + description = "Style for indicator"; + }; + }; + + buffer_close_icon = mkOption { + type = str; + default = " 󰅖 "; + description = "Icon for close button"; + }; + + modified_icon = mkOption { + type = str; + default = "● "; + description = "Icon for modified buffer"; + }; + + close_icon = mkOption { + type = str; + default = "  "; + description = "Icon for close button"; + }; + + left_trunc_marker = mkOption { + type = str; + default = ""; + description = "Icon for left truncation"; + }; + + right_trunc_marker = mkOption { + type = str; + default = ""; + description = "Icon for right truncation"; + }; + + name_formatter = mkOption { + type = nullOr luaInline; default = null; description = '' - The indicatotor icon to use for current buffer. + `name_formatter` can be used to change the buffer's label in the + bufferline. - ::: {.warning} - This **must** be ommitted while style is not `icon` + ::: {.note} + Some names can/will break the bufferline so use this at your + discretion knowing that it has some limitations that will + **NOT** be fixed. ::: ''; }; - style = mkOption { - type = enum ["icon" "underline" "none"]; - default = "underline"; - description = "Style for indicator"; - }; - }; - - buffer_close_icon = mkOption { - type = str; - default = " 󰅖 "; - description = "Icon for close button"; - }; - - modified_icon = mkOption { - type = str; - default = "● "; - description = "Icon for modified buffer"; - }; - - close_icon = mkOption { - type = str; - default = "  "; - description = "Icon for close button"; - }; - - left_trunc_marker = mkOption { - type = str; - default = ""; - description = "Icon for left truncation"; - }; - - right_trunc_marker = mkOption { - type = str; - default = ""; - description = "Icon for right truncation"; - }; - - name_formatter = mkOption { - type = nullOr luaInline; - default = null; - description = '' - `name_formatter` can be used to change the buffer's label in the - bufferline. - - ::: {.note} - Some names can/will break the bufferline so use this at your - discretion knowing that it has some limitations that will - **NOT** be fixed. - ::: - ''; - }; - - max_name_length = mkOption { - type = int; - default = 18; - description = "Max name length"; - }; - - max_prefix_length = mkOption { - type = int; - default = 15; - description = "Length of prefix used when a buffer is de-duplicated"; - }; - - truncate_names = mkOption { - type = bool; - default = true; - description = "Truncate names"; - }; - - tab_size = mkOption { - type = int; - default = 18; - description = "The size of the tabs in bufferline"; - }; - - diagnostics = mkOption { - type = enum [false "nvim_lsp" "coc"]; - default = "nvim_lsp"; - description = "Diagnostics provider to be used in buffer LSP indicators"; - }; - - diagnostics_update_in_insert = mkOption { - type = bool; - default = false; - description = '' - Whether to update diagnostics while in insert mode. - - Setting this to true has performance implications, but they may be - negligible depending on your setup. Set it to true if you know what - you are doing. - ''; - }; - - diagnostics_indicator = mkOption { - type = nullOr luaInline; - default = mkLuaInline '' - function(count, level, diagnostics_dict, context) - local s = " " - for e, n in pairs(diagnostics_dict) do - local sym = e == "error" and "  " - or (e == "warning" and "  " or "  " ) - s = s .. n .. sym - end - return s - end - ''; - - description = '' - Function to get the diagnostics indicator. - The function should return a string to be used as the indicator. - - Can be set to nil to keep the buffer name highlight, but delete the - highlighting. - ''; - }; - - custom_filter = mkOption { - type = nullOr luaInline; - default = null; - example = literalExpression '' - custom_filter = function(buf_number, buf_numbers) - -- filter out filetypes you don't want to see - if vim.bo[buf_number].filetype ~= "" then - return true - end - -- filter out by buffer name - if vim.fn.bufname(buf_number) ~= "" then - return true - end - -- filter out based on arbitrary rules - -- e.g. filter out vim wiki buffer from tabline in your work repo - if vim.fn.getcwd() == "" and vim.bo[buf_number].filetype ~= "wiki" then - return true - end - -- filter out by it's index number in list (don't show first buffer) - if buf_numbers[1] ~= buf_number then - return true - end - end - ''; - - description = '' - Custom filter function for filtering out buffers. - - ::: {.note} - This will be called a lot, so you are encouraged to keep it as - short and lightweight as possible unless you are fully aware - of the performance implications. - ::: - ''; - }; - - offsets = mkOption { - type = listOf attrs; - default = [ - { - filetype = "NvimTree"; - text = "File Explorer"; - highlight = "Directory"; - separator = true; - } - ]; - description = "The windows to offset bufferline above, see `:help bufferline-offset`"; - }; - - color_icons = mkOption { - type = bool; - default = true; - description = "Whether or not to add filetype icon highlights"; - }; - - get_element_icon = mkOption { - type = nullOr luaInline; - default = null; - example = literalExpression '' - function(element) - local custom_map = {my_thing_ft: {icon = "my_thing_icon", hl = "DevIconDefault"}} - return custom_map[element.filetype] - end - ''; - description = "The function bufferline uses to get the icon. Recommended to leave as default."; - }; - - show_buffer_icons = mkOption { - type = bool; - default = true; - description = "Whether or not to show buffer icons"; - }; - - show_buffer_close_icons = mkOption { - type = bool; - default = true; - description = "Whether or not to show buffer close icons"; - }; - - show_close_icon = mkOption { - type = bool; - default = true; - description = "Whether or not to show close icon"; - }; - - show_tab_indicators = mkOption { - type = bool; - default = true; - description = "Whether or not to show tab indicators"; - }; - - show_duplicate_prefix = mkOption { - type = bool; - default = true; - description = "Whether or not to show duplicate prefix"; - }; - - duplicates_across_groups = mkOption { - type = bool; - default = true; - description = "Whether to consider duplicate paths in different groups as duplicates"; - }; - - persist_buffer_sort = mkOption { - type = bool; - default = true; - description = "Whether or not custom sorted buffers should persist"; - }; - - move_wraps_at_ends = mkOption { - type = bool; - default = false; - description = "Whether or not the move command \"wraps\" at the first or last position"; - }; - - seperator_style = mkOption { - type = either (enum ["thick" "thin" "slope" "slant"]) (listOf str); - default = [" " " "]; - description = '' - Style of the buffer separator. - - Can be either one of the suspported values, or a list containing - **at most** two elements for `focused` and `unfocused` respectively. - ''; - }; - - separator_style = mkOption { - type = enum ["slant" "slope" "thick" "thin" list]; - default = "thin"; - description = '' - The type of separator used to separate buffers and tabs. - - Either one of the listed types, or a list of 2 characters for either side. - ''; - }; - - enforce_regular_tabs = mkOption { - type = bool; - default = false; - description = "Whether to enforce regular tabs"; - }; - - always_show_bufferline = mkOption { - type = bool; - default = true; - description = "Whether to always show bufferline"; - }; - - auto_toggle_bufferline = mkOption { - type = bool; - default = false; - description = "Whether to auto toggle bufferline"; - }; - - hover = { - enabled = mkEnableOption "hover" // {default = true;}; - delay = mkOption { + max_name_length = mkOption { type = int; - default = 200; - description = "Delay for hover, in ms"; + default = 18; + description = "Max name length"; }; - reveal = mkOption { - type = listOf str; - default = ["close"]; - description = "Reveal hover window"; + max_prefix_length = mkOption { + type = int; + default = 15; + description = "Length of prefix used when a buffer is de-duplicated"; }; - }; - sort_by = mkOption { - type = either (enum ["insert_after_current" "insert_at_end" "id" "extension" "relative_directory" "directory" "tabs"]) luaInline; - default = "extension"; - description = "Method to sort buffers by. Must be one of the supported valuees, or an inline Lua value."; + truncate_names = mkOption { + type = bool; + default = true; + description = "Truncate names"; + }; + + tab_size = mkOption { + type = int; + default = 18; + description = "The size of the tabs in bufferline"; + }; + + diagnostics = mkOption { + type = enum [false "nvim_lsp" "coc"]; + default = "nvim_lsp"; + description = "Diagnostics provider to be used in buffer LSP indicators"; + }; + + diagnostics_update_in_insert = mkOption { + type = bool; + default = false; + description = '' + Whether to update diagnostics while in insert mode. + + Setting this to true has performance implications, but they may be + negligible depending on your setup. Set it to true if you know what + you are doing. + ''; + }; + + diagnostics_indicator = mkOption { + type = nullOr luaInline; + default = mkLuaInline '' + function(count, level, diagnostics_dict, context) + local s = " " + for e, n in pairs(diagnostics_dict) do + local sym = e == "error" and "  " + or (e == "warning" and "  " or "  " ) + s = s .. n .. sym + end + return s + end + ''; + + description = '' + Function to get the diagnostics indicator. + The function should return a string to be used as the indicator. + + Can be set to nil to keep the buffer name highlight, but delete the + highlighting. + ''; + }; + + custom_filter = mkOption { + type = nullOr luaInline; + default = null; + example = literalExpression '' + custom_filter = function(buf_number, buf_numbers) + -- filter out filetypes you don't want to see + if vim.bo[buf_number].filetype ~= "" then + return true + end + -- filter out by buffer name + if vim.fn.bufname(buf_number) ~= "" then + return true + end + -- filter out based on arbitrary rules + -- e.g. filter out vim wiki buffer from tabline in your work repo + if vim.fn.getcwd() == "" and vim.bo[buf_number].filetype ~= "wiki" then + return true + end + -- filter out by it's index number in list (don't show first buffer) + if buf_numbers[1] ~= buf_number then + return true + end + end + ''; + + description = '' + Custom filter function for filtering out buffers. + + ::: {.note} + This will be called a lot, so you are encouraged to keep it as + short and lightweight as possible unless you are fully aware + of the performance implications. + ::: + ''; + }; + + offsets = mkOption { + type = listOf attrs; + default = [ + { + filetype = "NvimTree"; + text = "File Explorer"; + highlight = "Directory"; + separator = true; + } + ]; + description = "The windows to offset bufferline above, see `:help bufferline-offset`"; + }; + + color_icons = mkOption { + type = bool; + default = true; + description = "Whether or not to add filetype icon highlights"; + }; + + get_element_icon = mkOption { + type = nullOr luaInline; + default = null; + example = literalExpression '' + function(element) + local custom_map = {my_thing_ft: {icon = "my_thing_icon", hl = "DevIconDefault"}} + return custom_map[element.filetype] + end + ''; + description = "The function bufferline uses to get the icon. Recommended to leave as default."; + }; + + show_buffer_icons = mkOption { + type = bool; + default = true; + description = "Whether or not to show buffer icons"; + }; + + show_buffer_close_icons = mkOption { + type = bool; + default = true; + description = "Whether or not to show buffer close icons"; + }; + + show_close_icon = mkOption { + type = bool; + default = true; + description = "Whether or not to show close icon"; + }; + + show_tab_indicators = mkOption { + type = bool; + default = true; + description = "Whether or not to show tab indicators"; + }; + + show_duplicate_prefix = mkOption { + type = bool; + default = true; + description = "Whether or not to show duplicate prefix"; + }; + + duplicates_across_groups = mkOption { + type = bool; + default = true; + description = "Whether to consider duplicate paths in different groups as duplicates"; + }; + + persist_buffer_sort = mkOption { + type = bool; + default = true; + description = "Whether or not custom sorted buffers should persist"; + }; + + move_wraps_at_ends = mkOption { + type = bool; + default = false; + description = "Whether or not the move command \"wraps\" at the first or last position"; + }; + + seperator_style = mkOption { + type = either (enum ["thick" "thin" "slope" "slant"]) (listOf str); + default = [" " " "]; + description = '' + Style of the buffer separator. + + Can be either one of the suspported values, or a list containing + **at most** two elements for `focused` and `unfocused` respectively. + ''; + }; + + separator_style = mkOption { + type = enum ["slant" "slope" "thick" "thin" list]; + default = "thin"; + description = '' + The type of separator used to separate buffers and tabs. + + Either one of the listed types, or a list of 2 characters for either side. + ''; + }; + + enforce_regular_tabs = mkOption { + type = bool; + default = false; + description = "Whether to enforce regular tabs"; + }; + + always_show_bufferline = mkOption { + type = bool; + default = true; + description = "Whether to always show bufferline"; + }; + + auto_toggle_bufferline = mkOption { + type = bool; + default = false; + description = "Whether to auto toggle bufferline"; + }; + + hover = { + enabled = mkEnableOption "hover" // {default = true;}; + delay = mkOption { + type = int; + default = 200; + description = "Delay for hover, in ms"; + }; + + reveal = mkOption { + type = listOf str; + default = ["close"]; + description = "Reveal hover window"; + }; + }; + + sort_by = mkOption { + type = either (enum ["insert_after_current" "insert_at_end" "id" "extension" "relative_directory" "directory" "tabs"]) luaInline; + default = "extension"; + description = "Method to sort buffers by. Must be one of the supported valuees, or an inline Lua value."; + }; }; }; };