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 " leader let maplocalleader = "\\" let mapleader = " " " encryption method when using :X set cm=blowfish2 " Underline the current line, based on its length. noremap ul mmyypVr-`m " " Show the 'list' characters. noremap ls :set list! " 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 " 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 " " 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 % " essential plugins call plug#begin() Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.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 'tpope/vim-dispatch' Plug 'tpope/vim-commentary' "Plug 'ycm-core/YouCompleteMe' "Plug 'jayli/vim-easycomplete' Plug 'rose-pine/vim' Plug 'SirVer/UltiSnips' Plug 'honza/vim-snippets' Plug 'dense-analysis/ale' Plug 'davidhalter/jedi-vim' call plug#end() " easycomplete "let g:easycomplete_tab_trigger="" " 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" " " 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)'. " 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="" " If you want :UltiSnipsEdit to split your window. let g:UltiSnipsEditSplit="vertical" " vim-test nmap tn :TestNearest nmap tf :TestFile nmap ts :TestSuite nmap tl :TestLast nmap tv :TestVisit let test#strategy = "basic" 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 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('rg') set grepprg=rg\ --color=never\ --vimgrep 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 " FZF " This is the default extra key bindings let g:fzf_action = { \ 'ctrl-t': 'tab split', \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit' } " - FZF Popup window (center of the screen) let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } " Customize fzf colors to match your color scheme let g:fzf_colors = \ { 'fg': ['fg', '#f8f8f2'], \ 'bg': ['bg', '#282a36'], \ 'hl': ['fg', '#bd93f9'], \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], \ 'hl+': ['fg', 'Statement'], \ 'info': ['fg', '#ffb86c'], \ 'prompt': ['fg', '#50fa7b'], \ 'pointer': ['fg', 'Exception'], \ 'marker': ['fg', 'Keyword'], \ 'spinner': ['fg', '#ffb86c'], \ 'header': ['fg', '#6272a4'] } " More fzf settings " (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 nnoremap o :Tags nnoremap h :History nnoremap 0 :Files nnoremap ; :BLines nnoremap l :Lines nnoremap o :BTags nnoremap bu :Buffers nnoremap ? :History: " nnoremap / :execute 'Ag ' . input('Ag/') nnoremap ft :Filetypes nnoremap CC :Commands imap (fzf-complete-file-ag) imap (fzf-complete-line) " remap :W to :w - :W was previous Windows in fzf cnoreabbrev 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