{ config, pkgs, ... }: { programs.neovim = { enable = true; vimAlias = true; viAlias = true; plugins = [ pkgs.vimPlugins.vimtex pkgs.vimPlugins.zoxide-vim pkgs.vimPlugins.gruvbox pkgs.vimPlugins.neovim-sensible pkgs.vimPlugins.nvim-web-devicons pkgs.vimPlugins.nvim-tree-lua pkgs.vimPlugins.nvim-surround pkgs.vimPlugins.floaterm pkgs.vimPlugins.nvim-lspconfig pkgs.vimPlugins.cmp-nvim-lsp pkgs.vimPlugins.cmp-buffer pkgs.vimPlugins.cmp-path pkgs.vimPlugins.cmp-cmdline pkgs.vimPlugins.nvim-cmp pkgs.vimPlugins.cmp-vsnip pkgs.vimPlugins.vim-vsnip pkgs.vimPlugins.dashboard-nvim pkgs.vimPlugins.lualine-nvim # nix coloring and etc. pkgs.vimPlugins.vim-nix # required for Telescope pkgs.vimPlugins.plenary-nvim pkgs.vimPlugins.blink-ripgrep-nvim pkgs.vimPlugins.nvim-treesitter pkgs.vimPlugins.telescope-nvim # scrollbar pkgs.vimPlugins.nvim-scrollbar # ufo pkgs.vimPlugins.promise-async pkgs.vimPlugins.nvim-ufo # cheatsheet pkgs.vimPlugins.cheatsheet-nvim pkgs.vimPlugins.popup-nvim # multiple cursor #Plug 'brenton-leighton/multiple-cursors.nvim' # i use instead the following: pkgs.vimPlugins.vim-visual-multi # plugins not found #Plug 'arminveres/md-pdf.nvim' #Plug "sharkdp/fd" #Plug 'sontungexpt/better-diagnostic-virtual-text' ]; extraLuaConfig = '' local vim = vim -- local Plug = vim.fn['plug#'] vim.g.mapleader ='ü' vim.g.maplocalleader = 'ü' -- Set to true if you have a Nerd Font installed and selected in the terminal vim.g.have_nerd_font = true -- [[ Setting options ]] -- See `:help vim.opt` -- NOTE: You can change these options as you wish! -- For more options, you can see `:help option-list` -- Make line numbers default -- You can also add relative line numbers, to help with jumping. -- Experiment for yourself to see if you like it! vim.opt.relativenumber = false -- Enable mouse mode, can be useful for resizing splits for example! vim.opt.mouse = 'a' -- Don't show the mode, since it's already in the status line vim.opt.showmode = false -- Sync clipboard between OS and Neovim. -- Schedule the setting after `UiEnter` because it can increase startup-time. -- Remove this option if you want your OS clipboard to remain independent. -- See `:help 'clipboard'` vim.schedule(function() vim.opt.clipboard = 'unnamedplus' end) -- Enable break indent vim.opt.breakindent = true -- Save undo history vim.opt.undofile = true -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term vim.opt.ignorecase = true vim.opt.smartcase = true -- Keep signcolumn on by default vim.opt.signcolumn = 'yes' -- Decrease update time vim.opt.updatetime = 250 -- Decrease mapped sequence wait time -- Displays which-key popup sooner vim.opt.timeoutlen = 300 -- Configure how new splits should be opened vim.opt.splitright = true vim.opt.splitbelow = true -- Sets how neovim will display certain whitespace characters in the editor. -- See `:help 'list'` -- and `:help 'listchars'` vim.opt.list = true vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } -- indentation settings - added by me -- refere to https://stackoverflow.com/questions/51995128/setting-autoindentation-to-spaces-in-neovim for more information vim.opt.expandtab = true vim.opt.smartindent = true vim.opt.tabstop = 4 vim.opt.shiftwidth = 4 -- Preview substitutions live, as you type! vim.opt.inccommand = 'split' -- Show which line your cursor is on vim.opt.cursorline = true -- Minimal number of screen lines to keep above and below the cursor. vim.opt.scrolloff = 10 -- [[ Basic Keymaps ]] -- See `:help vim.keymap.set()` -- Clear highlights on search when pressing in normal mode -- See `:help hlsearch` vim.keymap.set('n', '', 'nohlsearch') -- Diagnostic keymaps vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) -- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier -- for people to discover. Otherwise, you normally need to press , which -- is not what someone will guess without a bit more experience. -- -- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping -- or just use to exit terminal mode vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) -- TIP: Disable arrow keys in normal mode -- vim.keymap.set('n', '', 'echo "Use h to move!!"') -- vim.keymap.set('n', '', 'echo "Use l to move!!"') -- vim.keymap.set('n', '', 'echo "Use k to move!!"') -- vim.keymap.set('n', '', 'echo "Use j to move!!"') -- Keybinds to make split navigation easier. -- Use CTRL+ to switch between windows -- -- See `:help wincmd` for a list of all window commands vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) -- jump to next error vim.keymap.set("n", "t", vim.diagnostic.goto_prev) vim.keymap.set("n", "z", vim.diagnostic.goto_next) -- [[ Basic Autocommands ]] -- See `:help lua-guide-autocommands` -- Highlight when yanking (copying) text -- Try it with `yap` in normal mode -- See `:help vim.highlight.on_yank()` vim.api.nvim_create_autocmd('TextYankPost', { desc = 'Highlight when yanking (copying) text', group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), callback = function() vim.highlight.on_yank() end, }) --require("multiple-cursors").setup({ -- version = "*", -- Use the latest tagged version -- opts = {}, -- This causes the plugin setup function to be called -- keys = { -- {"", "MultipleCursorsAddDown", mode = {"n", "x"}, desc = "Add cursor and move down"}, -- {"", "MultipleCursorsAddUp", mode = {"n", "x"}, desc = "Add cursor and move up"}, -- -- {"", "MultipleCursorsAddUp", mode = {"n", "i", "x"}, desc = "Add cursor and move up"}, -- {"", "MultipleCursorsAddDown", mode = {"n", "i", "x"}, desc = "Add cursor and move down"}, -- -- {"", "MultipleCursorsMouseAddDelete", mode = {"n", "i"}, desc = "Add or remove cursor"}, -- -- {"m", "MultipleCursorsAddVisualArea", mode = {"x"}, desc = "Add cursors to the lines of the visual area"}, -- -- {"a", "MultipleCursorsAddMatches", mode = {"n", "x"}, desc = "Add cursors to cword"}, -- {"A", "MultipleCursorsAddMatchesV", mode = {"n", "x"}, desc = "Add cursors to cword in previous area"}, -- -- {"d", "MultipleCursorsAddJumpNextMatch", mode = {"n", "x"}, desc = "Add cursor and jump to next cword"}, -- {"D", "MultipleCursorsJumpNextMatch", mode = {"n", "x"}, desc = "Jump to next cword"}, -- -- {"l", "MultipleCursorsLock", mode = {"n", "x"}, desc = "Lock virtual cursors"}, -- }, --}) vim.keymap.set("n","§", "Cheatsheet") require("cheatsheet").setup({ bundled_cheatsheets = { -- only show the default cheatsheet enabled = { "default" }, }, bundled_plugin_cheatsheets = { -- show cheatsheets for all plugins except gitsigns disabled = { "gitsigns.nvim" }, } }) -- Can be applied to each buffer separately local default_options = { ui = { wrap_line_after = false, -- wrap the line after this length to avoid the virtual text is too long left_kept_space = 3, --- the number of spaces kept on the left side of the virtual text, make sure it enough to custom for each line right_kept_space = 3, --- the number of spaces kept on the right side of the virtual text, make sure it enough to custom for each line arrow = "  ", up_arrow = "  ", down_arrow = "  ", above = false, -- the virtual text will be displayed above the line }, priority = 2003, -- the priority of virtual text inline = true, } -- scrollbar require("scrollbar").setup() -- ufo https://github.com/kevinhwang91/nvim-ufo vim.o.foldcolumn = '1' -- '0' is not bad vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value vim.o.foldlevelstart = 99 vim.o.foldenable = true -- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself vim.keymap.set('n', '1', "foldopen") vim.keymap.set('n', '2', "foldclose") vim.keymap.set('n', '3', "openAllFold") vim.keymap.set('n', '4', " closeAllFold") -- Option 3: treesitter as a main provider instead -- (Note: the `nvim-treesitter` plugin is *not* needed.) -- ufo uses the same query files for folding (queries//folds.scm) -- performance and stability are better than `foldmethod=nvim_treesitter#foldexpr()` --vim.keymap.set('n', '1', function() require("ufo").foldopen() end, {buffer=0}) --vim.keymap.set('n', '2', function() require("ufo").foldclose() end) -- added by myself require('ufo').setup({ provider_selector = function(bufnr, filetype, buftype) return {'treesitter', 'indent'} end }) -- Color schemes should be loaded after plug#end(). vim.o.background = "dark" -- or "light" for light mode -- Default options: --require("gruvbox").setup({ -- terminal_colors = true, -- add neovim terminal colors -- undercurl = true, -- underline = true, -- bold = true, -- italic = { -- strings = true, -- emphasis = true, -- comments = true, -- operators = false, -- folds = true, -- }, -- strikethrough = true, -- invert_selection = false, -- invert_signs = false, -- invert_tabline = false, -- invert_intend_guides = false, -- inverse = true, -- invert background for search, diffs, statuslines and errors -- contrast = "", -- can be "hard", "soft" or empty string -- palette_overrides = {}, -- overrides = {}, -- dim_inactive = false, -- transparent_mode = false, --}) vim.cmd("colorscheme gruvbox") -- nvim-tree https://github.com/nvim-tree/nvim-tree.lua -- disable netrw at the very start of your init.lua vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 -- optionally enable 24-bit colour vim.opt.termguicolors = true -- setup with some options require("nvim-tree").setup({ sort = { sorter = "case_sensitive", }, view = { width = 30, }, renderer = { group_empty = true, }, filters = { dotfiles = true, }, }) vim.opt.number = true -- Uncomment for opening the navigable tree file systeme on startup of NeoVim --vim.cmd('NvimTreeOpen') --require('md-pdf').setup({ -- --- Set margins around document -- margins = "1.5cm", -- -- tango, pygments are quite nice for white on white -- highlight = "tango", -- -- Generate a table of contents, on by default -- toc = true, -- -- Define a custom preview command, enabling hooks and other custom logic -- preview_cmd = function() return 'firefox' end, -- -- if true, then the markdown file is continuously converted on each write, even if the -- -- file viewer closed, e.g., firefox is "closed" once the document is opened in it. -- ignore_viewer_state = false, -- -- Specify font, `nil` uses the default font of the theme -- fonts = nil, -- -- or, where all or only some options can be specified. NOTE: those that are `nil` can be left -- -- out completely -- fonts = { -- main_font = nil, -- sans_font = "DejaVuSans", -- mono_font = "IosevkaTerm Nerd Font Mono", -- math_font = nil, -- }, -- -- Custom options passed to `pandoc` CLI call, can be ignored for setup -- pandoc_user_args = nil, -- -- or -- pandoc_user_args = { -- -- short -- "-V KEY[:VALUE]", -- -- long options -- "--standalone=[true|false]", -- }, -- --- Path to output. Needs to be always relative, e.g.: "./", "../", "./out" or simply "out", but -- --- not absolute e.g.: "/"! -- output_path = "", --}) -- setup mapping vim.keymap.set("n", ",", function() require('md-pdf').convert_md_to_pdf() end) -- Set up nvim-cmp. local cmp = require'cmp' cmp.setup({ snippet = { -- REQUIRED - you must specify a snippet engine expand = function(args) vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users. -- require('snippy').expand_snippet(args.body) -- For `snippy` users. -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. -- vim.snippet.expand(args.body) -- For native neovim snippets (Neovim v0.10+) end, }, window = { -- completion = cmp.config.window.bordered(), -- documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' }, -- For vsnip users. -- { name = 'luasnip' }, -- For luasnip users. -- { name = 'ultisnips' }, -- For ultisnips users. -- { name = 'snippy' }, -- For snippy users. }, { { name = 'buffer' }, }) }) -- To use git you need to install the plugin petertriho/cmp-git and uncomment lines below -- Set configuration for specific filetype. --[[ cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, }, { { name = 'buffer' }, }) }) require("cmp_git").setup() ]]-- -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }), matching = { disallow_symbol_nonprefix_matching = false } }) -- require(lspconfig) is deprecated -- -- Set up lspconfig. -- local capabilities = require('cmp_nvim_lsp').default_capabilities() -- -- Replace with each lsp server you've enabled. -- require('lspconfig')['texlab'].setup { -- capabilities = capabilities -- } --require'lspconfig'.clangd.setup{} --lspconfig = require("lspconfig") --lspconfig.pylsp.setup { --on_attach = custom_attach, --settings = { -- pylsp = { -- plugins = { -- -- formatter options -- black = { enabled = true }, -- autopep8 = { enabled = false }, -- yapf = { enabled = false }, -- -- linter options -- pylint = { enabled = true, executable = "pylint" }, -- pyflakes = { enabled = false }, -- pycodestyle = { enabled = false }, -- -- type checker -- pylsp_mypy = { enabled = true }, -- -- auto-completion options -- jedi_completion = { fuzzy = true }, -- -- import sorting -- pyls_isort = { enabled = true }, -- }, -- }, --}, --flags = { -- debounce_text_changes = 200, --}, --capabilities = capabilities, --} ---- lua-lsp --require'lspconfig'.lua_ls.setup{} -- --new version -- ============================ -- LSP CONFIGURATION (Neovim 0.11+) -- ============================ -- Set up capabilities for nvim-cmp LSP completion local capabilities = require('cmp_nvim_lsp').default_capabilities() -- Optional: custom on_attach function if you have keymaps -- local custom_attach = function(client, bufnr) -- -- your on_attach code here -- end -- Utility function to simplify server setup local function setup_lsp(server_name, opts) vim.lsp.config(server_name, opts or {}) end -- ======== LSP SERVERS ======== -- TeXLab setup_lsp("texlab", { capabilities = capabilities, }) -- Clangd (C/C++) setup_lsp("clangd", { capabilities = capabilities, }) -- Python LSP (pylsp) setup_lsp("pylsp", { on_attach = custom_attach, capabilities = capabilities, flags = { debounce_text_changes = 200, }, settings = { pylsp = { plugins = { -- Formatter options black = { enabled = true }, autopep8 = { enabled = false }, yapf = { enabled = false }, -- Linter options pylint = { enabled = true, executable = "pylint" }, pyflakes = { enabled = false }, pycodestyle = { enabled = false }, -- Type checker pylsp_mypy = { enabled = true }, -- Auto-completion options jedi_completion = { fuzzy = true }, -- Import sorting pyls_isort = { enabled = true }, }, }, }, }) -- Lua LSP setup_lsp("lua_ls", { capabilities = capabilities, }) -- dashboard config require('dashboard').setup { theme = 'hyper', config = { header = { " ... ... . ", " .=*8888n..\"%888: @88> ", " X ?8888f '8888 u. ... .. %8P .. . : ", " 88x. '8888X 8888> .u ...ue888b :~\"\"888h.:^\"888: . .888: x888 x888. ", "'8888k 8888X '\"*8h. ud8888. 888R Y888r 8X `8888X 8888> .@88u ~`8888~'888X`?888f` ", " \"8888 X888X .xH8 :888'8888. 888R I888> X888n. 8888X ?888> '\"888E` X888 888X '888> ", " `8\" X888!:888X d888 '88%\" 888R I888> '88888 8888X ?**h. 888E X888 888X '888> ", " =~` X888 X888X 8888.+\" 888R I888> `*88 8888~ x88x. 888E X888 888X '888> ", " :h. X8*` !888X 8888L u8888cJ888 ..<\" 88*` 88888X 888E X888 888X '888> ", " X888xX\" '8888..: '8888c. .+ \"*888*P\" ..XC. `*8888k 888& \"*88%\"\"*88\" '888!` ", ":~`888f '*888*\" \"88888% 'Y\" :888888H. `%88> R888\" `~ \" `\"` ", " \"\" `\"` \"YP' < `\"888888: X\" \"\" ", " %888888x.-` ", " \"\"**\"\" ", "", "" }, shortcut = { { desc = " Open File Tree", group = "", key = 't', action = 'NvimTreeOpen' }, -- action can be a function type }, packages = { enable = false }, -- show how many plugins neovim loaded -- limit how many projects list, action when you press key or enter it will run this action. -- action can be a functino type, e.g. -- action = func(path) vim.cmd('Telescope find_files cwd=' .. path) end project = { enable = true, limit = 8, icon = ' New file', label = "", action = 'Telescope find_files cwd=' }, mru = { limit = 10, icon = ' History', label = "", cwd_only = false }, footer = {}, -- footer } } -- lualine config https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/bubbles.lua require('lualine').setup { options = { theme = "gruvbox_dark" }, } local builtin = require('telescope.builtin') vim.keymap.set('n', 'ff', builtin.find_files, { desc = 'Telescope find files' }) vim.keymap.set('n', 'fg', builtin.live_grep, { desc = 'Telescope live grep' }) vim.keymap.set('n', 'fb', builtin.buffers, { desc = 'Telescope buffers' }) vim.keymap.set('n', 'fh', builtin.help_tags, { desc = 'Telescope help tags' }) -- Disable relative numbers even if a plugin (like neovim-sensible) turns them on vim.opt.colorcolumn = "" vim.api.nvim_create_autocmd("VimEnter", { callback = function() vim.opt.relativenumber = false end, }) ''; }; }