{ inputs, pkgs, config, ... }: { imports = [ inputs.nixvim.homeManagerModules.nixvim ]; programs.nixvim = { enable = true; enableMan = true; # install man pages for nixvim options clipboard.register = "unnamedplus"; # use system clipboard instead of internal registers colorschemes.kanagawa = { enable = true; settings = { commentStyle = { italic = true; }; dimInactive = true; terminalColors = true; theme = "wave"; transparent = false; undercurl = true; }; }; # Base16 colorscheme # colorschemes.base16 = { # enable = true; # colorscheme = { # base00 = "#${config.colorScheme.colors.base00}"; # base01 = "#${config.colorScheme.colors.base01}"; # base02 = "#${config.colorScheme.colors.base02}"; # base03 = "#${config.colorScheme.colors.base03}"; # base04 = "#${config.colorScheme.colors.base04}"; # base05 = "#${config.colorScheme.colors.base05}"; # base06 = "#${config.colorScheme.colors.base06}"; # base07 = "#${config.colorScheme.colors.base07}"; # base08 = "#${config.colorScheme.colors.base08}"; # base09 = "#${config.colorScheme.colors.base09}"; # base0A = "#${config.colorScheme.colors.base0A}"; # base0B = "#${config.colorScheme.colors.base0B}"; # base0C = "#${config.colorScheme.colors.base0C}"; # base0D = "#${config.colorScheme.colors.base0D}"; # base0E = "#${config.colorScheme.colors.base0E}"; # base0F = "#${config.colorScheme.colors.base0F}"; # }; # }; opts = { # # ========= General Appearance ========= # background = ""; number = true; # show line numbers relativenumber = true; # show relative linenumbers laststatus = 0; # Display status line always history = 1000; # Store lots of :cmdline history showcmd = true; # Show incomplete cmds down the bottom showmode = true; # Show current mode down the bottom autoread = true; # Reload files changed outside vim lazyredraw = true; # Redraw only when needed showmatch = true; # highlight matching braces ruler = true; # show current line and column visualbell = true; # No sounds listchars = "trail:·"; # Display tabs and trailing spaces visually # ========= Font ========= guifont = "NotoSansMono:h9"; # fontname:fontsize # ========= Cursor ========= guicursor = "n-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20,n-v-i:blinkon0"; # ========= Redirect Temp Files ========= # backup backupdir = "$HOME/.local/state/vim/backup//,/tmp//,."; writebackup = false; # swap directory = "$HOME/.local/vim/swap//,/tmp//,."; # ================ Indentation ====================== autoindent = true; cindent = true; # automatically indent braces smartindent = true; smarttab = true; shiftwidth = 2; softtabstop = 4; tabstop = 2; expandtab = true; # ================ Folds ============================ foldmethod = "indent"; # fold based on indent foldnestmax = 3; # deepest fold is 3 levels foldenable = false; # don't fold by default # ================ Completion ======================= wildmode = "list:longest"; wildmenu = true; # enable ctrl-n and ctrl-p to scroll thru matches # stuff to ignore when tab completing wildignore = "*.o,*.obj,*~,vim/backups,sass-cache,DS_Store,vendor/rails/**,vendor/cache/**,*.gem,log/**,tmp/**,*.png,*.jpg,*.gif"; # ================ Scrolling ======================== scrolloff = 4; # Start scrolling when we're 4 lines away from margins sidescrolloff = 15; sidescroll = 1; # ================ Searching ======================== incsearch = true; hlsearch = true; ignorecase = true; smartcase = true; # ================ Movement ======================== backspace = "indent,eol,start"; # allow backspace in insert mode }; # # ========= UI Plugins ========= # plugins.nvim-colorizer = { enable = true; fileTypes = [ "*" ]; }; plugins.treesitter = { enable = true; }; plugins.lualine = { enable = true; theme = "auto"; componentSeparators = { left = ""; right = ""; }; sectionSeparators = { left = ""; right = ""; }; sections = { lualine_a = [ "mode" ]; lualine_b = [ "branch" "diff" "diagnostics" ]; lualine_c = [ "filename" ]; lualine_x = [ "encoding" "fileformat" "filetype" ]; lualine_y = [ "progress" ]; lualine_z = [ "locations" ]; }; }; # # ========= File Search ========= # plugins.telescope = { # https://github.com/nvim-telescope/telescope.nvim enable = true; extensions.fzy-native.enable = true; }; # ========= File Nav =========== # plugins.harpoon = { enable = true; keymaps = { toggleQuickMenu = "b"; }; }; plugins.nvim-tree = { enable = true; view.width = { min = 30; max = -1; padding = 1; }; disableNetrw = true; filters.dotfiles = true; }; # # ========== Dev Tools ========= # plugins.surround.enable = true; # vim-surround plugins.gitsigns = { enable = true; settings.signs.add = { hl = "GitSignsAdd"; text = " ▎"; numhl = "GitSignsAddNr"; linehl = "GitSignsAddLn"; }; settings.signs.change = { hl = "GitSignsChange"; text = " ▎"; numhl = "GitSignsChangeNr"; linehl = "GitSignsChangeLn"; }; settings.signs.delete = { hl = "GitSignsDelete"; text = " ●"; numhl = "GitSignsDeleteNr"; linehl = "GitSignsDeleteLn"; }; settings.signs.topdelete = { hl = "GitSignsDelete"; text = " ●"; numhl = "GitSignsDeleteNr"; linehl = "GitSignsDeleteLn"; }; settings.signs.changedelete = { hl = "GitSignsChange"; text = " ▎"; numhl = "GitSignsChangeNr"; linehl = "GitSignsChangeLn"; }; }; # Load Plugins that aren't provided as modules by nixvim extraPlugins = builtins.attrValues { inherit (pkgs.vimPlugins) ale vim-numbertoggle# Use relative number on focused buffer only vimade# Dim unfocused buffers vimwiki# Vim Wiki YouCompleteMe# Code completion engine vim-dadbod vim-dadbod-ui # Keep vim-devicons as last entry vim-devicons; }; # ========= Mapleader ========= globals.mapleader = ";"; # # ========= Key binds ========= # keymaps = [ # Switching windows { mode = [ "n" ]; action = "h"; key = ""; options = { silent = true; }; } { mode = [ "n" ]; action = "j"; key = ""; options = { silent = true; }; } { mode = [ "n" ]; action = "k"; key = ""; options = { silent = true; }; } { mode = [ "n" ]; action = "l"; key = ""; options = { silent = true; }; } # Toggle nvim-tree { mode = [ "n" ]; action = "NvimTreeFindFileToggle"; key = "tt"; options = { silent = true; }; } { # clear search highlighting mode = [ "n" ]; key = ""; action = "nohlsearch"; options = { noremap = true; }; } # ========== Telescope Plugin ========= { # find files mode = [ "n" ]; key = "ff"; action = "Telescope find_files"; options = { noremap = true; }; } { # live grep mode = [ "n" ]; key = "fg"; action = "Telescope live_grep"; options = { noremap = true; }; } { # buffers mode = [ "n" ]; key = "fb"; action = "Telescope buffers"; options = { noremap = true; }; } { # help tags mode = [ "n" ]; key = "fh"; action = "Telescope help_tags"; options = { noremap = true; }; } ]; extraConfigVim = '' " ================ Persistent Undo ================== " Keep undo history across sessions, by storing in file. " Only works all the time. if has('persistent_undo') silent !mkdir ~/.vim/backups > /dev/null 2>&1 set undodir=~/.vim/backups set undofile endif " ================ Vim Wiki config ================= " See :h vimwiki_list for info on registering wiki paths let wiki_0 = {} let wiki_0.path = '~/dotfiles.wiki/' let wiki_0.index = 'home' let wiki_0.syntax = 'markdown' let wiki_0.ext = '.md' " fill spaces in page names with _ in pathing let wiki_0.links_space_char = '_' " ================ Ale ======================== " linter and fixer packages have to be installed via AUR or pamac let g:ale_linters = { \ 'c': ['clang-tidy'], \ 'python': ['flake8'], \ 'vim': ['vint'], \ 'markdown': ['markdownlint'], \ } let g:ale_fixers = { \ 'c': ['clang-format'], \ 'javascript': ['prettier', 'eslint'], \ 'json': ['fixjson', 'prettier'], \ 'python': ['black', 'isort'], \ } " Set global fixers for all file types except Markdown " Why? because double spaces at the end of a line in markdown indicate a " linebreak without creating a new paragraph function! SetGlobalFixers() let g:ale_fixers['*'] = ['trim_whitespace', 'remove_trailing_lines'] endfunction augroup GlobalFixers autocmd! autocmd VimEnter * call SetGlobalFixers() augroup END " Set buffer-local fixers for Markdown files augroup MarkdownFixers autocmd! autocmd FileType markdown let b:ale_fixers = ['prettier'] augroup END let g:ale_fix_on_save = 1 ''; }; }