{ config, lib, ... }: let inherit (lib.options) mkOption mkEnableOption; inherit (lib.lists) optionals; inherit (lib.types) enum either listOf str; cfg = config.vim.ui.borders; defaultStyles = ["none" "single" "double" "rounded"]; in { options.vim.ui.borders = { enable = mkEnableOption "visible borders for most windows"; globalStyle = mkOption { type = either (enum defaultStyles) (listOf str); default = "rounded"; description = '' The global border style to use. ''; }; # TODO: make per-plugin borders configurable plugins = let mkPluginStyleOption = name: { enable = mkEnableOption "borders for the ${name} plugin" // {default = cfg.enable;}; style = mkOption { type = either (enum (defaultStyles ++ optionals (name != "which-key") ["shadow"])) (listOf str); default = cfg.globalStyle; description = "The border style to use for the ${name} plugin"; }; }; in { # despite not having it listed in example configuration, which-key does support the rounded type # additionally, it supports a "shadow" type that is similar to none but is of higher contrast which-key = mkPluginStyleOption "which-key"; lspsaga = mkPluginStyleOption "lspsaga"; nvim-cmp = mkPluginStyleOption "nvim-cmp"; lsp-signature = mkPluginStyleOption "lsp-signature"; code-action-menu = mkPluginStyleOption "code-actions-menu"; }; }; }