forked from mio/scripts
		
	
		
			
				
	
	
		
			398 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			398 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
| " Basic settings -------------------------------------------------------------
 | |
| 
 | |
| set shell=/bin/bash             " Set default shell
 | |
| set encoding=utf-8              " Set file encoding to UTF-8
 | |
| set nomodeline                  " Disable modeline (run code on file open)
 | |
| set nocompatible                " Reset vi compatibility presets
 | |
| set backspace=indent,eol,start  " Enable backspace key in insert mode
 | |
| 
 | |
| syntax on                       " Enable syntax highlighting
 | |
| set clipboard=unnamedplus       " Use system clipboard
 | |
| set textwidth=79                " Column width to 79
 | |
| set colorcolumn=79              " Set column to highlight for textwidth
 | |
| set wrap                        " Visual/soft line wrap
 | |
| set linebreak                   " Only insert breaks on breakat chars
 | |
| set nolist                      " Disable line break, see:
 | |
| set wrapmargin=0                " vim.wikia.com > tip 989
 | |
| set autoindent                  " Auto-indent on line break
 | |
| set smartindent                 " Smart indent
 | |
| set shiftwidth=2                " Set indentation
 | |
| set tabstop=2
 | |
| set softtabstop=2
 | |
| set expandtab                   " Convert tab to spaces
 | |
| set shiftround                  " Indent in multiples of shiftwidth
 | |
| set cursorline                  " Highlight current line
 | |
| set title                       " Show file title
 | |
| set number                      " Show line numbers
 | |
| set ruler                       " Show cursor position
 | |
| set showbreak=↪                 " Show line breaks
 | |
| set showmatch                   " Show matching opening/closing char
 | |
| set showcmd                     " Show command used (bottom bar)
 | |
| set showmode                    " Show current mode (bottom bar)
 | |
| set wildmenu                    " Enable menu for autocomplete options
 | |
| set wildmode=list:longest,full  " List matches by longest common sections, all
 | |
| set wildignore=*.tmp,*~         " Exclude some filetypes from wildmenu
 | |
| set splitbelow                  " Horizontal split below
 | |
| set splitright                  " Vertical split to the right
 | |
| set hidden                      " Switch between buffers without save prompt
 | |
|                                 " To autosave: :set autowrite or autowriteall
 | |
| set foldenable                  " Enable code folding
 | |
| set foldmethod=indent           " See :h foldmethod for other options
 | |
| set foldlevelstart=10           " 0 = all folds closed, 99 = all folds open
 | |
| set lazyredraw                  " No redraw when running macros
 | |
| set cryptmethod=blowfish        " Set default encryption method
 | |
| set history=1000                " Set no. of lines in undo history
 | |
| set viminfo=                    " Disable viminfo
 | |
|                                 " To move viminfo to ~/.vim instead:
 | |
|                                 " set viminfo+=n~/.vim/viminfo
 | |
| set noswapfile                  " Disable *.swp files
 | |
| set noerrorbells                " Disable sounds
 | |
| set visualbell
 | |
| set t_vb=
 | |
| set incsearch                   " Start searching on input
 | |
| set nohlsearch                  " Disble search highlighting
 | |
| set ignorecase                  " Ignore case in search for lowercase input
 | |
| set smartcase                   " Case-sensitive search for mixed case input
 | |
| set spelllang=en_gb             " Set spell check language
 | |
| set timeoutlen=2000             " Set timeout (ms) for key mappings
 | |
| set autochdir                   " Change into a file's directory on open
 | |
| colorscheme gruvbox             " See :color <tab> for options
 | |
| set background=dark             " Set light/dark bg for themes that use it
 | |
| 
 | |
| 
 | |
| " Highlight trailing whitespace
 | |
| " https://vi.stackexchange.com/q/8563
 | |
| highlight ExtraWhitespace guibg=#870000 ctermbg=088
 | |
| match ExtraWhitespace /\s\+$\|\t/
 | |
| augroup ExtraWhitespace
 | |
|   au!
 | |
|   au BufWinEnter * match ExtraWhitespace /\s\+$/
 | |
