{ pkgs, ... }: let render-markdown = pkgs.vimUtils.buildVimPlugin { name = "render-markdown"; src = pkgs.fetchFromGitHub { owner = "MeanderingProgrammer"; repo = "markdown.nvim"; rev = "78ef39530266b3a0736c48b46c3f5d1ab022c7db"; hash = "sha256-mddnBvIrekHh60Ix6qIYAnv10Mu40LamGI47EXk9wSo="; }; }; # for lsp/cmp inside markdown code blocks otter = pkgs.vimUtils.buildVimPlugin { name = "otter"; src = pkgs.fetchFromGitHub { owner = "jmbuhr"; repo = "otter.nvim"; rev = "cbb1be0586eae18cbea38ada46af428d2bebf81a"; hash = "sha256-eya/8rG3O8UFeeBRDa5U8v3qay+q3iFwPnYtdX7ptCA="; }; }; fzy-lua-native = pkgs.vimUtils.buildVimPlugin { name = "fzy-lua-native"; src = pkgs.fetchFromGitHub { owner = "romgrk"; repo = "fzy-lua-native"; rev = "9d720745d5c2fb563c0d86c17d77612a3519c506"; hash = "sha256-pBV5iGa1+5gtM9BcDk8I5SKoQ9sydOJHsmyoBcxAct0="; }; }; in { programs.nixvim = { plugins = { treesitter-textobjects = { enable = true; lspInterop.enable = true; select = { enable = true; keymaps = { "ai" = { query = "@impl.outer"; }; "ii" = { query = "@impl.inner"; }; "af" = { query = "@function.outer"; }; "if" = { query = "@function.inner"; }; "ac" = { query = "@conditional.outer"; }; "ic" = { query = "@conditional.inner"; }; "al" = { query = "@loop.outer"; }; "il" = { query = "@loop.inner"; }; }; }; move = { enable = true; setJumps = true; gotoNextStart = { "]f" = { query = "@function.outer"; }; "]c" = { query = "@conditional.outer"; }; "]l" = { query = "@loop.outer"; }; "]i" = { query = "@impl.outer"; }; }; gotoNextEnd = { "]F" = { query = "@function.outer"; }; "]C" = { query = "@conditional.outer"; }; "]L" = { query = "@loop.outer"; }; "]I" = { query = "@impl.outer"; }; }; gotoPreviousStart = { "[f" = { query = "@function.outer"; }; "[c" = { query = "@conditional.outer"; }; "[l" = { query = "@loop.outer"; }; "[i" = { query = "@impl.outer"; }; }; gotoPreviousEnd = { "[F" = { query = "@function.outer"; }; "[C" = { query = "@conditional.outer"; }; "[L" = { query = "@loop.outer"; }; "[I" = { query = "@impl.outer"; }; }; }; }; treesitter = { enable = true; nixGrammars = false; nixvimInjections = false; settings = { indent.enable = true; ensure_installed = "all"; ignore_install = [ "wing" ]; highlight.enable = true; incremental_selection = { enable = true; keymaps = { # init_selection = ""; scope_incremental = "ss"; node_incremental = "si"; node_decremental = "sd"; }; }; }; }; rainbow-delimiters.enable = true; vim-surround.enable = true; cmp-nvim-lsp.enable = true; lsp-format.enable = true; fugitive.enable = false; lspkind.enable = true; crates-nvim.enable = true; fidget.enable = true; cmp.enable = true; nvim-autopairs.enable = true; image = { enable = true; integrations.markdown = { enabled = true; clearInInsertMode = true; downloadRemoteImages = true; }; }; # dial.nvim which-key = { enable = true; }; auto-session = { enable = true; settings = { auto_save_enabled = true; auto_restore_enabled = true; pre_save_cmds = [ "Neotree close" ]; post_restore_cmds = [ "Neotree filesystem show" ]; }; }; comment = { enable = true; settings = { sticky = true; }; }; neo-tree = { enable = true; closeIfLastWindow = true; enableGitStatus = false; window = { position = "right"; width = 30; mappings = { "" = "navigate_up"; "." = "set_root"; "/" = "fuzzy_finder"; "f" = "filter_on_submit"; "h" = "show_help"; }; }; filesystem = { followCurrentFile.enabled = true; filteredItems = { hideHidden = false; hideDotfiles = false; forceVisibleInEmptyFolder = true; hideGitignored = false; }; }; }; nvim-lightbulb = { enable = true; settings = { autocmd = { enabled = true; updatetime = 200; }; line = { enabled = true; }; number = { enabled = true; hl = "LightBulbNumber"; }; float = { enabled = false; text = "💡"; }; sign = { enabled = true; text = "💡"; }; status_text = { enabled = false; text = "💡"; }; }; }; # git-conflict = { # enable = true; # settings = { # default_mappings = { # both = "cb"; # none = "c0"; # ours = "co"; # prev = "]x"; # next = "[x"; # theirs = "ct"; # }; # disable_diagnostics = false; # highlights = { # current = "DiffText"; # incoming = "DiffAdd"; # }; # list_opener = "conflicts"; # }; # }; # gitsigns = { # enable = true; # # settings = { # current_line_blame = true; # current_line_blame_opts = { # virt_text = true; # virt_text_pos = "eol"; # }; # }; # }; lspsaga = { enable = true; lightbulb.enable = false; codeAction.keys = { quit = ""; }; }; typst-vim = { enable = true; settings = { cmd = "${pkgs.typst}/bin/typst"; conceal_math = 1; auto_close_toc = 1; }; }; lualine = { enable = true; settings.options.theme = "onedark"; }; rustaceanvim = { enable = true; rustAnalyzerPackage = pkgs.rust-analyzer; settings = { auto_attach = true; server = { standalone = false; default_settings = { rust-analyzer = { inlayHints = { lifetimeElisionHints.enable = "always"; expressionAdjustmentHints = { enable = "always"; mode = "prefer_postfix"; }; discriminantHints.enable = "always"; }; # check = { # command = "+nightly clippy"; # }; cachePriming.enable = false; diagnostic = { refreshSupport = true; }; }; # cargo = { # buildScripts.enable = true; # features = "all"; # runBuildScripts = true; # loadOutDirsFromCheck = true; # }; # checkOnSave = true; # check = { # allFeatures = true; # command = "clippy"; # extraArgs = [ "--no-deps" ]; # }; # procMacro = { enable = true; }; # imports = { # granularity = { group = "module"; }; # prefix = "self"; # }; # files = { # excludeDirs = # [ ".cargo" ".direnv" ".git" "node_modules" "target" ]; # }; # # inlayHints = { # bindingModeHints.enable = true; # closureStyle = "rust_analyzer"; # closureReturnTypeHints.enable = "always"; # discriminantHints.enable = "always"; # expressionAdjustmentHints.enable = "always"; # implicitDrops.enable = true; # lifetimeElisionHints.enable = "always"; # rangeExclusiveHints.enable = true; # reborrowHints.enable = "mutable"; # }; # # rustc.source = "discover"; # options.diagnostics = { enable = true; styleLints.enable = true; }; }; }; }; }; lsp = { enable = true; servers = { astro.enable = true; cssls.enable = true; nil_ls = { enable = true; settings = { formatting.command = [ "${(pkgs.lib.getExe pkgs.nixfmt-rfc-style)}" ]; }; extraOptions = { nix = { maxMemoryMB = 0; flake = { autoArchive = true; autoEvalInputs = true; nixpkgsInputName = "nixpkgs"; }; }; }; }; clangd = { enable = true; filetypes = [ "c" "cpp" "objc" "objcpp" ]; }; eslint = { enable = true; filetypes = [ "javascript" "javascriptreact" "typescript" "typescriptreact" ]; }; html = { enable = true; filetypes = [ "html" ]; }; jsonls = { enable = true; filetypes = [ "json" "jsonc" ]; }; pyright = { enable = true; filetypes = [ "python" ]; }; bashls = { enable = true; filetypes = [ "sh" "bash" ]; }; # ts_ls = { # enable = true; # filetypes = # [ "javascript" "javascriptreact" "typescript" "typescriptreact" ]; # }; # marksman.enable = true; yamlls = { enable = true; filetypes = [ "yaml" ]; }; }; inlayHints = true; keymaps = { lspBuf = { ";" = "format"; "gh" = "hover"; }; }; }; wilder = { enable = true; modes = [ "/" ":" "?" ]; enableCmdlineEnter = true; beforeCursor = true; useCmdlinechanged = true; nextKey = ""; prevKey = ""; acceptKey = ""; rejectKey = ""; pipeline = [ '' wilder.branch( wilder.cmdline_pipeline({ language = 'python', fuzzy = 2, }), wilder.python_search_pipeline({ pattern = wilder.python_fuzzy_pattern(), sorter = wilder.python_difflib_sorter(), engine = 're', }), wilder.substitute_pipeline({ pipeline = wilder.python_search_pipeline({ skip_cmdtype_check = 1, pattern = wilder.python_fuzzy_pattern({ start_at_boundary = 0, }), }), }), { wilder.check(function(ctx, x) return x == "" end), wilder.history(), }, wilder.python_file_finder_pipeline({ file_command = {'${pkgs.ripgrep}/bin/rg', '--files'}, dir_command = {'${pkgs.fd}/bin/fd', '-td'}, filters = {'cpsm_filter'}, }) ) '' ]; renderer = '' (function() local highlighters = { wilder.pcre2_highlighter(), wilder.lua_fzy_highlighter(), } local popupmenu_renderer = wilder.popupmenu_renderer( wilder.popupmenu_border_theme({ border = 'rounded', empty_message = wilder.popupmenu_empty_message_with_spinner(), highlighter = highlighters, highlights = { accent = wilder.make_hl('WilderAccent', 'Pmenu', {{a = 1}, {a = 1}, {foreground = '#f4468f'}}), }, left = { ' ', wilder.popupmenu_devicons(), wilder.popupmenu_buffer_flags({ flags = ' a + ', icons = {['+'] = '', a = '', h = ''}, }), }, right = { ' ', wilder.popupmenu_scrollbar(), }, }) ) local wildmenu_renderer = wilder.wildmenu_renderer({ highlights = { accent = wilder.make_hl('WilderAccent', 'Pmenu', {{a = 1}, {a = 1}, {foreground = '#f4468f'}}), }, highlighter = highlighters, separator = ' · ', left = {' ', wilder.wildmenu_spinner(), ' '}, right = {' ', wilder.wildmenu_index()}, }) return wilder.renderer_mux({ [':'] = popupmenu_renderer, ['/'] = wildmenu_renderer, substitute = wildmenu_renderer, }) end)() ''; }; floaterm = { enable = true; opener = "edit"; width = 0.8; height = 0.8; }; telescope = { enable = true; extensions.ui-select.enable = true; extensions.fzf-native.enable = true; settings = { defaults = { path_display = [ "smart" ]; layout_strategy = "horizontal"; layout_config = { width = 0.99; height = 0.99; }; }; }; }; # tabs barbar = { enable = true; settings = { options.diagnostics = "nvim_lsp"; focus_on_close = "previous"; }; }; none-ls = { enable = true; sources = { formatting.nixpkgs_fmt.enable = true; code_actions.statix.enable = true; diagnostics = { statix.enable = true; deadnix.enable = true; }; }; }; nix.enable = true; web-devicons.enable = true; }; extraPlugins = with pkgs.vimPlugins; [ vim-vsnip cmp-vsnip cmp-path cmp-spell telescope-ui-select-nvim telescope-fzf-native-nvim vim-suda render-markdown otter vim-astro nvim-web-devicons vim-visual-multi vim-gh-line BufOnly-vim neoconf-nvim vim-autoswap targets-vim fzy-lua-native cpsm # jj vim-jjdescription ]; }; }