--- /dev/null
+{ config, pkgs, ... }:
+{
+ programs.neovim = {
+ enable = true;
+ defaultEditor = true;
+ plugins = with pkgs.vimPlugins; [
+ # fzfWrapper
+ # fzf-vim
+ formatter-nvim
+ goyo-vim
+ vim-visual-multi
+ nvim-lspconfig
+ blink-cmp
+ telescope-nvim
+ undotree
+ which-key-nvim
+ guess-indent-nvim
+ ];
+ extraConfig = ''
+ set number
+ set relativenumber
+ set tabstop=4
+ set shiftwidth=4
+ set expandtab
+ set foldmethod=marker
+ set autoindent
+ set smartindent
+ filetype plugin indent on
+ set signcolumn=yes
+
+ colorscheme habamax
+
+ nnoremap <Down> gj
+ nnoremap <Up> gk
+ vnoremap <Down> gj
+ vnoremap <Up> gk
+ inoremap <Down> <C-o>gj
+ inoremap <Up> <C-o>gk
+ tnoremap <Esc> <C-\><C-n>
+ map <Space> <Leader>
+ nnoremap <Esc> :noh<CR>
+ nnoremap gr :Telescope lsp_references<CR>
+ nnoremap gd :Telescope lsp_definitions<CR>
+ nnoremap <leader>u :UndotreeToggle<CR> :UndotreeFocus<CR>
+ nnoremap <leader>f :Telescope find_files<CR>
+ nnoremap <leader>b :Telescope buffers<CR>
+ nnoremap <leader>e :Telescope diagnostics<CR>
+ nnoremap <leader>g :Telescope live_grep<CR>
+ nnoremap <leader>s :Telescope lsp_document_symbols<CR>
+ nnoremap <leader>r :lua vim.lsp.buf.rename()<CR>
+ nnoremap <leader>n :bnext<CR>
+ nnoremap <leader>m :bprevious<CR>
+ noremap <leader>y "+y<CR>
+ noremap <leader>p "+p<CR>
+ noremap <leader><S-y> "+<S-y><CR>
+ noremap <leader><S-p> "+<S-p><CR>
+
+ " Format on save
+ " augroup FormatAutogroup
+ " autocmd!
+ " autocmd BufWritePost * FormatWrite
+ " augroup END
+
+ " enter insert mode when opening terminal
+ autocmd TermOpen * startinsert
+
+ " Return to last opened position
+ autocmd BufReadPost *
+ \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit'
+ \ | exe "normal! g`\""
+ \ | endif
+
+ " Use persistent history.
+ if !isdirectory("/tmp/.vim-undo-dir")
+ call mkdir("/tmp/.vim-undo-dir", "", 0700)
+ endif
+ set undodir=/tmp/.vim-undo-dir
+ set undofile
+ '';
+ extraLuaConfig = ''
+ vim.lsp.enable('zls')
+ vim.lsp.enable('clangd')
+ vim.lsp.config('zuban', {})
+ vim.lsp.enable('zuban')
+ require('guess-indent').setup {}
+ local actions = require("telescope.actions")
+ require('telescope').setup {
+ defaults = {
+ mappings = {
+ i = { ["<esc>"] = actions.close },
+ }
+ }
+ }
+ require('formatter').setup {
+ logging = true,
+ log_level = vim.log.levels.WARN,
+ filetype = {
+ c = { require("formatter.filetypes.c").clangformat },
+ cpp = { require("formatter.filetypes.cpp").clangformat },
+ zig = { require("formatter.filetypes.zig").zigfmt },
+ markdown = { require("formatter.filetypes.markdown").denofmt },
+ }
+ }
+ require('blink.cmp').setup {
+ keymap = {
+ preset = 'none',
+
+ ['<C-space>'] = { 'show', 'show_documentation', 'hide_documentation' },
+ ['<C-e>'] = { 'hide', 'fallback' },
+ ['<CR>'] = { 'accept', 'fallback' },
+
+ ['<Tab>'] = { 'select_next', 'fallback_to_mappings' },
+ ['<S-Tab>'] = { 'select_prev', 'fallback_to_mappings' },
+
+ ['<C-p>'] = { 'scroll_documentation_up', 'fallback' },
+ ['<C-n'] = { 'scroll_documentation_down', 'fallback' },
+
+ ['<C-k>'] = { 'show_signature', 'hide_signature', 'fallback' },
+ },
+ completion = {
+ list = { selection = { preselect = false, } },
+ documentation = {
+ auto_show = true,
+ -- treesitter_highlighting = false,
+ },
+ },
+ signature = { enabled = true },
+ }
+ '';
+ };
+}