|   au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
 | |
|   au InsertLeave * match ExtraWhitespace /\s\+$/
 | |
| augroup END
 | |
| 
 | |
| if !has('gui_running')
 | |
|   set t_Co=256                  " Use 256 colorscheme in terminal mode
 | |
|   set mouse=n                   " Disable mouse support
 | |
| endif
 | |
| 
 | |
| " Omni Complete
 | |
| set omnifunc=syntaxcomplete#Complete    " Enable autocompletion
 | |
| set complete=".,b,i"                    " Include current buffer, current file
 | |
|                                         " other loaded buffers
 | |
| set dictionary+=~/.vim/dict/other       " Set custom dict
 | |
| 
 | |
| 
 | |
| " Key mappings ---------------------------------------------------------------
 | |
| 
 | |
| " Set <leader> key
 | |
| let mapleader=','
 | |
| 
 | |
| " Move to beginning/end of line
 | |
| nmap b 0
 | |
| nmap e $
 | |
| 
 | |
| " Move to prev/next visual row
 | |
| nmap j gj
 | |
| nmap k gk
 | |
| 
 | |
| " Keep indent block selected
 | |
| " https://github.com/bling/dotvim
 | |
| vmap < <gv
 | |
| vmap > >gv
 | |
| 
 | |
| " Remap ctrl+d to toggle between shell and vim
 | |
| nmap <c-d> :sh<cr>
 | |
| 
 | |
| " Disable ctrl+z to avoid accidentally stopping vim
 | |
| nmap <c-z> <nop>
 | |
| 
 | |
| " Move page down/up
 | |
| nmap <c-j> <c-f>
 | |
| nmap <c-k> <c-b>
 | |
| 
 | |
| " Buffer navigation — go to N, prev, next, left, right
 | |
| nmap <leader>bg :ls<cr>:b
 | |
| nmap <leader>bh :bprev<cr>
 | |
| nmap <leader>bl :bnext<cr>
 | |
| nmap <space>[ <c-w>h<cr>
 | |
| nmap <space>] <c-w>l<cr>
 | |
| 
 | |
| " Buffer width resize — decrease, increase
 | |
| nmap <leader>b- :vertical res -5<cr>
 | |
| nmap <leader>b= :vertical res +5<cr>
 | |
| 
 | |
| " Buffer loading — close, new (vsplit), reload, new (same split)
 | |
| nmap <leader>bc :bw<cr>
 | |
| nmap <leader>bn :enew<cr>
 | |
| nmap <leader>br :e<cr>
 | |
| nmap <leader>bv <c-w>v:enew<cr>
 | |
| 
 | |
| " Backup file in current buffer
 | |
| nmap <leader>bk :call BackupFile()<cr>
 | |
| 
 | |
| " Map delete to a black hole register (separate from cut/paste register)
 | |
| map <leader>d "_d
 | |
| 
 | |
| " Map expression register (used to evaluate expressions)
 | |
| imap <leader>ee <c-r>=
 | |
| 
 | |
| " Code folding — collapse all, expand all, toggle current fold
 | |
| nmap <leader>fc zM<cr>
 | |
| nmap <leader>fe zR<cr>
 | |
| nmap <leader>ft za<cr>
 | |
| 
 | |
| " Git commands
 | |
| nmap <leader>ga :!git add .<cr>
 | |
| nmap <leader>gb :!git branch -b
 | |
| nmap <leader>gc :!git commit -m
 | |
| nmap <leader>gca :!git commit<cr>
 | |
| nmap <leader>gco :!git checkout
 | |
| nmap <leader>gd :!git diff<cr>
 | |
| nmap <leader>gf :!git fetch<cr>
 | |
| nmap <leader>gg :!git grep
 | |
| nmap <leader>gl :!git log<cr>
 | |
| nmap <leader>gm :!git merge<cr>
 | |
| nmap <leader>gph :!git push<cr>
 | |
| nmap <leader>gpl :!git pull<cr>
 | |
| nmap <leader>gs :!git status<cr>
 | |
| 
 | |
| " New markdown note
 | |
