set nocompatible set encoding=utf-8 set modelines=0 " for security set mouse="" set backspace=indent,eol,start au FocusLost * :wa " Leader ====---- nnoremap ,, , let mapleader="," noremap ; ; noremap ; : " Highlighting ====---- syntax on filetype plugin indent on "set t_Co=256 " force enable 256-color mode. if &t_Co >= 256 || has("gui_running") let base16colorspace=256 endif colorscheme base16-default-dark if &t_Co > 2 || has("gui_running") syntax on endif " Indentation ====---- set shiftwidth=2 set tabstop=2 set expandtab set shiftround " use multiple of shiftwidth with '<' and '>' set autoindent set copyindent " copy the previous line's indentation xnoremap < >gv " Search ====---- set incsearch set hlsearch set wrapscan set ignorecase " ignore case when searching set smartcase " ignore case if search pattern is all lowercase, " case-sensitive otherwise nnoremap :noh " Case insensitive nmap * /\<=expand('')\> nmap # ?\<=expand('')\> set showmatch noremap % " Screen ====---- "set nowrap set wrap "set textwidth=79 "set formatoptions=tqrn1 set colorcolumn=85 set number set relativenumber set cursorline set shortmess=aoOstTWAI set title " change the terminal's title set scrolloff=3 set visualbell " don't beep set noerrorbells " don't beep set list set listchars=tab:»\ ,extends:›,precedes:‹,nbsp:·,trail:· "autocmd filetype html,xml set listchars-=tab:>. set wildmenu set wildmode=longest:full,full set wildignore=*.swp,*.bak,*.pyc,*.class set ttyfast hi ColorColumn ctermbg=18 hi Folded ctermbg=0 ctermfg=12 " Statusline ====---- function! StatusGitInfo() let git = gitbranch#name() if git != '' return ' '.git else return '' endfunction "set ruler set showmode set showcmd set laststatus=2 set statusline= "set statusline+=\ S%{strftime('%R',\ getftime(expand('%')))} " Time when last saved set statusline+=%1*\ %2*%<\ " Cut at start set statusline+=%3*%f " Path set statusline+=%{&modified?'\ +':''} " Modified set statusline+=%{&ro?'\ ':''} " Read only set statusline+=%{&paste?'\ P':''} " Paste mode "set statusline+=[%n%H%M%R%W]\ " flags and buf no set statusline+=\ %4*%=%3*\ " Section break set statusline+=%{&ff=='unix'?'':toupper(&ff.'\ ')} " Line ending set statusline+=%l\ %c\ %P\ " Line column percent set statusline+=%2*%1*%{StatusGitInfo()}\ " Git branch "█ ^Vue0b0 hi StatusLineNC ctermfg=020 ctermbg=019 cterm=NONE hi User1 ctermfg=020 ctermbg=019 hi User2 ctermfg=019 ctermbg=018 hi User3 ctermfg=020 ctermbg=018 hi User4 ctermfg=018 ctermbg=000 " Stop using arrow keys ====---- " noremap " noremap " noremap " noremap " nnoremap j gj " nnoremap k gk set whichwrap+=<,>,h,l,[,] " Splits ====---- nnoremap w vl nnoremap h nnoremap j nnoremap k nnoremap l " History ====---- set history=1000 " remember more commands and search history set undolevels=1000 " use many muchos levels of undo if !isdirectory($HOME."/.vim") call mkdir($HOME."/.vim", "", 0770) endif if !isdirectory($HOME."/.vim/undo-dir") call mkdir($HOME."/.vim/undo-dir", "", 0700) endif set undodir=~/.vim/undo-dir set undofile " !!!! ADD THIS TO CRONTAB " 43 0 * * 3 find /home/adam/.vim/undo-dir -type f -mtime +90 -delete set nobackup set noswapfile " Note: swap helps large files. " Custom mappings ====---- " Quickly edit/reload the vimrc file nnoremap ve :tabe $MYVIMRC nnoremap vs :so $MYVIMRC nnoremap :set invpaste paste? set pastetoggle= nnoremap W :%s/\s\+$//:let @/='' nnoremap ft Vatzf nnoremap S ?{jV/^\s*\}?$k:sort:noh nnoremap q gqip nnoremap vp `[V`] nnoremap h :syntax sync fromstart nnoremap l :nohlsearch:diffupdate:syntax sync fromstart nnoremap [ :put! =repeat(nr2char(10), v:count1)'[ nnoremap ] :put =repeat(nr2char(10), v:count1) noremap y "+y noremap yy "+Y noremap p :set paste:put +:set nopaste vnoremap p "_dP noremap + :s/^\s*/&\/\//:noh noremap - :s/^\(\s*\)\/\//\1/:noh vnoremap Q gq nnoremap Q gqap "cnoremap w!! %!sudo tee % >/dev/null cnoremap cnoremap " helper function to toggle hex mode function! ToggleHex() " hex mode should be considered a read-only operation " save values for modified and read-only for restoration later, " and clear the read-only flag for now let l:modified=&mod let l:oldreadonly=&readonly let &readonly=0 let l:oldmodifiable=&modifiable let &modifiable=1 if !exists("b:editHex") || !b:editHex " save old options let b:oldft=&ft let b:oldbin=&bin " set new options setlocal binary " make sure it overrides any textwidth, etc. let &ft="xxd" " set status let b:editHex=1 " switch to hex editor %!xxd else " restore old options let &ft=b:oldft if !b:oldbin setlocal nobinary endif " set status let b:editHex=0 " return to normal editing %!xxd -r endif " restore values for modified and read only state let &mod=l:modified let &readonly=l:oldreadonly let &modifiable=l:oldmodifiable endfunction command! -bar Hexmode call ToggleHex() nnoremap H :Hexmode function! NumberToggle() if(&relativenumber == 1) set norelativenumber else set relativenumber endif endfunc nnoremap N :call NumberToggle() "autocmd InsertEnter * :set norelativenumber "autocmd InsertLeave * :set relativenumber " Custom functions ====---- if filereadable(expand("~/.vimrc.local")) source ~/.vimrc.local endif function! SetLocalOptions(fname) let dirname = fnamemodify(a:fname, ":p:h") while "/" != dirname let lvimrc = dirname . "/.vimrc.local" if filereadable(lvimrc) execute "source " . lvimrc break endif let dirname = fnamemodify(dirname, ":p:h:h") endwhile endfunction au BufNewFile,BufRead * call SetLocalOptions(bufname("%")) " To move elsewhere ====---- au BufNewFile,BufRead *.less set filetype=less autocmd! BufWritePost $MYVIMRC source $MYVIMRC autocmd! BufRead,BufNewFile *.md set filetype=markdown autocmd! BufRead,BufNewFile *.md set spell packadd! matchit