" Settings """"""""""""""""""""""""""" " Leave boomer mode set nocompatible set history=1000 " Backspace in insert mode set backspace=indent,eol,start " Hide buffer when abandoned (you can gd away, etc) set hid " Searching " NOTE: ignorecase and smartcase must be used together (see :h 'smartcase') set incsearch gdefault ignorecase smartcase nohlsearch " Only auto-continue comments when i_ is pressed (not n_o) " Must be set after :filetype-plugin-on filetype plugin indent on au FileType * setlocal fo-=o fo+=r " Enable syntax highlighting syn on " Colorscheme " au VimEnter * ++nested colorscheme ansi_linus " Persistent undo set undofile " Line numbers set number relativenumber " Improve macro performance set lazyredraw " Show matching brackets set showmatch set matchtime=2 set listchars=tab:>-,eol:$,space:.,trail:@,nbsp:% " Enable mouse input for all modes but visual. " " I disable mouse in visual mode so I can select text in the terminal using " the mouse. This is useful when copying text from a remote instance of vim " SSH session where "* doesn't work. set mouse=nicr " sussy sus the sussy sus set nowrap " Mappings """"""""""""""""""""""""""" let g:mapleader = "\" " Some keys are hard to press with the Danish layout. Luckily, we have some " spare keys! Note that ctrl and esc are swapped at the OS level. nnoremap æ $ nnoremap Æ 0 " Switching windows " TODO: make this work with iTerm2 panes nnoremap nnoremap nnoremap nnoremap " tnoremap " tnoremap " tnoremap " tnoremap " Resize windows nnoremap + + nnoremap - - " Switching tabs nnoremap tt :tabnext nnoremap tn :tabnew nnoremap to :tabonly nnoremap tc :tabclose nnoremap tm :tabmove " Just use gt and gT " nnoremap tl :tabn " nnoremap th :tabN nnoremap t :tabl nnoremap t :tabr " Fast macros (qq to record) nnoremap Q @q vnoremap Q :norm! @q " Make Y act like C and D nnoremap y$ vnoremap $y " Indent using tab key nnoremap >l nnoremap >gv vnoremap noremap! noremap! noremap! " Toggle showing 'listchars' nnoremap l :set list! " Escape in terminal mode tnoremap " Seamlessly enter/leave terminal buffer. tnoremap au BufEnter term://* norm! i " Join to end of line below " This is already used by the window switching mappings " nnoremap ddpkJ " Commands """"""""""""""""""""""""""" " Create a temporary buffer " NOTE: relied on by other commands command Temp new | setlocal buftype=nofile bufhidden=wipe noswapfile nomodified nobuflisted command TempTab tabnew | setlocal buftype=nofile bufhidden=wipe noswapfile nomodified nobuflisted " Reverse lines command! -bar -range=% Reverse ,g/^/m-1|nohl " Redraw screen " CTRL-L mapping is used in other thing command Redraw norm! " Run buffer contents as vimscript command! -bar -range=% Run execute 'silent!' . . ',' . . 'y|@"' " Output the result of a command to the buf command! -nargs=+ -complete=command Output \ redir => output | \ silent execute | \ redir END | \ tabnew | \ setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted nomodified | \ silent put=output | \ if =~ ':!' | \ silent 1,2delete _ | \ else | \ silent 1,4delete _ | \ endif " Copy buffer to system clipboard command! Copy silent w !pbcopy " Copy the location of the current file command! CopyDir !echo %:r | pbcopy " View in-memory changes before writing to disk command! DiffOnDisk \ let orig_filetype=&ft | \ vert new | \ read ++edit # | 0d_ | \ setlocal bt=nofile bh=wipe nobl noswf ro | \ let &l:filetype = orig_filetype | \ diffthis | \ wincmd p | \ diffthis " Miscellaneous """"""""""""""""""""""""""" " Show the color column only if insert mode (and only if cc is set) augroup ShowCCInInsertMode au! au InsertEnter * if &tw != 0 | let &cc = &tw + 1 | endif au InsertLeave * let &cc = 0 augroup END " Auto-refresh vim config " au BufWritePost $XDG_CONFIG_HOME/*.{vim,lua} so % " Jump to last editing location when opening files au BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal! g'\"" | \ endif augroup Sus au! " Add syntax groups if relevant. This conditional is compensating for " the lack of negative matches in :au. " " See: https://vim.fandom.com/wiki/Highlight_unwanted_spaces " See: https://stackoverflow.com/questions/6496778/vim-run-autocmd-on-all-filetypes-except fun! s:AddSyntax() if bufname() !~ 'term://\|man://' " Any trailing whitespace at the end of lines. syn match SusWhitespace /\s\+$/ containedin=ALL " Any non-breaking spaces. These are generated by " CMD+SPACE and deeply annoying. syn match SusWhitespace /\%u00A0/ containedin=ALL " Any characters beyond the maximum width of the text. if &tw > 0 exe 'syn match SusWhitespace /\%' . &tw . 'v.\+/ containedin=ALL' endif endif endfun " Remove highligt group. " " Note that we have to do abit more work since the the syntax rules " have changed under Vim's nose. Hopefully the perfomance " characteristics don't come back to haunt us. fun! s:RemoveSyntax() syn clear SusWhitespace syn sync fromstart endfun " Add a persistent highligt group, which matches are going to use. au VimEnter,ColorScheme * hi SusWhitespace ctermbg=red guibg=red " Create some persistent syntax highlighting groups. au Syntax * call s:AddSyntax() " Temporarily remove the groups when in insert mode. au InsertEnter * call s:RemoveSyntax() au InsertLeave * call s:AddSyntax() augroup END