| nmap <leader>md :call AddNewFile('$HOME/', '', 'md')<cr>
 | |
| 
 | |
| " Toggle netrw browser
 | |
| nmap <silent> <leader>nt :call ToggleNetrw()<cr>
 | |
| 
 | |
| " Map OmniComplete
 | |
| imap <leader>o <c-x><c-o>
 | |
| 
 | |
| " Insert paste into file from cat input
 | |
| " https://stackoverflow.com/a/2545242
 | |
| nmap <leader>pp :r! cat<cr>
 | |
| 
 | |
| " Search for selection, prompt for replacement, replace all in file
 | |
| " https://stackoverflow.com/a/31172452
 | |
| vnoremap <leader>sa "0y<esc>:%s/<c-r>0//g<left><left>
 | |
| " Prompt for search/replace text, replace all in selection
 | |
| vnoremap <leader>sr :s///g<left><left><left>
 | |
| 
 | |
| " Toggle spell check
 | |
| nmap <leader>sc :setl spell!<cr>
 | |
| 
 | |
| " Search in current directory
 | |
| nmap <leader>sd :!grep -R  <left>
 | |
| 
 | |
| " Toggle search term highlighting
 | |
| nmap <leader>sh :set nohlsearch!<cr>
 | |
| 
 | |
| " Sessions — load (waits for file input), save
 | |
| nmap <leader>sl :source $HOME/.vim/sessions/
 | |
| nmap <leader>ss :mksession! $HOME/.vim/sessions/
 | |
| 
 | |
| " Tab navigation — close, prev, next, new
 | |
| " To go directly to tab n: [n]gt
 | |
| nmap <leader>tc :tabc<cr>
 | |
| nmap <leader>th :tabp<cr>
 | |
| nmap <leader>tl :tabn<cr>
 | |
| nmap <leader>tn :tabe<cr>
 | |
| 
 | |
| " Edit/refresh to apply vimrc changes
 | |
| nmap <leader>ve :tabe $MYVIMRC<cr>
 | |
| nmap <leader>vr :source $MYVIMRC<cr>
 | |
| 
 | |
| " Show word count
 | |
| " https://unix.stackexchange.com/a/145293
 | |
| nmap <leader>wc g<c-g><cr>
 | |
| vmap <leader>wc :s/\S\+//gn<cr>
 | |
| 
 | |
| " Trim leading whitespace
 | |
| " https://unix.stackexchange.com/a/29619
 | |
| " To reset cursor at first selected line: vmap <leader>wsl :%le<cr>
 | |
| vmap <leader>wl :normal 0dw<cr>
 | |
| 
 | |
| " Trim trailing whitespace
 | |
| " http://oualline.com/vim-cook.html#trim
 | |
| " https://vim.fandom.com/wiki/Remove_unwanted_spaces
 | |
| nmap <leader>wst :1,$s/[ <tab>]*$//<cr>
 | |
| vmap <leader>wst :s/\s\+$//<cr>
 | |
| 
 | |
| 
 | |
| " Netrw
 | |
| " ----------------------------------------------------------------------------
 | |
| 
 | |
| " Settings
 | |
| let g:netrw_banner = 0          " Hide info header
 | |
| let g:netrw_browse_split = 3    " 0: reuse window, 1: hsplit, 2: vsplit,
 | |
|                                 " 3: new tab, 4: previous window
 | |
| let g:netrw_dirhistmax = 0      " 0: disable history/bookmarks
 | |
| let g:netrw_keepdir = 0         " Sync dir view and change dir paths
 | |
| let g:netrw_liststyle = 0       " 0: thin, 1: long, 2: wide, 3: tree
 | |
| let g:netrw_winsize = 25        " Set pane width
 | |
| 
 | |
| " Set the default path for the scratchpad used by buffer functions
 | |
| " Default path: ~/.vim/scratchpad
 | |
| let g:scratch_dir = 'scratchpad'
 | |
| 
 | |
| " Map keys within the file browser
 | |
| " https://vonheikemen.github.io/devlog/tools/using-netrw-vim-builtin-file-explorer/
 | |
