From 91eba850f62f3f6b2abd3585da7ca31752a2bc5f Mon Sep 17 00:00:00 2001 From: Matthew Lemon Date: Sun, 4 Jun 2023 09:43:27 +0100 Subject: Big vim consolidation - cleaner, less config, no bs --- vim/vimrc | 576 +++++++++++--------------------------------------------------- 1 file changed, 101 insertions(+), 475 deletions(-) diff --git a/vim/vimrc b/vim/vimrc index b36fc34..c9b4846 100644 --- a/vim/vimrc +++ b/vim/vimrc @@ -1,125 +1,71 @@ -set nocompatible -syntax on "turn syntax highlighting on -filetype plugin indent on "load plugin and indent files associated a detected filetype - -" macro to go to end of sentence and add a line break (for -" one-line-per-sentence vimming...) -let @s = ")i\\\" - -" Open vimrc -nnoremap ev sjL:e $MYVIMRC +syntax on +filetype plugin on +filetype indent on " leader let maplocalleader = "\\" -let mapleader = " " - -" Function to allow adding a line of text to taskwarrior -function! TaskWarriorAddCurrentLine() - let current_line = getline('.') - silent execute ":!task add " . shellescape(current_line) - redraw! - echo "Task added: " . current_line - delete -endfunction - -nnoremap q :call TaskWarriorAddCurrentLine() +let mapleader = "," +set nocompatible +set scrolloff=1 +set history=799 +set wildignore=**/__pycache*/** +set wildoptions=pum +set wildmenu +set wildchar= +set showmatch +set ruler +set showcmd +set nohlsearch +set incsearch +set ignorecase +set smartindent +set smartcase +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 +set splitbelow +set noswapfile +set nobackup +set splitright +set autoindent +set expandtab +set hidden +set path+=** +set relativenumber +set number +set more +set signcolumn=yes +set colorcolumn=0 +set equalalways +set showmode +set listchars=tab:»→,trail:␣ +set shortmess+=c +set tags+=./tags +set background=dark +set completeopt=menuone,longest -" redirect any output to a scratch buffer -" from https://gist.github.com/romainl/eae0a260ab9c135390c30cd370c20cd7 -function! Redir(cmd, rng, start, end) - for win in range(1, winnr('$')) - if getwinvar(win, 'scratch') - execute win . 'windo close' - endif - endfor - if a:cmd =~ '^!' - let cmd = a:cmd =~' %' - \ ? matchstr(substitute(a:cmd, ' %', ' ' . shellescape(escape(expand('%:p'), '\')), ''), '^!\zs.*') - \ : matchstr(a:cmd, '^!\zs.*') - if a:rng == 0 - let output = systemlist(cmd) - else - let joined_lines = join(getline(a:start, a:end), '\n') - let cleaned_lines = substitute(shellescape(joined_lines), "'\\\\''", "\\\\'", 'g') - let output = systemlist(cmd . " <<< $" . cleaned_lines) - endif - else - redir => output - execute a:cmd - redir END - let output = split(output, "\n") - endif - vnew - let w:scratch = 1 - setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile - call setline(1, output) -endfunction - -" This command definition includes -bar, so that it is possible to "chain" Vim commands. -" Side effect: double quotes can't be used in external commands -command! -nargs=1 -complete=command -bar -range Redir silent call Redir(, , , ) - -" This command definition doesn't include -bar, so that it is possible to use double quotes in external commands. -" Side effect: Vim commands can't be "chained". -command! -nargs=1 -complete=command -range Redir silent call Redir(, , , ) - -" big from https://gist.github.com/romainl/047aca21e338df7ccf771f96858edb86 -nnoremap ;s :g//# -function! CCR() - let cmdline = getcmdline() - if cmdline =~ '\v\C^(ls|files|buffers)' - " like :ls but prompts for a buffer command - return "\:b" - elseif cmdline =~ '\v\C/(#|nu|num|numb|numbe|number)$' - " like :g//# but prompts for a command - return "\:" - elseif cmdline =~ '\v\C^(dli|il)' - " like :dlist or :ilist but prompts for a count for :djump or :ijump - return "\:" . cmdline[0] . "j " . split(cmdline, " ")[1] . "\\" - elseif cmdline =~ '\v\C^(cli|lli)' - " like :clist or :llist but prompts for an error/location number - return "\:sil " . repeat(cmdline[0], 2) . "\" - elseif cmdline =~ '\C^old' - " like :oldfiles but prompts for an old file to edit - set nomore - return "\:sil se more|e #<" - elseif cmdline =~ '\C^changes' - " like :changes but prompts for a change to jump to - set nomore - return "\:sil se more|norm! g;\" - elseif cmdline =~ '\C^ju' - " like :jumps but prompts for a position to jump to - set nomore - return "\:sil se more|norm! \\" - elseif cmdline =~ '\C^marks' - " like :marks but prompts for a mark to jump to - return "\:norm! `" - elseif cmdline =~ '\C^undol' - " like :undolist but prompts for a change to undo - return "\:u " - else - return "\" - endif -endfunction -cnoremap CCR() +" colorscheme goes here, outside source control +source ~/.vim/ephemera.vim +highlight SignColumn guibg=blue ctermbg=black +" macro to go to end of sentence and add a line break (for +" one-line-per-sentence vimming...) +let @s = ")i\\\" +" i don't bother with folding, but it's here if i need it. +if has('folding') + set foldmethod=marker + set foldmarker=#\ {{{,#\ }}} + set viewoptions=folds,options,cursor,unix,slash +endif -" encryptio) method when using :X -set cm=blowfish2 +" disable folding by default with vim-markdown +let g:vim_markdown_folding_disabled = 1 -" Underline the current line, based on its length. -noremap ul mmyypVr-`m -" -" Show the 'list' characters. -noremap ls :set list! +" Open vimrc +nnoremap ev sjL:e $HOME/.vim/vimrc -" Remove double- or single-quotes, or graves wrapped around a string. -noremap rdq mmF"xf"x`m -noremap rsq mmF'xf'x`m -noremap rg mmF`xf`x`m - " Jump up or down by 10 lines. noremap J 10j noremap K 10k @@ -129,87 +75,69 @@ if (exists("*strftime")) noremap date "=strftime("%F")p9h noremap time "=strftime("%X")p7h endif -" -" Execute the current line with BASH. -noremap rl :.w !bash -" Run the current file with PERL, Python, BASH, or a Bourne Shell derivative. -noremap rpl :!clear; perl % -noremap rpy :!clear; python % -noremap rb :!clear; bash % -noremap rs :!clear; sh % +" Place timestamps, be it date (YYYY-MM-DD) or time (HH:MM:SS). +if (exists("*strftime")) + noremap date "=strftime("%F")p9h + noremap time "=strftime("%X")p7h +endif + +"keymap for Fern +nnoremap ;f :Fern . -drawer -" essential plugins call plug#begin() +"Plug 'vim-scripts/AutoComplPop' Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' -" Plug 'sheerun/vim-polyglot' +Plug 'lambdalisue/fern.vim' +Plug 'junegunn/goyo.vim' +Plug 'sheerun/vim-polyglot' Plug 'preservim/vim-markdown' Plug 'mhinz/vim-signify' Plug 'vim-test/vim-test' Plug 'ledger/vim-ledger' -" Plug 'jlanzarotta/bufexplorer' -Plug 'tpope/vim-fugitive' Plug 'fatih/vim-go', {'do': ':GoUpdateBinaries' } Plug 'tpope/vim-dispatch' +Plug 'tpope/vim-surround' Plug 'tpope/vim-commentary' -"Plug 'ycm-core/YouCompleteMe' -"Plug 'jayli/vim-easycomplete' -" Plug 'rose-pine/vim' +Plug 'tpope/vim-unimpaired' +Plug 'tpope/vim-fugitive' Plug 'SirVer/UltiSnips' Plug 'honza/vim-snippets' -" Plug 'dense-analysis/ale' -" Plug 'davidhalter/jedi-vim' call plug#end() -" easycomplete -"let g:easycomplete_tab_trigger="" +" Make :grep use ripgrep +if executable('rg') + set grepprg=rg\ --color=never\ --vimgrep +endif -" jedi-vim -let g:jedi#goto_command = "d" -let g:jedi#goto_assignments_command = "g" -let g:jedi#goto_stubs_command = "s" -let g:jedi#goto_definitions_command = "" -let g:jedi#documentation_command = "K" -let g:jedi#usages_command = "n" -let g:jedi#completions_command = "" -let g:jedi#rename_command = "r" -let g:jedi#rename_command_keep_name = "R" +" and search with ripgrep +command! -bang -nargs=* Rg + \ call fzf#vim#grep( + \ 'rg --column --line-number --no-heading --color=always --ignore-case '.shellescape(), 1, + \ 0 ? fzf#vim#with_preview('up:60%') + \ : fzf#vim#with_preview('right:50%:hidden', '?'), + \ 0) -" " YCM -" let g:ycm_enable_inlay_hints = 1 -" nnoremap h (YCMToggleInlayHints) -" nnoremap gd :YcmCompleter GoToDefinition -" nnoremap gr :YcmCompleter GoToReferences -" nnoremap K :YcmCompleter GetDoc -" " this will disable tab, allowing it to be used for ultisnips -" let g:ycm_key_list_select_completion = ['', ''] -" let g:ycm_key_list_previous_completion = ['', ''] -" let g:ycm_python_interpreter_path = '.venv/bin/python3' -" let g:ycm_auto_trigger = 0 -" let g:ycm_enable_inlay_hints = 0 -" let g:ycm_python_sys_path = [] -" let g:ycm_show_diagnostics_ui = 0 -" let g:ycm_extra_conf_vim_data = [ -" \ 'g:ycm_python_interpreter_path', -" \ 'g:ycm_python_sys_path' -" \] -" let g:ycm_global_ycm_extra_conf = '~/.global_extra_conf.py' -" nnoremap jd :YcmCompleter GoTo -" imap (YCMToggleSignatureHelp)'. +nnoremap a :Rg +" Generate ctags for current working directory +nnoremap tt :silent !ctags -R . :redraw! +" notes stuff - from https://www.edwinwenink.xyz/posts/43-notes_tagging/ +" Go to index of notes and set working directory to my notes +nnoremap ni :e $NOTES_DIR/index.md:cd $NOTES_DIR -" snippets -" Trigger configuration. You need to change this to something other than if you use one of the following: -" - https://github.com/Valloric/YouCompleteMe -" - https://github.com/nvim-lua/completion-nvim -let g:UltiSnipsExpandTrigger="" -let g:UltiSnipsJumpForwardTrigger="" -let g:UltiSnipsJumpBackwardTrigger="" +" 'Notes Grep' with ripgrep (see grepprg) +" -i case insensitive +" -g glob pattern +" ! to not immediately open first search result +command! -nargs=1 Ngrep :silent grep! "" -i -g '*.md' $NOTES_DIR | execute ':redraw!' +nnoremap nn :Ngrep -" If you want :UltiSnipsEdit to split your window. -let g:UltiSnipsEditSplit="vertical" +" Open quickfix list in a right vertical split (good for Ngrep results) +command! Vlist botright vertical copen | vertical resize 50 +nnoremap v : Vlist " vim-test nmap tn :TestNearest @@ -222,229 +150,13 @@ let test#python#pytest#options = '-q -s' let test#python#runner = 'pytest' let test#vimterminal#term_position = "belowright" -" to run tests automatically -"augroup test -" autocmd! -" autocmd BufWrite * if test#exists() | -" \ TestFile | -" \ endif -"augroup END - -" set shell=/bin/sh -" set t_Co=0 " this is supposed to remove colours -set hi=500 -set scrolloff=0 -" set novisualbell -"set relativenumber "show line numbers -set wildignore=**/__pycache*/** -set wildmenu "enable a menu that shows tab completion options in the status bar -set wildchar= -set showmatch "highlights matching brackets on cursor hover -set ruler "show cursor position in status bar -set showcmd "shows the normal mode command before it gets executed -set encoding=utf-8 -set fileformats=unix,dos,mac -set nohlsearch "highlights searches -set incsearch "incremental search (searches character by character) -set ignorecase "ignores the case of a search -set smartindent -set autoindent -set smartcase "only ignores case if there are no capital letters in search (only works after ignorecase has been set) -set tabstop=4 "the amount of spaces that vim will equate to a tab character -set softtabstop=4 "like tabstop, but for editing operations (insert mode) -set splitbelow " split horiz below -set noswapfile -set splitright " split new to the right when doing vertical -set shiftwidth=4 "used for autoindent and << and >> operators in normal mode -set autoindent "copies indent from current line to the next line -set expandtab "tabs will expand to whitespace characters -set esckeys "allows function keys to be recognized in Insert mode -set ttimeoutlen=20 "timeout for a key code mapping -set timeoutlen=1000 "time(ms) to wait for key mappings -set hidden -set t_Co=256 -"set t_Co=0 - switches off all colours -set path+=** -set more -set colorcolumn=0 -set equalalways -set showmode -set nobackup -set listchars=tab:»→,trail:␣ -if executable('ag') - set grepprg=ag\ --vimgrep\ --nogroup\ --nocolor -endif - -" From Practical Vim p101 - Easy expansion of Active File Directory -cnoremap %% getcmdtype() == ':' ? expand('%:h').'/' : '%%' - -" i don't bother with folding, but it's here if i need it. -if has('folding') - set foldmethod=marker - set foldmarker=#\ {{{,#\ }}} - set viewoptions=folds,options,cursor,unix,slash -endif - -" from https://www.reddit.com/r/vim/comments/f5gi2g/vim_notetaking_automatic_link_creation_between/ -" copies a link from file from previous buffer for pasting into -" next buffer with "ap -function! s:copy_filename_as_mdlink() - let fname=expand("%") - let @a="[" . fname . "](./" . fname. ")" -endfunction -autocmd BufLeave * call s:copy_filename_as_mdlink() - -" Ultisnips -let g:UltiSnipsExpandTrigger="" -let g:UltiSnipsJumpForwardTrigger="" -let g:UltiSnipsJumpBackwardTrigger="" -set completefunc=UltiSnips#Complete - - -" vim-test -" use vim-dispatch to run tests in the quickfix window -" from Modern Vim Ch.4 -" the mappings below are from vim-test -" https://github.com/vim-test/vim-test -" dispatch opens send test output to quickfix window -let test#strategy = "basic" -let test#python#runner = "pytest" -let test#vim#term_position = "topleft 10" -let test#python#pytest#options = '--tb=short' -let test#go#runner = 'gotest' -"let test#go#gotest#options = '-v' -" To run mypy using vim-dispath -with Dispatch -autocmd FileType python let b:dispatch = 'mypy --ignore-missing-imports' - -" Set wrap option for Markdown files -autocmd FileType markdown setlocal linebreak - -" test -nmap tn :TestNearest -nmap ts :TestSuite -nmap tf :TestFile -nmap :TestLast -nmap t :TestVisit - -" disable folding by default with vim-markdown -let g:vim_markdown_folding_disabled = 1 -" -" ALE ale config -let g:ale_enabled = 0 -let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' -let g:ale_sign_error = '✘' -let g:ale_sign_warning = '⚠' -let g:ale_lint_on_text_changed = 0 -let g:ale_hover_cursor = 0 -let g:ale_virtualtext_cursor = 'disabled' -let g:ale_sign_column_always = 1 -let g:ale_open_list = 0 -let g:ale_set_highlights = 1 -let g:ale_set_signs = 1 -let g:ale_set_loclist = 1 -let g:ale_set_quickfix = 0 -let g:ale_echo_cursor = 1 -let g:ale_echo_msg_error_str = 'Error' -let g:ale_echo_msg_format = '%linter% - %code: %%s' -let g:ale_loclist_msg_format = '%linter% - %code: %%s' -let g:ale_echo_msg_warning_str = 'Warning' -let g:ale_linters = {'python': ['flake8', 'mypy'], -\ 'ocaml': ['merlin'], -\ 'cpp': ['clang'], -\ 'yaml': ['yamllint'], -\ 'c': ['clang'], -\ 'go': ['gopls', 'golint', 'gofmt'], - \} -let g:ale_fixers = { -\ 'python': ['isort', 'yapf', 'black'], -\ 'go': ['gofmt'], -\ 'rust': ['rustfmt'] -\ } -let g:ale_python_mypy_ignore_invalid_syntax = 1 -let g:ale_python_mypy_executable = 'mypy' -let g:ale_python_mypy_options = '--config-file mypy.ini' -" let g:ale_sign_error = '>>' -let g:ale_fix_on_save = 1 -let g:ale_linters_explicit = 0 - -" Python - keybindings -nnoremap Ts :setlocal makeprg=pytest\ -q\ % -nnoremap Tf :setlocal makeprg=flake8\ % -nnoremap Tb :setlocal makeprg=black\ % -nnoremap Tm :setlocal makeprg=mypy\ --ignore-missing-imports\ % -" then run the one set with this... -nnoremap Tt :make! - " clear search highlights nnoremap :noh:call clearmatches() -" previews in netrw -let g:netrw_preview = 1 - -" journal stuff -autocmd BufNewFile,BufReadPost *.md map jj :r! date +" - \%H:\%M: "kJA$ -autocmd BufNewFile,BufReadPost *.md map jd :r! date +"(\%Y-\%m-\%dT\%H:\%M)"i - -syntax on "turn syntax highlighting on -filetype plugin indent on "load plugin and indent files associated a detected filetype runtime macros/matchit.vim "allows jumping between brackets with % in normal mode -" Go stuff -let g:go_highlight_fields = 1 -let g:go_highlight_functions = 1 -let g:go_highlight_function_calls = 1 -let g:go_highlight_extra_types = 1 -let g:go_highlight_operators = 1 -let g:go_doc_keywordprg_enabled = 1 -let g:go_list_height = 0 -let g:go_highlight_operators = 1 -let g:go_highlight_function_parameters = 1 -let g:go_doc_max_height = 50 -let g:go_doc_popup_window = 1 -let g:go_list_height = 10 - - -" vim-go debugger window settings -let g:go_debug_windows = { - \ 'vars': 'leftabove 40vnew', - \ 'stack': 'leftabove 20new', - \ 'goroutines': 'botright 10new', - \ 'out': 'botright 5new', -\ } - -" vim-go and gopls -let g:go_def_mode='gopls' -let g:go_info_mode='gopls' -let g:go_play_browser_command = 'firefox %URL% &' -let g:go_test_show_name = 1 -let g:go_auto_type_info = 1 -let test#go#runner = 'gotest' -let g:go_term_mode = "split" -let g:go_term_height = 50 -let g:go_highlight_fields = 1 -let g:go_highlight_functions = 1 - -"autocmd FileType go nmap r :w:split terminal go run % -autocmd FileType go nmap R :GoRun -" highlights the variable in the file for you.. -"let g:go_auto_sameids = 1 -" auto import... -let g:go_fmt_command = "goimports" -" automatic type info on cursor -let g:go_auto_type_info = 2 -let g:go_snippet_engine = "ultisnips" -au Filetype go nmap ga (go-alternate-edit) -au Filetype go nmap gah (go-alternate-split) -au Filetype go nmap gav (go-alternate-vertical) -au Filetype go nmap gaf (go-fmt) -au Filetype go nmap gal (go-lint) -au Filetype go nmap gbx (go-deps) -au FileType go nmap :GoTestFunc -short -au FileType go nmap :GoTest -short -au FileType go nmap :DlvToggleBreakpoint -au FileType go nmap :DlvTest -au FileType go nmap :DlvDebug -au FileType go nmap :GoRename +" remap :W to :w - :W was previous Windows in fzf +command! W w " FZF " This is the default extra key bindings @@ -474,14 +186,6 @@ let g:fzf_colors = " (https://github.com/zenbro/dotfiles/blob/master/.nvimrc#L151-L187) let g:fzf_nvim_statusline = 0 " disable statusline overwriting - " copy the path of the current file into the system clipboard -"nnoremap y :let @+=expand('%:p'):call system("true"):let @"=@+:echo "File path copied to clipboard: " . @+ -nnoremap y :let @*=expand('%:p'):call system("true"):let @+=@*:echo "File path copied to clipboard: " . @+ - -" Alternatively, format is as Markdown link -nnoremap Y :let @+=printf("[%s](%s)", expand('%:t'), "file://" . expand('%:p')):call system("true"):let @"=@+:echo "Markdown link copied to clipboard: " . @+ - -" command history is :History: nnoremap :GFiles! nnoremap :FZF! nnoremap t :Files @@ -498,81 +202,3 @@ nnoremap Y :let @+=printf("[%s](%s)", expand('%:t'), "file://" . expand( nnoremap CC :Commands imap (fzf-complete-file-ag) imap (fzf-complete-line) - -" remap :W to :w - :W was previous Windows in fzf -command! W w - -" ghetto note system -" Go to index of notes -nnoremap ni :e $NOTES_DIR/index.md:cd $NOTES_DIR -" Depends on grepprg being set to rg -command! -nargs=1 Ngrep grep "" -g "*.md" $NOTES_DIR -nnoremap nn :Ngrep - -" open quicklist vertical -command! Vlist botright vertical copen | vertical resize 50 -nnoremap v :Vlist - -" Search with ripgrep -command! -bang -nargs=* Rg - \ call fzf#vim#grep( - \ 'rg --column --line-number --no-heading --color=always --ignore-case '.shellescape(), 1, - \ 0 ? fzf#vim#with_preview('up:60%') - \ : fzf#vim#with_preview('right:50%:hidden', '?'), - \ 0) - -nnoremap a :Rg - -"" Quick Editing vimrc -nnoremap ev sjL:e $MYVIMRC - -" syntax enable -let g:solarized_termcolors=256 -let g:gruvbox_termcolors=256 -let g:gruvbox_contrast_dark='hard' -let g:gruvbox_contrast_light='hard' -let g:gruvbox_hls_cursor='orange' -let g:gruvbox_sign_column='bg0' -let g:gruvbox_number_column='bg0' -let g:gruvbox_invert_signs='0' -let g:gruvbox_improved_strings='0' -set background=dark -"colorscheme hipster -" colorscheme rosepine - -" manual highlights -" highlight Visual ctermfg=black ctermbg=LightMagenta -" highlight SignColumn ctermbg=black ctermfg=white -" highlight Comment ctermfg=DarkGray -" highlight DiffAdd term=bold ctermfg=yellow ctermbg=black -" highlight DiffDelete term=bold ctermfg=red ctermbg=black -" highlight DiffChange term=bold ctermfg=black ctermbg=DarkGreen - -augroup general - autocmd! - "keep equal proportions when windows resized - autocmd VimResized * wincmd = - "save cursor position in a file - autocmd BufReadPost * if line("'\"") > 1 && line("'\"") - \ <= line("$") | exe "normal! g'\"" | endif -augroup END - -augroup languages - autocmd! - autocmd BufNewFile,BufRead *.bash set syntax=sh - autocmd FileType python xnoremap r :'<,'>:w !python3 - autocmd FileType go set noexpandtab - autocmd FileType html :syntax sync fromstart - autocmd FileType html,javascript,css,json,yaml,sh - \ setlocal ts=2 sts=2 sw=2 expandtab -augroup END - -" Switching off colours -syntax off -set nohlsearch -set background=dark -set cursorline -"set cursorcolumn -set visualbell -highlight clear -highlight Visual term=reverse cterm=reverse gui=reverse -- cgit v1.2.3