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\\\" " leader let maplocalleader = "\\" let mapleader = " " " 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 'jayli/vim-easycomplete' 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 'rose-pine/vim' Plug 'SirVer/UltiSnips' Plug 'honza/vim-snippets' Plug 'dense-analysis/ale' call plug#end() " easycomplete nnoremap gr :EasyCompleteReference nnoremap gd :EasyCompleteGotoDefinition nnoremap rn :EasyCompleteRename nnoremap gb :BackToOriginalBuffer let g:easycomplete_diagnostics_enable = 1 let g:easycomplete_signature_enable = 1 let g:easycomplete_tabnine_enable = 1 let g:easycomplete_cursor_word_hl = 1 let g:easycomplete_scheme = "blue" let g:easycomplete_menu_skin = { \ "buf": { \ "kind":"羅", \ "menu":"[B]", \ }, \ "snip": { \ "kind":"", \ "menu":"[S]", \ }, \ "dict": { \ "kind":"", \ "menu":"[D]", \ }, \ "tabnine": { \ "kind":"", \ }, \ } let g:easycomplete_sign_text = { \ 'error': "", \ 'warning': "", \ 'information': '', \ 'hint': '' \ } let g:easycomplete_filetypes = {"r": { \ "whitelist": [] \ }} let g:easycomplete_tabnine_config = { \ 'line_limit': 800, \ 'max_num_result': 10, \ } let g:easycomplete_lsp_type_font = { \ 'class': "", 'color': "", \ 'constant': "", 'constructor': "", \ 'enum': "", 'enummember': "", \ 'field': "料", 'file': '', \ 'folder': "", 'function': "ƒ", \ 'interface': "", 'keyword': "", \ 'snippet': "", 'struct': "פּ", \ 'text': "", 'typeparameter': "", \ 'variable': "", 'module':'', \ 'event': '', \ 'r':'', 't':'', \ 'f':'', 'c':'', \ 'u':'𝘶', 'e':'𝘦', \ 's':'פּ', 'v':'', \ 'i':'𝘪', 'm':'', \ 'p':'', 'k':'𝘬', \ 'o':"𝘰", 'd':'𝘥', \ 'l':"𝘭", 'a':"𝘢", \ } " python let g:python3_host_prog = '/usr/bin/python3' " 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 = ['', ''] " 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 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 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="" " YouCompleteMe let g:ycm_python_interpreter_path = '.venv/bin/python3' let g:ycm_python_sys_path = [] 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 " 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_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 = 1 let g:ale_enabled = 1 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': ['ruff', 'flake8', 'mypy'], \ 'ocaml': ['merlin'], \ 'cpp': ['clang'], \ 'yaml': ['yamllint'], \ 'c': ['clang'], \ 'go': ['gopls', 'golint', 'gofmt'], \} let g:ale_fixers = { \ 'python': ['ruff', '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) " 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 rose-pine " 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