| fun! MapNetrwKeys()
 | |
|   " Toggle hidden file visibility
 | |
|   nmap <buffer> . gh
 | |
|   " Files — copy, delete, move, rename, select
 | |
|   nmap <buffer> fc mc
 | |
|   nmap <buffer> fd D
 | |
|   nmap <buffer> fm mm
 | |
|   nmap <buffer> fr R
 | |
|   nmap <buffer> v mf
 | |
|   " Go back in history
 | |
|   nmap <buffer> h u
 | |
|   " Close file preview buffer
 | |
|   nmap <buffer> P <C-w>z
 | |
| endfun
 | |
| 
 | |
| aug netrw_keymaps
 | |
|   au!
 | |
|   autocmd filetype netrw call MapNetrwKeys()
 | |
| augroup END
 | |
| 
 | |
| " Toggle the file browser
 | |
| " https://stackoverflow.com/questions/5006950/setting-netrw-like-nerdtree
 | |
| fun! g:ToggleNetrw()
 | |
|   Lexplore
 | |
|   vertical resize 25
 | |
| endfun
 | |
| 
 | |
| 
 | |
| " Functions ------------------------------------------------------------------
 | |
| 
 | |
| " Trim trailing whitespace (can be used on filetype)
 | |
| " e.g. au BufWrite *.* :call DeleteExtraWS()
 | |
| " https://amix.dk/vim/vimrc.html
 | |
| fun! g:DeleteExtraWS()
 | |
|   exe 'normal mz'
 | |
|   %s/\s\+$//ge
 | |
|   exe 'normal `z'
 | |
| endfun
 | |
| 
 | |
| 
 | |
| " Create a new file
 | |
| fun! g:AddNewFile(path, name, ext)
 | |
|   let date = strftime('%Y-%m-%d')
 | |
|   let fn = '-' . a:name
 | |
|   if a:name == ''
 | |
|     let fn = ''
 | |
|   endif
 | |
|   exe 'tabe' a:path . '/' . date .  fn . '.' . a:ext
 | |
| endfun
 | |
| 
 | |
| 
 | |
| " Backup the file in the current buffer
 | |
| " https://www.ibm.com/developerworks/library/l-vim-script-2/index.html
 | |
| fun! g:BackupFile()
 | |
|   let b:timestamp = strftime('%Y%m%d%H%M%S')
 | |
|   return writefile(getline(1,'$'), bufname('%') . '-' . b:timestamp)
 | |
| endfun
 | |
| 
 | |
| 
 | |
| " Wrap a word/selection in brackets
 | |
| " Based on http://learnvimscriptthehardway.stevelosh.com/chapters/09.html
 | |
| " and https://superuser.com/a/875160
 | |
| let g:WrapWordChars = {
 | |
|   \ '<':'>', '{':'}', '[':']', '(':')', '"':'"', "'":"'", '`':'`',
 | |
|   \ }
 | |
| fun! g:WrapWord(prefix)
 | |
|   " Temporarily disable Auto Pairs plugin if enabled
 | |
|   if exists('b:autopairs_enabled')
 | |
|     let l:isapenabled = b:autopairs_enabled
 | |
|     let b:autopairs_enabled = 0
 | |
|   endif
 | |
|   " Add key mappings to prefix + char for insert and select modes
 | |
|   for c in keys(g:WrapWordChars)
 | |
|     exe 'inoremap <silent>' . a:prefix . c . ' <esc>viw<esc>a' .
 | |
|         \ g:WrapWordChars[c] . '<esc>bi' . c . '<esc>ea<right>'
 | |
|     exe 'vnoremap <silent>' . a:prefix . c . ' xi' . c .
 | |
|         \ g:WrapWordChars[c] . '<esc>P'
 | |
|   endfor
 | |
|   " Restore user settings
 | |
|   if exists('b:autopairs_enabled')
 | |
|     let b:autopairs_enabled = l:isapenabled
 | |
|   endif
 | |
| endfun
 | |
| call g:WrapWord('<leader>w')
 | |
| 
 | |
| 
 | |
