" --------------------------------------------------------------------------------------------------------------------- " ==> .vimrc " --------------------------------------------------------------------------------------------------------------------- " ==> Some settings from Vim Zero: https://www.oliversherouse.com/posts/vim_zero.html " syntax enable filetype plugin on " General let mapleader = '\' set autoread " set to auto read when a file is changed from the outside set belloff=all " no sound/flash on errors set cursorcolumn " highlight current column set cursorline " highlight current row set formatoptions-=rot " Turn off autoinsert of comment char on newline set hidden " Allow background buffers without saving set nolist " do not show invisible characters set nocompatible " be iMproved, required set number " turn on line numbers set path+=** " Search Globally set relativenumber " lines are numbered relative to current line set ruler " show cursor poition set scrolloff=10 " number of lines to keep above and below the cursor set showmatch " show matching brackets when text indicator is over them set splitright " Split to right by default if !has('nvim') set term=xterm-256color " LOTS of colors endif set wildmenu " enhanced command line completion set fillchars=vert:\|,fold:.,diff:- " Text Wrapping set colorcolumn= " disable colorzing column set nowrap " turn off word wrapping at " Search and Substitute set gdefault " use global flag by default in s: commands set hlsearch " highlight searches set ignorecase " ignore case in searches set incsearch " make search act like search in modern browsers set smartcase " don't ignore capitals in searches " Tabs set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab autocmd! bufwritepost .vimrc source ~/.vimrc " When vimrc is edited, reload it " Turn line numbers on/off for active/inactive buffers augroup BgHighlight autocmd! autocmd WinEnter * set number autocmd WinEnter * set relativenumber autocmd WinLeave * set nonumber autocmd WinLeave * set norelativenumber augroup end " Toggle invisible characters with set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:< noremap :set list! inoremap :set list! cnoremap :set list! " Enable Omnicomplete features set omnifunc=syntaxcomplete#Complete " Personal Notes settings " export NOTES_DIR= before use " Go to index of notes and set working directory nnoremap nn :e $NOTES_DIR/index.md:cd $NOTES_DIR " [ to grep inside Notes files " I got the idea from here [step 6: search contents of your notes](https://www.edwinwenink.xyz/posts/42-vim_notetaking/#step-6-search-contents-of-your-notes) command! -nargs=1 Ngrep vimgrep "" $NOTES_DIR/**/*.md | copen nnoremap [ :Ngrep " --------------------------------------------------------------------------------------------------------------------- " ==> Plugins with VimPlug " A minimalist Vim plugin manager " https://github.com/junegunn/vim-plug if has("win32") call plug#begin('~/vimfiles/plugged') else call plug#begin('~/.vim/plugged') endif " Think of sensible.vim as one step above 'nocompatible' mode: a universal set of defaults that (hopefully) everyone can agree on " https://github.com/tpope/vim-sensible Plug 'tpope/vim-sensible' " One stop shop for vim colorschemes " https://github.com/flazz/vim-colorschemes Plug 'flazz/vim-colorschemes' " Command Line Fuzzy Finder " https://github.com/junegunn/fzf Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'junegunn/fzf.vim' " Fugitive is the premier Vim plugin for Git. Or maybe it's the premier Git plugin for Vim? Either way, " it's so awesome, it should be illegal. That's why it's called Fugitive " https://github.com/tpope/vim-fugitive Plug 'tpope/vim-fugitive' " Vim surround " I tried to do this from scratch, but it seems this is the best alternative " https://github.com/tpope/vim-surround Plug 'tpope/vim-surround' " Vim Markdown " Suggestions from [Writing Markdown in Vim](https://codeinthehole.com/tips/writing-markdown-in-vim/) " [Vim Markdown](https://github.com/preservim/vim-markdown) Plug 'godlygeek/tabular' Plug 'preservim/vim-markdown' " Vim Spellsync " Magically rebuild Vim spell files if word lists are modified outside of Vim " https://github.com/micarmst/vim-spellsync Plug 'micarmst/vim-spellsync' " Vim Bullets " I tried for too long to get Martkdown bullet to work right. " https://github.com/bullets-vim/bullets.vim Plug 'bullets-vim/bullets.vim' " Vim Airline " Lean & mean status/tabline for vim that's light as air. " https://github.com/vim-airline/vim-airline Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' " vim-signify " https://github.com/mhinz/vim-signify Plug 'mhinz/vim-signify' call plug#end() " --------------------------------------------------------------------------------------------------------------------- " ==> Plugin Options " Options and overrides for installed plugins " Vim Markdown " Markdown syntax highlighting for specified languages let g:markdown_fenced_languages = ['html', 'python', 'ini', 'vim', 'bash', 'yaml'] " Set default conceallevel to hide links and some formatting set conceallevel=0 " strikethrough let g:vim_markdown_strikethrough = 1 " follow anchors - allow to follow anchors just like links let g:vim_markdown_follow_anchor = 1 " turn off auto-bullets and indent so `gq` works correctly let g:vim_markdown_auto_insert_bullets=0 let g:vim_markdown_new_list_item_indent=0 let g:vim_markdown_frontmatter = 1 let g:vim_markdown_folding_disabled = 1 " Open folds by default au BufWinEnter * normal zR " bullets-vim let g:bullets_enabled_file_types = [ 'markdown', 'gitcommit' ] let g:bullets_outline_levels = ['num', 'abc', 'std*', 'std+', 'std-'] "vim-airline let g:airline_extensions = ['hunks', 'branch', 'tabline'] let g:airline_detect_theme_from_guicolors = 1 let g:airline_powerline_fonts = 1 " --------------------------------------------------------------------------------------------------------------------- " ==> FZF Helper Functions " " Configure FZF default key bindings (actions) within the FZF window " 'ctrl-x': Open in horizontal split " 'ctrl-v': Open in vertical split " 'ctrl-t': Open in new tab (optional, common) " 'ctrl-p': Paste raw filename(s) at cursor " 'ctrl-l': Paste formatted [[wiki link]] at cursor " NOTE: Define these functions BEFORE they are used in g:fzf_action below. " Function to paste FZF selection(s) at the current cursor position function! PasteFzfSelection(lines) if type(a:lines) != type([]) || empty(a:lines) echoerr "FZF Paste Error: No selection passed to function PasteFzfSelection." return endif " Join multiple selections with a space let text_to_paste = join(a:lines, ' ') " Insert the text call feedkeys('i' . text_to_paste . "\", 'ni') endfunction " Function to paste FZF selection as a formatted wiki link function! PasteFzfWikiLink(lines) if type(a:lines) != type([]) || empty(a:lines) echoerr "FZF Paste Error: No selection passed to function PasteFzfWikiLink." return endif " Typically you only link one file at a time let filename = a:lines[0] " --- CHOOSE YOUR LINK FORMAT --- " Option 1: Wiki format [[filename_without_extension]] "let filename_base = fnamemodify(filename, ':r') " Removes the extension "let link_text = '[[' . filename_base . ']]' " Option 2: Wiki format [[filename_with_extension]] let link_text = '[[' . filename . ']]' " Option 3: Markdown format [filename](filename) " let link_text = '[' . filename . '](' . filename . ')' " --- End Formatting Options --- " Insert the formatted link call feedkeys('i' . link_text . "\", 'ni') endfunction let g:fzf_action = { \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit', \ 'ctrl-t': 'tab split', \ 'ctrl-p': function('PasteFzfSelection'), \ 'ctrl-l': function('PasteFzfWikiLink') \ } " --------------------------------------------------------------------------------------------------------------------- " => Keymaps: Highlights " to toggle search highlight nnoremap :nohls " to toggle row/column highlight nnoremap :set cursorline! cursorcolumn! " --------------------------------------------------------------------------------------------------------------------- " ==> Keymaps: Buffers & Panes " -arrow left/right to navigate BUFFERS map [1;5D :bp map [1;5C :bn " b to open FZF buffers map b :Buffers " m to open file marks map m :Marks " a to abandon buffer nnoremap a :bd! " c to close buffer nnoremap c :bd " to save buffer nnoremap :w " -arrow keys to navigate panes " UP map [1;3A " DOWN map [1;3B " LEFT map [1;3D " RIGHT map [1;3C " CLOSE map x q " --------------------------------------------------------------------------------------------------------------------- " ==> Keymaps " to open FZF files map :Files " g to open FZF Git files map g :GFiles " Map f to open FZF with word under cursor pre-populated " https://github.com/junegunn/fzf.vim/issues/1235#issuecomment-773726008 nnoremap f :call fzf#run(fzf#vim#with_preview(fzf#wrap({'source': 'find . \( -name .git -o -name .stversions \) -prune -o -print -iname "*'.expand("").'*"', 'sink': 'e', 'options': '--query="'.expand("").'"'}))) " Toggles line wrapping with linebreak enabled when wrapping is turned on with w nnoremap w :execute "if &wrap\n set nowrap\nelse\n set wrap linebreak\nendif" " Toggle line numbers nnoremap n :set number! relativenumber! " --------------------------------------------------------------------------------------------------------------------- " ==> Keymaps: Text bubbling (http://vimcasts.org/episodes/bubbling-text/) " Bubble single lines nmap ddkP nmap ddp " Bubble multiple lines vmap xkP`[V`] vmap xp`[V`] " --------------------------------------------------------------------------------------------------------------------- " ==> Keymaps: Movement keys " Navigate according to displayed lines, not physical lines nnoremap j gj nnoremap k gk " --------------------------------------------------------------------------------------------------------------------- " ==> Keymaps: Date and Time stamps " Send date and time imap =strftime("%Y-%m-%d %H:%M:%S") " Send date and DOW imap =strftime("%Y-%m-%d %a") " alternate keybinding I use in VS Code imap =strftime("%Y-%m-%d %a") " Sends date imap =strftime("%Y-%m-%d") " --------------------------------------------------------------------------------------------------------------------- " ==> Spellcheck " auto-complete spelling suggestions with set complete+=kspell autocmd FileType markdown setlocal complete+=kspell autocmd FileType text setlocal complete+=kspell autocmd FileType gitcommit setlocal complete+=kspell " Toggle spell check highlights with nnoremap :setlocal spell! spelllang=en_us " ==> Spellcheck: only certain file types " https://robots.thoughtbot.com/vim-spell-checking " turn on for markdown files autocmd BufRead,BufNewFile *.md setlocal spell " turn on for text files autocmd BufRead,BufNewFile *.txt setlocal spell " turn on for git commits autocmd FileType gitcommit setlocal spell spelllang=en_us " ==> Spellcheck Colors " " I hate spellcheck's default colors " (http://stackoverflow.com/questions/6008921/how-do-i-change-the-highlight-style-in-vim-spellcheck) " Vim Colors: (http://alvinalexander.com/linux/vi-vim-editor-color-scheme-syntax) hi clear SpellBad hi clear SpellCap hi clear SpellLocal hi clear SpellRare hi SpellCap cterm=underline ctermbg=none hi SpellBad cterm=underline ctermbg=none hi SpellLocal cterm=underline ctermbg=none hi SpellRare cterm=underline ctermbg=none " --------------------------------------------------------------------------------------------------------------------- " ==> Templates: markdown documents with frontmatter (.md) autocmd BufNewFile *.md so $HOME/.vim/templates/mdfm autocmd BufNewFile *.md exe "g/^filecreated:.*/s//filecreated: " .strftime("%Y-%m-%d") autocmd BufNewFile *.md exe "normal Go" autocmd BufWritePre,filewritepre *.md execute "normal! ma" autocmd BufWritePre,filewritepre *.md exe "g/^fileupdated:.*/s//fileupdated: " .strftime("%Y-%m-%d") autocmd BufWritePost,filewritepost *.md execute "normal! `a" " --------------------------------------------------------------------------------------------------------------------- " ==> Templates: shell scripts (.sh) autocmd BufNewFile *.sh so $HOME/.vim/templates/sh autocmd BufNewFile *.sh :%s/filename/\=expand('%:t:r')/g autocmd BufNewFile *.sh exe "g/CREATED:.*/s//CREATED: " .strftime("%Y-%m-%d") autocmd BufNewFile *.sh exe "normal Go" autocmd BufWritePre,filewritepre *.sh execute "normal ma" autocmd BufWritePre,filewritepre *.sh exe "g/UPDATED:.*/s//UPDATED: " .strftime("%Y-%m-%d") autocmd bufWritePost,filewritepost *.sh execute "normal `a" " --------------------------------------------------------------------------------------------------------------------- " ==> Snippets " Pasting pre-made things " section banner nnoremap ,ban :-1read $HOME/.vim/templates/bannerjA " section begin/end nnoremap ,begend :-1read $HOME/.vim/templates/begendjA " section shell script header nnoremap ,sh :0read $HOME/.vim/templates/sh :1dd :4%s/filename/\=expand('%:t')/g " section readinglist header nnoremap ,rl :0read $HOME/.vim/templates/rlfm zR :1dd " section markdown file header nnoremap ,md :0read $HOME/.vim/templates/mdfm zR :1dd " --------------------------------------------------------------------------------------------------------------------- " ==> NetrwTreeListing readonly fix (https://vi.stackexchange.com/a/13012) " Per default, netrw leaves unmodified buffers open. This autocommand " deletes netrw's buffer once it's hidden (using ':q', for example) autocmd FileType netrw setl bufhidden=delete " --------------------------------------------------------------------------------------------------------------------- " ==> yaml stuff (https://lornajane.net/posts/2018/vim-settings-for-working-with-yaml) " autocmd BufNewFile,BufReadPost *.{yaml,yml} set filetype=yaml foldmethod=manual autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab " Abbreviations " Correcting common misspellings iab couljd could iab wouljd would iab monring morning iab teh the iab adn and iab form from iab wiht with iab becuase because iab definately definitely iab seperate separate " --------------------------------------------------------------------------------------------------------------------- " ==> Colors " Term GUI Colors " colorscheme replaced by ~/.vimcustom " If there is a file at ~/.vimcustom, the colorscheme defined in that file " will be applied. If not, colorscheme defaults to 'darkburn' " --------------------------------------------------------------------------------------------------------------------- " ==> Source Local Customizations and Set Colorscheme let s:custom_config_path = expand('$HOME/.vimcustom') if filereadable(s:custom_config_path) execute 'source' fnameescape(s:custom_config_path) else colorscheme darkburn endif