diff --git a/home/neovim/init.lua b/home/neovim/init.lua index 40d2af0..1fd10c1 100644 --- a/home/neovim/init.lua +++ b/home/neovim/init.lua @@ -1,6 +1,4 @@ require('packer').startup(function(use) - use { "williamboman/mason.nvim" } - use { 'VonHeikemen/lsp-zero.nvim', requires = { @@ -23,6 +21,17 @@ require('packer').startup(function(use) } } + use { + 'simrat39/rust-tools.nvim', + requires = { + { 'neovim/nvim-lspconfig' }, + + -- Debugging + { 'nvim-lua/plenary.nvim' }, + { 'mfussenegger/nvim-dap' }, + }, + } + use { 'nvim-treesitter/nvim-treesitter', run = function() require('nvim-treesitter.install').update({ with_sync = true }) end, @@ -52,3 +61,16 @@ lsp.preset('recommended') lsp.setup() require('nvim-treesitter.configs').setup{highlight={enable=true}} + +local rt = require("rust-tools") + +rt.setup({ + server = { + on_attach = function(_, bufnr) + -- Hover actions + vim.keymap.set("n", "", rt.hover_actions.hover_actions, { buffer = bufnr }) + -- Code action groups + vim.keymap.set("n", "a", rt.code_action_group.code_action_group, { buffer = bufnr }) + end, + }, +}) diff --git a/home/neovim/init.lua.bak b/home/neovim/init.lua.bak new file mode 100644 index 0000000..16bb610 --- /dev/null +++ b/home/neovim/init.lua.bak @@ -0,0 +1,20 @@ +-- init.lua + +-- Load custom tree-sitter grammar for org filetype +require('orgmode').setup_ts_grammar() + +-- Tree-sitter configuration +require'nvim-treesitter.configs'.setup { + -- If TS highlights are not enabled at all, or disabled via `disable` prop, highlighting will fallback to default Vim syntax highlighting + highlight = { + enable = true, + disable = {'org'}, -- Remove this to use TS highlighter for some of the highlights (Experimental) + additional_vim_regex_highlighting = {'org'}, -- Required since TS highlighter doesn't support all syntax features (conceal) + }, + ensure_installed = {'org'}, -- Or run :TSUpdate org +} + +require('orgmode').setup({ + org_agenda_files = {'~/Nextcloud/org/*'}, + org_default_notes_file = '~/Nextcloud/org/refile.org', +}) diff --git a/home/neovim/neovim.nix.bak b/home/neovim/neovim.nix.bak new file mode 100644 index 0000000..fea0c4e --- /dev/null +++ b/home/neovim/neovim.nix.bak @@ -0,0 +1,458 @@ +{ pkgs, ... }: +let + config = { + plugins = with pkgs.vimPlugins; [ + vim-colors-solarized + + coc-nvim + coc-rust-analyzer + coc-pyright + coc-go + + # orgmode-nvim + # nvim-treesitter + + ctrlp-vim + editorconfig-vim + vim-gist + goyo-vim + # gopls + neomake + rust-vim + solarized + vim-commentary + vim-dispatch + vim-fugitive + vim-gitgutter + vim-lastplace + vim-nix + vim-polyglot + vim-repeat + # vim-scala + vim-sleuth + vim-surround + vim-trailing-whitespace + # vimtex + vimux + vimwiki + ]; + enable = true; + extraConfig = '' + set background=dark + " allow switching away from unsaved buffers + set hidden + set history=1000 + + set updatetime=300 + + set expandtab + set shiftwidth=2 + set tabstop=2 + + set ignorecase + set smartcase + + set number + set relativenumber + + set backupdir=$HOME/.vim/backupfiles// + set directory=$HOME/.vim/swapfiles// + set undodir=$HOME/.vim/undofiles// + set undofile + + set nocompatible + + filetype plugin indent on + + " always set autoindenting on + set autoindent + " smart indent; stop indent when closing brackets etc + set smartindent + " two spaces after .?! when joining lines + set joinspaces + + " highlight search result + set hlsearch + " incremental search + set incsearch + set nolazyredraw + + " delete whitespace, line break and char using + set backspace=indent,eol,start + " always show curser position + set ruler + + " yank into system clipboard + set clipboard=unnamedplus + + colorscheme solarized + " true color + set termguicolors + " make true colors work in tmux + let &t_8f = "\[38;2;%lu;%lu;%lum" + let &t_8b = "\[48;2;%lu;%lu;%lum" + + " set textwidth=80 + set colorcolumn=+1 + set signcolumn=yes + " highlight current line + set cursorline + + " encoding + set fileencoding=utf-8 + + " break at last word instead of last char + set linebreak + + " autoload file changes + set autoread + + set smarttab + + set softtabstop=2 + set shiftround + + " invisible characters + set list + " set listchars=tab:â\ ,eol:¬,trail:â,extends:â¯,precedes:â® + " set showbreak=⪠+ + " code folding settings + " fold based on syntax + set foldmethod=indent + " don't fold by default + set nofoldenable + set foldlevel=1 + + " smoother redrawing + set ttyfast + " diff with vertical split + set diffopt+=vertical + " show the status line all the time + set laststatus=2 + " keep 5 lines on the screen when scrolling + set scrolloff=5 + " enhanced command line completion + set wildmenu + " Search down into subfolders + " Provides tab-completion for all file-related tasks + set path+=** + + " show incomplete commands + set showcmd + + " complete files like a shell + set wildmode=list:longest + + " command bar height + set cmdheight=1 + " set terminal title + set title + " set shortmess+=TOFwatc + set shortmess+=c + + " show matching braces + set showmatch + " how many tenths of a second to blink + set mat=2 + " set spell langs + set spelllang=de,en + + syntax enable + " let g:polyglot_disabled=['latex'] + " highlight clear SpellBad + " highlight SpellBad cterm=undercurl + + " " Only do this part when compiled with support for autocommands. + " if has("autocmd") + " " Put these in an autocmd group, so that we can delete them easily. + " augroup vimrcEx + " au! + " autocmd FileType text setlocal foldtext< + " augroup END + " endif " has("autocmd") + + " error bells + set errorbells + set visualbell + set timeoutlen=500 + + " turn on manpages (:Man) + runtime ftplugin/man.vim + + " set a map leader for more key combos + let mapleader=',' + + " clear highlighted search + noremap :nohlsearch + + " enable . command in visual mode + vnoremap . :normal . + + " make the highlighting of tabs and other non-text less annoying + highlight SpecialKey ctermbg=none ctermfg=8 + highlight NonText ctermbg=none ctermfg=8 + + " other color for popup + highlight Pmenu ctermbg=gray guibg=gray + + " ctrlp + " order top to bottom + let g:ctrlp_match_window='bottom,order::ttb' + " open files in new buffer + let g:ctrlp_switch_buffer=0 + " use ripgrep if available + if executable('rg') + set grepprg=rg\ --color=never + let g:ctrlp_user_command='rg %s --files -i --color=never --glob ""' + let g:ctrlp_use_caching=0 + endif + + " set textwidth for mails + autocmd FileType mail setlocal textwidth=72 + + " count wraped lines as one line when doing relative jumps + noremap j (v:count == 0 ? 'gj' : 'j') + noremap k (v:count == 0 ? 'gk' : 'k') + + " scroll the viewport faster + nnoremap 3 + nnoremap 3 + + "" Section AutoGroups {{{ + "" file type specific settings + augroup configgroup + autocmd! + + " automatically resize panes on resize + autocmd VimResized * exe 'normal! \=' + autocmd BufWritePost .vimrc,.vimrc.local,init.vim source % + " save all files on focus lost, ignoring warnings about untitled buffers + autocmd FocusLost * silent! wa + + " make quickfix windows take all the lower section of the screen + " when there are multiple windows open + autocmd FileType qf wincmd J + + autocmd! BufWritePost * Neomake + augroup END + " }}} + + " Append modeline after last line in buffer. + " Use substitute() instead of printf() to handle '%%s' modeline in LaTeX files. + function! AppendModeline() + let l:modeline = printf(" vim: set filetype=%s ts=%d sw=%d tw=%d %s :", + \ &filetype, &tabstop, &shiftwidth, &textwidth, &expandtab ? 'et' : 'noet') + let l:modeline = substitute(&commentstring, "%s", l:modeline, "") + call append(line("$"), l:modeline) + endfunction + nnoremap ml :call AppendModeline() + + " netrw settings + " disable banner + let g:netrw_banner=0 + " open in prior window + let g:netrw_browse_split=4 + " open splits to the right + let g:netrw_altv=1 + " treeview + let g:netrw_liststyle=3 + let g:netrw_list_hide=netrw_gitignore#Hide() + let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+' + + " vimux mappings + " Prompt for a command + map vp :VimuxPromptCommand + " Prompt for a make command + map vm :VimuxPromptCommand("make ") + " Inspect runner pane + map vi :VimuxInspectRunner + " Close runner + map vq :VimuxCloseRunner + " Rerun last command + map vv :VimuxRunLastCommand + " Stop running command + map vs :VimuxInterruptRunner + + " close Goyo *and* vim with :q + function! s:goyo_enter() + let b:quitting=0 + let b:quitting_bang=0 + autocmd QuitPre let b:quitting=1 + cabbrev q! let b:quitting_bang=1 q! + endfunction + + function! s:goyo_leave() + " Quit Vim if this is the only remaining buffer + if b:quitting && len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1 + if b:quitting_bang + qa! + else + qa + endif + endif + endfunction + autocmd! User GoyoEnter call goyo_enter() + autocmd! User GoyoLeave call goyo_leave() + + " run rustfmt when saving a file + let g:rustfmt_autosave=1 + + au BufRead,BufNewFile *.sbt set filetype=scala + + " textwidth for emails + au BufRead /tmp/*mutt-* set tw=72 + augroup filetypedetect + " Mail + autocmd BufRead,BufNewFile *mutt-* setfiletype mail + augroup END + + + let g:coc_global_extensions = [ + \ 'coc-explorer', + \ 'coc-snippets', + \ 'coc-pairs' + \ ] + nmap ge :CocCommand explorer + " Use tab for trigger completion with characters ahead and navigate. + " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. + inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + inoremap pumvisible() ? "\" : "\" + + function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' + endfunction + + " Use to trigger completion. + inoremap coc#refresh() + + " Use to confirm completion, `u` means break undo chain at current position. + " Coc only does snippet and additional edit on confirm. + inoremap pumvisible() ? "\" : "\u\" + " Or use `complete_info` if your vim support it, like: + " inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" + + " Use `[g` and `]g` to navigate diagnostics + nmap [g (coc-diagnostic-prev) + nmap ]g (coc-diagnostic-next) + + " Remap keys for gotos + nmap gd (coc-definition) + nmap gy (coc-type-definition) + nmap gi (coc-implementation) + nmap gr (coc-references) + + " Use K to show documentation in preview window + nnoremap K :call show_documentation() + + function! s:show_documentation() + if (index(['vim','help'], &filetype) >= 0) + execute 'h '.expand('') + else + call CocAction('doHover') + endif + endfunction + + " Highlight symbol under cursor on CursorHold + autocmd CursorHold * silent call CocActionAsync('highlight') + + " Remap for rename current word + nmap rn (coc-rename) + + " Remap for format selected region + xmap f (coc-format-selected) + nmap f (coc-format-selected) + + augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') + augroup end + + " Remap for do codeAction of selected region, ex: `aap` for current paragraph + xmap a (coc-codeaction-selected) + nmap a (coc-codeaction-selected) + + " Remap for do codeAction of current line + nmap ac (coc-codeaction) + " Fix autofix problem of current line + nmap qf (coc-fix-current) + + " Create mappings for function text object, requires document symbols feature of languageserver. + xmap if (coc-funcobj-i) + xmap af (coc-funcobj-a) + omap if (coc-funcobj-i) + omap af (coc-funcobj-a) + + " Use for select selections ranges, needs server support, like: coc-tsserver, coc-python + nmap (coc-range-select) + xmap (coc-range-select) + + " Use `:Format` to format current buffer + command! -nargs=0 Format :call CocAction('format') + + " Use `:Fold` to fold current buffer + command! -nargs=? Fold :call CocAction('fold', ) + + " use `:OR` for organize import of current buffer + command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') + + " Add status line support, for integration with other plugin, checkout `:h coc-status` + " set statusline^=%{coc#status()}%{get(b:,'coc_current_function',''')} + + " Using CocList + " Show all diagnostics + nnoremap a :CocList diagnostics + " Manage extensions + nnoremap e :CocList extensions + " Show commands + nnoremap c :CocList commands + " Find symbol of current document + nnoremap o :CocList outline + " Search workspace symbols + nnoremap s :CocList -I symbols + " Do default action for next item. + nnoremap j :CocNext + " Do default action for previous item. + nnoremap k :CocPrev + " Resume latest coc list + nnoremap p :CocListResume + + " properly find root for py projects in workspace + autocmd FileType python let b:coc_root_patterns = ['.git', '.env', 'venv', '.venv', 'setup.cfg', 'setup.py', 'pyproject.toml', 'pyrightconfig.json'] + + " let g:tex_flavor = 'latex' + ''; + # lua << EOF + # ${builtins.readFile ./init.lua} + # EOF + }; +in { + # Note that this doesn’t merge deeply, so you couldn’t add to plugins. For that + # you can use the nixos module system’s mkMerge with + # programs.neovim = lib.mkMerge [ config { vimAlias = true; } ] + + programs.neovim = { + vimAlias = true; + viAlias = true; + coc = { + enable = true; + settings = { + "rust-analyzer.serverPath" = "${pkgs.rust-analyzer}/bin/rust-analyzer"; + "gopls.experimentalWorkspaceModule" = true; + }; + }; + } // config; + # programs.vim = config; + + # xdg.configFile."nvim/coc-settings.json".text = builtins.toJSON { + # # "go.goplsPath" = "${gopls}/bin/gopls"; + # }; + +}