| " Filetypes ------------------------------------------------------------------
 | |
| 
 | |
| filetype plugin indent on
 | |
| 
 | |
| " Group autocommand calls to avoid duplicates whenever writing to buffer
 | |
| " http://learnvimscriptthehardway.stevelosh.com/chapters/14.html
 | |
| " Set indentation by filetype (not set with other basic settings as they will
 | |
| " override filetype setl whenever vimrc is reloaded)
 | |
| " shiftwidth: indent/unindent width
 | |
| " tabstop: tab width in spaces (view)
 | |
| " softtabstop: tab width in spaces (edit)
 | |
| augroup Filetypes
 | |
|   au!
 | |
| 
 | |
|   " CSS/Sass
 | |
|   au FileType css,sass,scss setl shiftwidth=2 tabstop=2 softtabstop=2
 | |
|     \ omnifunc=csscomplete#CompleteCSS
 | |
| 
 | |
|   " Gophermap needs real <tab> to convert maps
 | |
|   au BufRead,BufNewFile gophermap setl noexpandtab shiftwidth=4 tabstop=4
 | |
|     \ softtabstop=0 textwidth=70 colorcolumn=70
 | |
| 
 | |
|   " HTML
 | |
|   au Filetype htm,html setl
 | |
|     \ foldmethod=indent indentkeys= shiftwidth=2 tabstop=2 softtabstop=2
 | |
| 
 | |
|   " Markdown
 | |
|   au FileType markdown,md,mkd setl spell shiftwidth=2 tabstop=2 softtabstop=2
 | |
| 
 | |
|   " Vim-inspired app configs
 | |
|   au BufRead,BufNewFile vifmrc set filetype=vim
 | |
|   au BufRead,BufNewFile vimperatorrc set filetype=vim
 | |
|   au FileType vim,vimrc,vimrc* set shiftwidth=2 tabstop=2 softtabstop=2
 | |
| augroup END
 | |
| 
 | |
| 
 | |
| " Plugins --------------------------------------------------------------------
 | |
| 
 | |
| " vim-emoji-complete — insert emoji
 | |
| let g:emoji_complete_overwrite_standard_keymaps = 0
 | |
| imap <leader>em <Plug>(emoji-start-complete)
 | |
| 
 | |
| " ALE — syntax check/linting
 | |
| " Run lint manually
 | |
| let g:ale_lint_on_enter = 0
 | |
| let g:ale_lint_on_save = 0
 | |
| let g:ale_lint_on_text_changed = 'never'
 | |
| nmap <leader>ld :call ale#cursor#ShowCursorDetail()<cr>
 | |
| nmap <leader>li :ALELint<cr>
 | |
| nmap <leader>lj <Plug>(ale_next_wrap)
 | |
| nmap <leader>lk <Plug>(ale_previous_wrap)
 | |
| 
 | |
| " Auto Pairs — auto-close brackets
 | |
| let g:AutoPairs = {
 | |
|   \ '<':'>', '{':'}', '[':']', '(':')',
 | |
|   \ '"':'"', "'":"'", '`':'`',
 | |
|   \ '<!--':'-->',
 | |
|   \ '{%':'%}', '{#':'#}',
 | |
|   \ }
 | |
| " Remap/disable unneeded mappings
 | |
| let g:AutoPairsMapCR = 0
 | |
| let g:AutoPairsMultilineClose = 0
 | |
| let g:AutoPairsShortcutFastWrap = '<nop>'
 | |
| let g:AutoPairsShortcutJump = '<leader>aj'
 | |
| let g:AutoPairsShortcutToggle = '<leader>ap'
 | |
| 
 | |
| " commentary.vim — code commenting
 | |
| imap <leader>/ :Commentary<cr>
 | |
| vmap <leader>/ :Commentary<cr>
 | |
| 
 | |
| " snippet.vim — code/template expansion
 | |
| " Key mappings in snipmate.vim/after/plugin/snipMate.vim
 | |
| let g:snippets_dir = '~/.vim/snippets'
 | |
| imap <leader>. <c-r>=TriggerSnippet()<cr>
 |