"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " _ _ _ _____ __ _ " " | \ | | (_) / ____| / _(_) " " | \| |_ ___ _ __ ___ | | ___ _ __ | |_ _ __ _ " " | . ` \ \ / / | '_ ` _ \ | | / _ \| '_ \| _| |/ _` | " " | |\ |\ V /| | | | | | | | |___| (_) | | | | | | | (_| | " " |_| \_| \_/ |_|_| |_| |_| \_____\___/|_| |_|_| |_|\__, | " " __/ | " " |___/ " " " """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "{ Header and Licence "{{ header info " Description: This is my Nvim configuration which supports Mac, Linux and " Windows, with various plugins configured. This configuration evolves as I " learn more about Nvim and becomes more proficient in using Nvim. Since this " configuration file is very long (more than 1000 lines!), you should read it " carefully and only take the settings and options which suits you. I would " not recommend downloading this file and replace your own init.vim. Good " configurations are built over time and take your time to polish. " Author: jdhao (jdhao@hotmail.com). Blog: https://jdhao.github.io " Update: 2019-04-25 21:11:43+0800 "}} "{{ License: MIT License " " Copyright (c) 2018 Jie-dong Hao " " Permission is hereby granted, free of charge, to any person obtaining a copy " of this software and associated documentation files (the "Software"), to " deal in the Software without restriction, including without limitation the " rights to use, copy, modify, merge, publish, distribute, sublicense, and/or " sell copies of the Software, and to permit persons to whom the Software is " furnished to do so, subject to the following conditions: " " The above copyright notice and this permission notice shall be included in " all copies or substantial portions of the Software. " " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR " IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, " FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE " AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER " LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING " FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS " IN THE SOFTWARE. "}} "} "{ Variable "{{ builtin variables " path to Python 3 interpreter (must be an absolute path), make startup faster. " see https://neovim.io/doc/user/provider.html. You should change this " variable in accordance with your system. if has('win32') " for Windows let g:python3_host_prog='D:/Anaconda/python' elseif has('macunix') " for Mac let g:python3_host_prog=expand('~/anaconda3/bin/python') else " for Linux let g:python3_host_prog=expand('~/tools/anaconda3/bin/python') endif " set custom mapping (use `:h mapleader` for more info) let mapleader = ',' "}} "{{ disable loading certain plugin " do not load netrw by default since I do not use it, see " https://github.com/bling/dotvim/issues/4 let g:loaded_netrwPlugin = 1 " do not load tohtml.vim let g:loaded_2html_plugin = 1 " do not load zipPlugin.vim, gzip.vim and tarPlugin.vim (all these plugins are " related to compressed files) let g:loaded_zipPlugin = 1 let loaded_gzip = 1 let g:loaded_tarPlugin = 1 " do not use matchit.vim and matchparen.vim let loaded_matchit = 1 let g:loaded_matchparen = 1 "}} "} "{ Custom functions " remove trailing white space, see https://goo.gl/sUjgFi " function! s:StripTrailingWhitespaces() abort " let l:save = winsaveview() " keeppatterns %s/\s\+$//e " call winrestview(l:save) " endfunction " create command alias safely, see https://bit.ly/2ImFOpL " the following two functions are taken from answer below on SO " https://stackoverflow.com/a/10708687/6064933 function! Cabbrev(key, value) abort execute printf('cabbrev %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s', \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key)) endfunction function! Single_quote(str) abort return "'" . substitute(copy(a:str), "'", "''", 'g') . "'" endfunction " check the syntax group in the current cursor position, " see http://tinyurl.com/yyzgswxz and http://tinyurl.com/y3lxozey function! s:SynGroup() abort if !exists('*synstack') return endif echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') endfunction nnoremap st :call SynGroup() " the following two functions are from " https://stackoverflow.com/a/5703164/6064933 (with adaptation) " check if a colorscheme exists in runtimepath function! HasColorscheme(name) abort let pat = 'colors/'.a:name.'.vim' return !empty(globpath(&runtimepath, pat)) endfunction " check if an Airline theme exists in runtimepath function! HasAirlinetheme(name) abort let pat = 'autoload/airline/themes/'.a:name.'.vim' return !empty(globpath(&runtimepath, pat)) endfunction " generate a random integer from range [Low, High] using Python function! RandInt(Low, High) abort " if you use Python 3, the python block should start with `python3` instead of " `python`, see https://github.com/neovim/neovim/issues/9927 python3 << EOF import vim import random # using vim.eval to import variable outside Python script to python idx = random.randint(int(vim.eval('a:Low')), int(vim.eval('a:High'))) # using vim.command to export variable inside Python script to vim script so # we can return its value in vim script vim.command("let index = {}".format(idx)) EOF " vint: next-line -ProhibitUsingUndeclaredVariable return index endfunction " custom fold expr, adapted from https://vi.stackexchange.com/a/9094/15292 function! VimFolds(lnum) let l:cur_line = getline(a:lnum) let l:next_line = getline(a:lnum+1) if l:cur_line =~# '^"{' return '>' . (matchend(l:cur_line, '"{*')-1) else if l:cur_line ==# '' && (matchend(l:next_line, '"{*')-1) == 1 return 0 else return '=' endif endif endfunction " custom fold text, adapted from https://vi.stackexchange.com/a/3818/15292 " and https://vi.stackexchange.com/a/6608/15292 function! MyFoldText() let line = getline(v:foldstart) let nucolwidth = &foldcolumn + &number * &numberwidth let windowwidth = winwidth(0) - nucolwidth - 3 let foldedlinecount = v:foldend - v:foldstart " expand tabs into spaces let chunks = split(line, "\t", 1) let line = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - strwidth(v:val) % &tabstop)'), '') . chunks[-1] let line = strpart(line, 0, windowwidth - 2 - len(foldedlinecount)) " let fillcharcount = windowwidth - len(line) - len(foldedlinecount) - 80 let fillcharcount = &textwidth - len(line) - len(foldedlinecount) - 8 let l_fillcount = fillcharcount/2 let r_fillcount = fillcharcount - l_fillcount return line . '...'. repeat('-', l_fillcount) . ' (' . foldedlinecount . ' L) ' . repeat('-', r_fillcount) endfunction "} "{ Builtin options and settings " changing fillchars for folding, so there is no garbage charactes set fillchars=fold:\ ,vert:\| " paste mode toggle, it seems that neovim's bracketed paste mode " does not work very well for nvim-qt, so we use old paste mode set pastetoggle= " set cursorline " whether to show current line cursor is in " split window below when creating horizontal window and split right when " creating vertical window set splitbelow set splitright " Time in milliseconds to wait for a mapped sequence to complete " see https://goo.gl/vHvyu8 for more info set timeoutlen=300 " clipboard settings, always use clipboard for all delete, yank, change, put " operation, see https://goo.gl/YAHBbJ set clipboard+=unnamedplus " disable creating swapfiles, see https://goo.gl/FA6m6h set noswapfile " general tab settings set tabstop=4 " number of visual spaces per TAB set softtabstop=4 " number of spaces in tab when editing set shiftwidth=4 " number of spaces to use for autoindent set expandtab " expand tab to spaces so that tabs are spaces set showmatch " highlight matching bracket " show line number and relative line number set number relativenumber " ignore case when searching but become case sensitive when uppercase " characters are present set ignorecase smartcase " encoding settings for vim set fileencoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 scriptencoding utf-8 " set the script encoding (`:h :scriptencoding`) set linebreak " line will break at predefined characters " list all items and start selecting matches set wildmode=list:longest,full " set a ruler at column 80, see https://goo.gl/vEkF5i set colorcolumn=80 set scrolloff=5 " minimum lines to keep above and below cursor " use mouse to select window and resizing window, etc if has('mouse') set mouse=a " enable mouse in several mode (see `:h 'mouse'`) set mousemodel=popup " set the behaviour of mouse endif " do not show mode on command line because vim-airline can show it already set noshowmode set fileformats=unix,dos " fileformats to use for new file set concealcursor=c " the mode in which cursorline text can be concealed " the way to show the result of subsitute in real time for preview set inccommand=nosplit " ignore files or folders when globbing set wildignore+=*.o,*.obj,*.bin,*.dll,*.exe set wildignore+=*/.git/*,*/.svn/*,*/__pycache__/*,*/build/** set wildignore+=*.jpg,*.png,*.jpeg,*.gif,*.bmp,*.tiff set wildignore+=*.pyc set wildignore+=*.DS_Store set wildignore+=*.aux,*.bbl,*.blg,*.brf,*.fls,*.fdb_latexmk,*.synctex.gz,*.pdf " Ask for confirmation when handling unsaved or read-only files set confirm " use visual bells to indicate error, do not use errorbells set visualbell noerrorbells set foldlevel=0 " the level we start to fold set history=500 " the number of command and search history to keep " use list mode and customized listchars set list listchars=tab:▸\ ,extends:❯,precedes:❮,nbsp:+,trail:· " ,eol:¬ " string to show before the lines that have been soft-wrapped set showbreak=↪ set autowrite " auto write the file based on some condition " show hostname, full path of file and lastmod time on the window title. " The meaning of the format str for strftime can be found in " http://tinyurl.com/l9nuj4a. The function to get lastmod time is drawn from " http://tinyurl.com/yxd23vo8 set title set titlestring=%{hostname()}\ \ %F\ \ \ %{strftime('%Y-%m-%d\ %H:%M',getftime(expand('%')))} set updatetime=1000 " speed up updatetime so changes show quicker " whether to use modeline, see also https://is.gd/FEzuc7. set modeline set undofile " persistent undo even after you close and file and reopen it " do not show "match xx of xx" and other messages during auto-completion set shortmess+=c set completeopt+=noinsert " auto select the first completion entry " disable the preview window during autocompletion, see also https://goo.gl/18zNPD set completeopt-=preview " scan files given by `dictionary` option set complete+=k,kspell complete-=w complete-=b complete-=u complete-=t set showtabline=2 " whether to show tabline to see currently opened files " align indent to next multiple value of shiftwidth, for its meaning, " see http://tinyurl.com/y5n87a6m set shiftround set virtualedit=block " virtual edit is useful for visual block edit set signcolumn=yes " always show sign column " correctly break multi-byte characters such as CJK, " see http://tinyurl.com/y4sq6vf3 set formatoptions+=mM " dictionary files for different systems if has('unix') set dictionary+=/usr/share/dict/words else set dictionary+=~/AppData/Local/nvim/words endif set spelllang=en,cjk " spell languages set lazyredraw " matching pairs of characters set matchpairs+=<:>,「:」 " popup menu settings set pumheight=15 " maximum number of items to show in popup menu set pumblend=15 " pesudo-blend effect for popup menu "} "{ Custom key mappings " save key strokes (now we do not need to press shift to enter command mode) nnoremap ; : vnoremap ; : " quick way to open command window nnoremap q; q: " custom ESC. I do not like `kk` because it will delay the vim default `k` " motion by `timeoutlen` milliseconds (see `:h timeoutlen` for more info) inoremap k " use sane regex expression (see `:h magic` for more info) nnoremap / /\v vnoremap / /\v " paste text above or below current cursor, see " https://stackoverflow.com/a/1346777/6064933 nnoremap p op nnoremap P Op " shortcut for faster quit " nmap w :w nnoremap q :q nnoremap Q :qa " go to previous and next item in location list nnoremap [l :lpreviouszv nnoremap ]l :lnextzv " go to previous and next item in quickfix list nnoremap [q :cpreviouszv nnoremap ]q :cnextzv " close location list or quickfix list if they are present, " see https://goo.gl/uXncnS nnoremap \x :windo lclose\|cclose " toggle highlight search, see https://goo.gl/3H85hh nnoremap hl (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n" " Disable arrow key in vim, see https://goo.gl/s1yfh4 " disable arrow key in normal and insert mode (use faster way!) nnoremap nnoremap nnoremap nnoremap inoremap inoremap inoremap inoremap " insert a blank line below or above current line (do not move the cursor) " see https://stackoverflow.com/a/16136133/6064933 nnoremap oo m`o`` nnoremap OO m`O`` " insert a space after current character nnoremap ah " yank from current cursor position to end of line (make it consistant with " the behavior of D, C) nnoremap Y y$ " move cursor based on physical lines not the actual lines. noremap j (v:count == 0 ? 'gj' : 'j') noremap k (v:count == 0 ? 'gk' : 'k') nnoremap $ g$ nnoremap ^ g^ nnoremap 0 g0 " resize windows using and h,j,k,l, inspiration from " https://goo.gl/vVQebo (bottom page). " If you enable mouse support, shorcut below may not be necessary " resize window in vertical directory nnoremap < nnoremap > " resize window in horizontal directory nnoremap - nnoremap + " fast window switching, inspiration from " https://stackoverflow.com/a/4373470/6064933 nnoremap h nnoremap l nnoremap j nnoremap k " continuous visual shifting (does not exit Visual mode), `gv` means " to reselect previous visual area, see https://goo.gl/m1UeiT vnoremap < >gv " when completion menu is shown, use to select an item " and do not add an annoying newline, otherwise, is just what it is, " for more info , see https://goo.gl/KTHtrr and https://goo.gl/MH7w3b inoremap ((pumvisible())?("\"):("\")) " use to close auto-completion menu inoremap ((pumvisible())?("\"):("\")) " switching buffers quickly, extracted from vim-unimpaired nnoremap [b :bprevious " go to previous buffer nnoremap ]b :bnext " go to next buffer " reload init.vim quickly and give a message nnoremap sv :source $MYVIMRC \ :echom "Nvim config successfully reloaded!" " edit init.vim in a vertical split nnoremap ev :edit $MYVIMRC " delete a buffer and switching to another buffer, do not close the " window, see https://goo.gl/Wd8yZJ nnoremap \d :bprevious:bdelete # " nnoremap :call StripTrailingWhitespaces() " autocmd FileType * autocmd BufWritePre :call StripTrailingWhitespaces() " do not include white space character when using $ in visual mode, " see https://goo.gl/PkuZox vnoremap $ g_ " jump to matching pairs easily in normal mode nmap % " go to start or end of line easier nnoremap H ^ nnoremap L $ " reselect the text that has just been pasted nnoremap v `[V`] " find and replace (like Sublime Text 3) nnoremap :%s/\v " change current working locally to where the opened file resides " see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file nnoremap cd :lcd %:p:h:pwd " reduce indent level in insert mode with shift+tab inoremap < " tilde ~ is an operator (thus must be followed by motion like `c` or `d`) set tildeop "} "{ Auto commands " automatically save current file and execute it when pressing the key " it is useful for small script augroup filetype_auto_build_exec autocmd! autocmd FileType python nnoremap :execute 'w !python' \ shellescape(@%, 1) autocmd FileType cpp nnoremap :w :!g++ -Wall -std=c++11 % \ -o %<&&./%< augroup END " do not use smart case in command line mode " extracted from https://goo.gl/vCTYdK augroup dynamic_smartcase autocmd! autocmd CmdLineEnter : set nosmartcase autocmd CmdLineLeave : set smartcase augroup END " set textwidth for text file types augroup text_file_width autocmd! " sometimes, automatic filetype detection is not right, so we need to " detect the filetype based on the file extensions autocmd FileType text,tex setlocal textwidth=79 autocmd BufNewFile,BufRead *.md,*.MD,*.markdown setlocal textwidth=79 augroup END " do not use number and relative number for terminal inside nvim augroup term_settings autocmd! " donot use number and relatiev number for terminal autocmd TermOpen * setlocal norelativenumber nonumber " go to insert mode by default to start typing command autocmd TermOpen * startinsert augroup END " start insert mode when open the command window augroup cmd_mode_settings autocmd! autocmd CmdwinEnter [:] startinsert augroup END " more accurate syntax highlighting? (see `:h syn-sync`) augroup accurate_syn_highlight autocmd! autocmd BufEnter * :syntax sync fromstart augroup END " Return to last edit position when opening a file (see ':h line()') augroup resume_edit_position autocmd! autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit' \ | execute "normal! g`\"zvzz" \ | endif augroup END augroup vim_script_setting autocmd! " set the folding related options for vim script. Setting folding option in " modeline is annoying in that the modeline get executed each time the window " focus is lost (see http://tinyurl.com/yyqyyhnc) autocmd FileType vim set foldmethod=expr foldlevel=0 foldlevelstart=-1 autocmd FileType vim set foldexpr=VimFolds(v:lnum) foldtext=MyFoldText() " autocmd FileType vim set foldexpr=VimFolds(v:lnum) " Simply set formatoptions without autocmd does not work for vim filetype " because the options are overruled by vim's default ftplugin for vim " script unfortunately. The following way to use autocmd seems quick and " dirty and may not even work (I do this because I don't want to " split my vim config). For more discussions, see " http://tinyurl.com/yyznar7r and http://tinyurl.com/zehso5h " some format options when editting text file " donot insert comment leader after hitting o or O autocmd FileType vim setlocal formatoptions-=o " donot insert comment leader after hitting in insert mode autocmd FileType vim setlocal formatoptions-=r " use :help command for keyword when pressing `K` in vim file, " see `:h K` and https://bre.is/wC3Ih-26u autocmd FileType vim setlocal keywordprg=:help augroup END "} "{ Plugin install part "{{ Vim-plug Install and plugin initialization " set up directory to install all the plugins depending on the platform if has('win32') let s:PLUGIN_HOME=expand('~/AppData/Local/nvim/plugged') else let s:PLUGIN_HOME=expand('~/.local/share/nvim/plugged') endif " auto-install vim-plug on different systems. " For Windows, only Windows 10 with curl command installed are tested (after " Windows 10 build 17063, source: http://tinyurl.com/y23972tt) " The following script to install vim-plug are adapted from " vim-plug tips: https://bit.ly/2IhJDNb if !executable('curl') echoerr 'You have to install curl to install vim-plug or install vim-plug \ yourself following the guide on vim-plug git repository' execute 'q!' else if has('unix') if empty(glob('~/.local/share/nvim/site/autoload/plug.vim')) echo 'Installing Vim-plug on your system' silent !curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim augroup plug_init autocmd! autocmd VimEnter * PlugInstall --sync | source $MYVIMRC augroup END endif elseif has('win32') if empty(glob('~\AppData\Local\nvim\autoload\plug.vim')) echo 'Installing Vim-plug on your system' silent !curl -fLo C:\Users\Administrator\AppData\Local\nvim\autoload\plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim augroup plug_init autocmd! autocmd VimEnter * PlugInstall --sync | source $MYVIMRC augroup END endif endif endif "} call plug#begin(s:PLUGIN_HOME) "{{ autocompletion related plugins " settings for deoplete Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " snippet engine Plug 'SirVer/ultisnips' " snippet template for ultisnips Plug 'honza/vim-snippets' " for insert mode completion Plug 'ervandew/supertab' " python source for deoplete Plug 'zchee/deoplete-jedi', { 'for': 'python' } " vim source for deoplete Plug 'Shougo/neco-vim', { 'for': 'vim' } " dictionary source for English words completion (not available on Windows) " Find this plugin on http://tinyurl.com/gttcxwh if has('unix') " Plug 'ujihisa/neco-look' endif Plug 'deathlyfrantic/deoplete-spell' "}} "{{ python-related plugins " Python completion, goto definition etc. Plug 'davidhalter/jedi-vim', { 'for': 'python' } " Python syntax highlighting Plug 'vim-python/python-syntax', { 'for': 'python' } " python syntax highlighting and more Plug 'numirias/semshi', { 'do': ':UpdateRemotePlugins', 'for': 'python' } " python code folding Plug 'tmhedberg/SimpylFold', { 'for': 'python' } " python indent (follows the PEP8 style) Plug 'Vimjas/vim-python-pep8-indent', {'for': 'python'} "}} "{{ search related plugins " extend vim's default search behaviour Plug 'inkarkat/vim-SearchHighlighting' " required by vim-SearchHighlighting Plug 'inkarkat/vim-ingo-library' " super fast movement with vim-sneak Plug 'justinmk/vim-sneak' " improve vim incsearch Plug 'haya14busa/is.vim' " show match number for incsearch Plug 'osyo-manga/vim-anzu' " another grep tool (similar to Sublime Text Ctrl+Shift+F) " TODO: worth trying and exploring Plug 'dyng/ctrlsf.vim' " a grep tool Plug 'mhinz/vim-grepper', { 'on': ['Grepper', '(GrepperOperator)'] } " file search, tag search and more if has('win32') Plug 'Yggdroot/LeaderF', { 'do': '.\install.bat' } else Plug 'Yggdroot/LeaderF', { 'do': './install.sh' } endif " another similar plugin is command-t " Plug 'wincent/command-t' " only use fzf for Linux and Mac since fzf does not work well for Windows if has('unix') " fuzzy file search and more Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'junegunn/fzf.vim' endif "}} "{{ color, theme, look " A list of colorscheme plugin you may want to try. Find what suits you. Plug 'morhetz/gruvbox' Plug 'sickill/vim-monokai' Plug 'ajmwagar/vim-deus' Plug 'hzchirs/vim-material' Plug 'nanotech/jellybeans.vim' " Plug 'joshdick/onedark.vim' " Plug 'challenger-deep-theme/vim' " Plug 'lifepillar/vim-solarized8' " Plug 'whatyouhide/vim-gotham' " Plug 'yous/vim-open-color' " Plug 'arcticicestudio/nord-vim' " Plug 'rakr/vim-one' " Plug 'kaicataldo/material.vim' " wonderful status line Plug 'vim-airline/vim-airline' " vim-airline theme Plug 'vim-airline/vim-airline-themes' " lightline status bar (a simpler alternative to vim-airline) " Plug 'itchyny/lightline.vim' " show indent lines for better comprehension of the code structure " currently, blank lines inside the indent block do not show indent guides, " see https://github.com/Yggdroot/indentLine/issues/25 Plug 'Yggdroot/indentLine' " fancy vim start screen Plug 'mhinz/vim-startify' "}} "{{ plugin to deal with URL " highlight URLs inside vim Plug 'itchyny/vim-highlighturl' " For Windows and Mac, we can open URL in browser. For Linux, it may not be " possible since we maybe in a server which disable X11 if has('win32') || has('macunix') " open URL in browser Plug 'tyru/open-browser.vim' endif "}} "{{ navigation and tags plugin " file explorer for vim Plug 'scrooloose/nerdtree', { 'on': ['NERDTreeToggle', 'NERDTreeFind'] } " only install these plugins if ctags are installed on the system if executable('ctags') " plugin to manage tags (must install ctags on system) Plug 'ludovicchabant/vim-gutentags' " show file tags in vim windows (must install ctags on system) Plug 'majutsushi/tagbar', { 'on': ['TagbarToggle', 'TagbarOpen'] } endif "}} "{{ file editting plugin " automatic character pair insertion and deletion Plug 'jiangmiao/auto-pairs' " comment plugin Plug 'scrooloose/nerdcommenter' " multiline editting plugin. It becomes slow if you try to edit many " occurences of a variable " Plug 'terryma/vim-multiple-cursors' " another multiple cursor plugin " Plug 'mg979/vim-visual-multi' " title character case Plug 'christoomey/vim-titlecase' " autosave files on certain events Plug '907th/vim-auto-save' " graphcial undo history, see https://github.com/mbbill/undotree Plug 'mbbill/undotree' " another plugin to show undo history is: http://tinyurl.com/jlsgjy5 " Plug 'simnalamburt/vim-mundo' if has('win32') || has('macunix') " manage your yank history " TODO: it seems that this plugin does not work if you connect to remote " Linux server and use it with neovim on the server. Plug 'svermeulen/vim-yoink' " another yank history yank " Plug 'bfredl/nvim-miniyank' endif " strip trailing whitespace Plug 'ntpeters/vim-better-whitespace' " show marks in sign column for quicker navigation Plug 'kshenoy/vim-signature' " another good plugin to show signature " https://github.com/jeetsukumaran/vim-markology " Plug 'jeetsukumaran/vim-markology' " handy unix command inside Vim Plug 'tpope/vim-eunuch' "}} "{{ linting, formating " auto format tool Plug 'sbdchd/neoformat' " another auto format tool " Plug 'Chiel92/vim-autoformat' " syntax check and make Plug 'neomake/neomake' " another linting plugin " Plug 'w0rp/ale' "}} "{{ git related plugins " show git change (change, delete, add) signs in vim sign column " Plug 'airblade/vim-gitgutter' Plug 'mhinz/vim-signify' " git command inside vim Plug 'tpope/vim-fugitive' " git commit browser Plug 'junegunn/gv.vim', { 'on': 'GV' } "}} "{{ plugins for markdown writing " distraction free writing Plug 'junegunn/goyo.vim', { 'for': 'markdown' } " only light on your cursor line Plug 'junegunn/limelight.vim', {'for': 'markdown'} " markdown syntax highlighting Plug 'vim-pandoc/vim-pandoc-syntax', { 'for': 'markdown' } " another markdown plugin Plug 'plasticboy/vim-markdown', { 'for': 'markdown' } " If we are on Win or Mac, preview the markdown in system default browser. if has('win32') || has('macunix') " markdown previewing Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': 'markdown' } endif " faster footnote generation Plug 'vim-pandoc/vim-markdownfootnotes', { 'for': 'markdown' } " vim tabular plugin for manipulate tabular, required by markdown plugins Plug 'godlygeek/tabular' " markdown JSON header highlight plugin Plug 'elzr/vim-json', { 'for': ['json', 'markdown'] } "}} "{{ text object plugins " additional powerful text object for vim, this plugin should be studied " carefully to use its full power Plug 'wellle/targets.vim' " Plugin to manipulate characer pairs quickly Plug 'tpope/vim-surround' " add indent object for vim (useful for languages like Python) Plug 'michaeljsmith/vim-indent-object' " create custom text object Plug 'kana/vim-textobj-user' " text object for entire buffer, add `ae` and `ie` Plug 'kana/vim-textobj-entire' "}} "{{ LaTeX editting and previewing plugin " Only use these plugin on Windows and Mac and when a LaTeX distribution has " been deteced if ( has('macunix') || has('win32') ) && executable('latex') " vimtex use autoload feature of Vim, so it is not necessary to use `for` " keyword of vim-plug to try to lazy-load it, " see http://tinyurl.com/y3ymc4qd Plug 'lervag/vimtex' " Plug 'matze/vim-tex-fold', {'for': 'tex'} Plug 'Konfekt/FastFold' endif "}} "{{ tmux related plugins " Since tmux is only available on Linux and Mac, we only enable these plugins " for Linux and Mac if has('unix') && executable('tmux') " let vim detect tmux focus event correctly, see " http://tinyurl.com/y4xd2w3r and http://tinyurl.com/y4878wwm Plug 'tmux-plugins/vim-tmux-focus-events' " .tmux.conf syntax highlighting and setting check Plug 'tmux-plugins/vim-tmux', { 'for': 'tmux' } endif "}} "{{ misc plugins " automatically toggle line number based on several conditions Plug 'jeffkreeftmeijer/vim-numbertoggle' " highlight yanked region Plug 'machakann/vim-highlightedyank' " repeat vim motions Plug 'tpope/vim-repeat' " quickly run a code script Plug 'thinca/vim-quickrun' " modern matchit implementation Plug 'andymass/vim-matchup' " simulating smooth scroll motions with physcis Plug 'yuttie/comfortable-motion.vim' Plug 'tpope/vim-scriptease' call plug#end() "}} "} "{ Plugin settings "{{ vim-plug settings " use shortnames for common vim-plug command to reduce typing " To use these shortcut: first activate command line with `:`, then input the " short alias name, e.g., `pi`, then press , the alias will be expanded " to the original command automatically call Cabbrev('pi', 'PlugInstall') call Cabbrev('pud', 'PlugUpdate') call Cabbrev('pug', 'PlugUpgrade') call Cabbrev('ps', 'PlugStatus') call Cabbrev('pc', 'PlugClean') "}} "{{ auto-completion related """""""""""""""""""""""""""" deoplete settings"""""""""""""""""""""""""" " wheter to enable deoplete automatically after start nvim let g:deoplete#enable_at_startup = 0 " start deoplete when we go to insert mode augroup deoplete_start autocmd! autocmd InsertEnter * call deoplete#enable() augroup END " maximum candidate window length call deoplete#custom#source('_', 'max_menu_width', 80) " minimum character length needed to start completion, " see https://goo.gl/QP9am2 call deoplete#custom#source('_', 'min_pattern_length', 1) " whether to disable completion for certain syntax " call deoplete#custom#source('_', { " \ 'filetype': ['vim'], " \ 'disabled_syntaxes': ['String'] " \ }) " disable auto-completion for python in certain syntax groups call deoplete#custom#source('_', { \ 'filetype': ['python'], \ 'disabled_syntaxes': ['Comment'] \ }) " ignore certain sources, because they only cause nosie most of the time call deoplete#custom#option('ignore_sources', { \ '_': ['around', 'buffer', 'tag'] \ }) " candidate list item limit call deoplete#custom#option('max_list', 30) "The number of processes used for the deoplete parallel feature. call deoplete#custom#option('num_processes', 32) " Delay the completion after input in milliseconds. call deoplete#custom#option('auto_complete_delay', 10) " enable or disable deoplete auto-completion call deoplete#custom#option('auto_complete', v:true) " automatically close function preview windows after completion " see https://goo.gl/Bn5n39 " autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif " deoplete tab-complete, see https://goo.gl/LvwZZY " inoremap pumvisible() ? "\" : "\" """""""""""""""""""""""""UltiSnips settings""""""""""""""""""" " Trigger configuration. Do not use if you use " https://github.com/Valloric/YouCompleteMe. let g:UltiSnipsExpandTrigger='' " shortcut to go to next position let g:UltiSnipsJumpForwardTrigger='' " shortcut to go to previous position let g:UltiSnipsJumpBackwardTrigger='' " directory `my_snippets` should be put under your config directory (use " `:echo stdpath('config')` to show the config directory). let g:UltiSnipsSnippetDirectories=['UltiSnips', 'my_snippets'] """""""""""""""""""""""""supertab settings"""""""""""""""""""""""""" " auto-close method preview window "let g:SuperTabClosePreviewOnPopupClose = 1 " use the default top to bottom way for scroll, see https://goo.gl/APdo9V let g:SuperTabDefaultCompletionType = '' " shortcut to navigate forward and backward in completion menu " see https://is.gd/AoSv4m let g:SuperTabMappingForward = '' let g:SuperTabMappingBackward = '' """"""""""""""""""deoplete-jedi settings""""""""""""""""""""""""""" " whether to show doc string let g:deoplete#sources#jedi#show_docstring = 0 " do not use typeinfo (for faster completion) let g:deoplete#sources#jedi#enable_typeinfo = 0 " for large package, set autocomplete wait time longer let g:deoplete#sources#jedi#server_timeout = 50 "}} "{{ python-related """"""""""""""""""""""""jedi-vim settings""""""""""""""""""" " disable autocompletion, because I use deoplete for auto-completion let g:jedi#completions_enabled = 0 " open the go-to function in split, not another buffer " let g:jedi#use_splits_not_buffers = 'right' " show function call signature let g:jedi#show_call_signatures = '2' """""""""""""""""""""""""python-syntax highlight settings""""""""""""""""""" " highlight all let g:python_highlight_all = 1 """""""""""""""""""""""""" semshi settings """"""""""""""""""""""""""""""" " do not highlight variable under cursor let g:semshi#mark_selected_nodes=0 " do not show error sign since neomake is specicialized for that let g:semshi#error_sign=v:false "}} "{{ search related """""""""""""""""""""""""""""vim-sneak settings""""""""""""""""""""""" let g:sneak#label = 1 nmap f Sneak_s nmap F Sneak_S nmap t Sneak_t nmap T Sneak_T """"""""""""""""""""""""""""is.vim settings""""""""""""""""""""""" " to make is.vim work together well with vim-anzu and put current match in " the center of the window " `zz`: put cursor line in center of the window " `zv`: open a fold to reveal the text when cursor step into it nmap n (is-nohl)(anzu-n-with-echo)zzzv nmap N (is-nohl)(anzu-N-with-echo)zzzv """""""""""""""""""""""""""""vim-anzu settings""""""""""""""""""""""" " nmap n zzzv(anzu-n-with-echo) " nmap N zzzv(anzu-N-with-echo) nmap * (anzu-star-with-echo) nmap # (anzu-sharp-with-echo) " clear matching info on status line with double nmap (anzu-clear-search-status) """""""""""""""""""""""""fzf settings"""""""""""""""""""""""""" " only use fzf on Mac and Linux, since it doesn't work well for Windows if has('unix') " hide status line when open fzf window augroup fzf_hide_statusline autocmd! autocmd! FileType fzf autocmd FileType fzf set laststatus=0 noshowmode noruler \| autocmd BufLeave set laststatus=2 showmode ruler augroup END " search file recursively under current folder nnoremap f :FZF " search file recursively under HOME (You may do want to do this!) " nnoremap F :FZF ~ """""""""""""""""""""""""fzf.vim settings"""""""""""""""""" " Customize fzf colors to match your color scheme let g:fzf_colors = \ { 'fg': ['fg', 'Normal'], \ 'bg': ['bg', 'Normal'], \ 'hl': ['fg', 'Comment'], \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], \ 'hl+': ['fg', 'Statement'], \ 'info': ['fg', 'PreProc'], \ 'border': ['fg', 'Ignore'], \ 'prompt': ['fg', 'Conditional'], \ 'pointer': ['fg', 'Exception'], \ 'marker': ['fg', 'Keyword'], \ 'spinner': ['fg', 'Label'], \ 'header': ['fg', 'Comment'] } " [Tags] Command to generate tags file let g:fzf_tags_command = 'ctags -R' " floating windows only works for latest nvim version " floating window searching for fzf let $FZF_DEFAULT_OPTS = '--layout=reverse' " use floating window to open the fzf search window let g:fzf_layout = { 'window': 'call OpenFloatingWin()' } function! OpenFloatingWin() let height = &lines - 3 let width = float2nr(&columns - (&columns * 2 / 10)) let col = float2nr((&columns - width) / 2) " set up the attribute of floating window let opts = { \ 'relative': 'editor', \ 'row': height * 0.3, \ 'col': col + 20, \ 'width': width * 2 / 3, \ 'height': height / 2 \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) " floating window highlight setting call setwinvar(win, '&winhl', 'Normal:Pmenu') setlocal \ buftype=nofile \ nobuflisted \ bufhidden=hide \ nonumber \ norelativenumber \ signcolumn=no endfunction endif "}} "{{ URL related """"""""""""""""""""""""""""open-browser.vim settings""""""""""""""""""" if has('win32') || has('macunix') " disable netrw's gx mapping. let g:netrw_nogx = 1 " use another mapping for the open URL method nmap ob (openbrowser-smart-search) vmap ob (openbrowser-smart-search) endif """""""""""""""""""""""""vim-highlighturl settings""""""""""""""""""""""""" " whether to underline the URL let g:highlighturl_underline=1 "{{ navigation and tags """"""""""""""""""""""" nerdtree settings """""""""""""""""""""""""" " toggle nerdtree window and keep cursor in file window, " adapted from http://tinyurl.com/y2kt8cy9 nnoremap :NERDTreeToggle:wincmd p " reveal currently editted file in nerdtree widnow, " see https://goo.gl/kbxDVK nnoremap ,nf :NERDTreeFind " ignore certain files and folders let NERDTreeIgnore = ['\.pyc$', '^__pycache__$'] " exit vim when the only window is nerdtree window, see " https://github.com/scrooloose/nerdtree " autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && " \ b:NERDTree.isTabTree()) | q | endif " automatically show nerdtree window on entering nvim, " see https://github.com/scrooloose/nerdtree, but now the cursor " is in nerdtree window, so we need to change it to the file window, " extracted from https://goo.gl/vumpvo " autocmd VimEnter * NERDTree | wincmd l " delete a file buffer when you have deleted it in nerdtree let NERDTreeAutoDeleteBuffer = 1 " show current root as realtive path from HOME in status bar, " see https://github.com/scrooloose/nerdtree/issues/891 let NERDTreeStatusline="%{exists('b:NERDTree')?fnamemodify(b:NERDTree.root.path.str(), ':~'):''}" " disable bookmark and 'press ? for help ' text let NERDTreeMinimalUI=0 """"""""""""""""""""""""""" tagbar settings """""""""""""""""""""""""""""""""" " shortcut to toggle tagbar window nnoremap :TagbarToggle "}} "{{ file editting """""""""""""""""""""""""""""auto-pairs settings""""""""""""""""""""""""" augroup filetype_custom_autopair autocmd! " only use the following character pairs for tex file au FileType tex let b:AutoPairs = {'(':')', '[':']', '{':'}'} " add `<>` pair to filetype vim au FileType vim let b:AutoPairs = AutoPairsDefine({'<' : '>'}) augroup END """"""""""""""""""""""""""""nerdcommenter settings""""""""""""""""""" " Add spaces after comment delimiters by default let g:NERDSpaceDelims = 1 " use one space after # comment character in python, " see http://tinyurl.com/y4hm29o3 let g:NERDAltDelims_python = 1 " Align line-wise comment delimiters flush left instead " of following code indentation let g:NERDDefaultAlign = 'left' " Enable NERDCommenterToggle to check all selected lines is commented or not let g:NERDToggleCheckAllLines = 1 """"""""""""""""""""""""""""vim-titlecase settings""""""""""""""""""""""" " do not use the default mapping provided let g:titlecase_map_keys = 0 nmap gt Titlecase vmap gt Titlecase nmap gT TitlecaseLine """"""""""""""""""""""""vim-auto-save settings""""""""""""""""""""""" " enable AutoSave on nvim startup let g:auto_save = 1 " the event to trigger autosave let g:auto_save_events = ['InsertLeave', 'TextChanged'] " show autosave status on command line let g:auto_save_silent = 0 """"""""""""""""""""""""""""vim-yoink settings""""""""""""""""""""""""" if has('win32') " TODO: test yoink on Mac to see if it works " it seems that ctrl-n and ctrl-p does not work on neovim nmap (YoinkPostPasteSwapBack) nmap (YoinkPostPasteSwapForward) nmap p (YoinkPaste_p) nmap P (YoinkPaste_P) " cycle the yank stack with the following mappings nmap [y (YoinkRotateBack) nmap ]y (YoinkRotateForward) " not change the cursor position nmap y (YoinkYankPreserveCursorPosition) xmap y (YoinkYankPreserveCursorPosition) " move cursor to end of paste after multiline paste let g:yoinkMoveCursorToEndOfPaste = 0 " record yanks in system clipboard let g:yoinkSyncSystemClipboardOnFocus = 1 endif """""""""""""""""""""vim-better-whitespace settings"""""""""""""""""""""""""" " whether to highlight trailing whitespace with the default red color (I find " it distracting so I turn it off) let g:better_whitespace_enabled=0 " set a mapping for StripWhitespace command nnoremap :StripWhitespace " strip white line at the end of the file let g:strip_whitelines_at_eof=1 " disable whitespace operator let g:better_whitespace_operator='' """"""""""""""""""""""""""""""vim-signature settings"""""""""""""""""""""""""" " change mark highlight to be more visible augroup signature_highlight autocmd! autocmd ColorScheme * highlight SignatureMarkText cterm=bold ctermbg=10 \ gui=bold guifg=#aeee04 augroup END "}} "{{ linting and formating """"""""""""""""""""""""""neoformat settins"""""""""""""""""""" " Enable alignment let g:neoformat_basic_format_align = 1 " Enable tab to spaces conversion let g:neoformat_basic_format_retab = 1 " Enable trimmming of trailing whitespace let g:neoformat_basic_format_trim = 1 """""""""""""""""""""""""""""" neomake settings """"""""""""""""""""""" " when writing or reading a buffer, and " on changes in normal mode (after 0.5s; no delay when writing). call neomake#configure#automake('nrw', 50) " change warning signs and color, see https://goo.gl/eHcjSq " highlight NeomakeErrorMsg ctermfg=227 ctermbg=237 let g:neomake_warning_sign={'text': '!', 'texthl': 'NeomakeWarningSign'} let g:neomake_error_sign={'text': '✗'} " which linter to enable for Python source file linting " let g:neomake_python_enabled_makers = ['flake8', 'pylint'] let g:neomake_python_enabled_makers = ['flake8'] " do not highlight columns, it works bad for sublimemonokai " see https://goo.gl/wd68ex for more info let g:neomake_highlight_columns = 1 " whether to open quickfix or location list automatically let g:neomake_open_list = 0 "let g:neomake_python_pylint_maker = { " \ 'args': [ " \ '-d', 'C0103, C0111', " \ '-f', 'text', " \ '--msg-template="{path}:{line}:{column}:{C}: [{symbol}] {msg} [{msg_id}]"', " \ '-r', 'n' " \ ], " \ 'errorformat': " \ '%A%f:%l:%c:%t: %m,' . " \ '%A%f:%l: %m,' . " \ '%A%f:(%l): %m,' . " \ '%-Z%p^%.%#,' . " \ '%-G%.%#', " \ } "}} "{{ git-related """""""""""""""""""""""""vim-signify settings"""""""""""""""""""""""""""""" " the VCS to use let g:signify_vcs_list = [ 'git' ] " change the sign for certain operations let g:signify_sign_change = '~' "}} "{{ Markdown writing """""""""""""""""""""""""goyo.vim settings"""""""""""""""""""""""""""""" " make goyo and limelight work together automatically augroup goyo_work_with_limelight autocmd! autocmd! User GoyoEnter Limelight autocmd! User GoyoLeave Limelight! augroup END """""""""""""""""""""""""vim-pandoc-syntax settings""""""""""""""""""""""""" " do not conceal urls (seems does not work) let g:pandoc#syntax#conceal#urls = 0 " use pandoc-syntax for markdown files, it will disable conceal feature for " links, use it at your own risk augroup pandoc_syntax au! BufNewFile,BufFilePre,BufRead *.md set filetype=markdown.pandoc augroup END """""""""""""""""""""""""plasticboy/vim-markdown settings""""""""""""""""""" " disable header folding let g:vim_markdown_folding_disabled = 1 " whether to use conceal feature in markdown let g:vim_markdown_conceal = 1 " disable math tex conceal and syntax highlight let g:tex_conceal = '' let g:vim_markdown_math = 0 " support front matter of various format let g:vim_markdown_frontmatter = 1 " for YAML format let g:vim_markdown_toml_frontmatter = 1 " for TOML format let g:vim_markdown_json_frontmatter = 1 " for JSON format " let the TOC window autofit so that it doesn't take too much space let g:vim_markdown_toc_autofit = 1 """""""""""""""""""""""""markdown-preview settings""""""""""""""""""" " only setting this for suitable platforms if has('win32') || has('macunix') " do not close the preview tab when switching to other buffers let g:mkdp_auto_close = 0 " shortcut to start markdown previewing nnoremap :MarkdownPreview endif """"""""""""""""""""""""vim-markdownfootnotes settings"""""""""""""""""""""""" " replace the default mappings provided by the plugin imap ^^ AddVimFootnote nmap ^^ AddVimFootnote imap @@ ReturnFromFootnote nmap @@ ReturnFromFootnote "}} "{{ LaTeX editting """"""""""""""""""""""""""""vimtex settings""""""""""""""""""""""""""""" if ( has('macunix') || has('win32')) && executable('latex') " enhanced matching with matchup plugin let g:matchup_override_vimtex = 1 " set up LaTeX flavor let g:tex_flavor = 'latex' " deoplete configurations for autocompletion to work call deoplete#custom#var('omni', 'input_patterns', { \ 'tex': g:vimtex#re#deoplete \}) let g:vimtex_compiler_latexmk = { \ 'backend' : 'nvim', \ 'background' : 1, \ 'build_dir' : 'build', \ 'callback' : 1, \ 'continuous' : 1, \ 'executable' : 'latexmk', \ 'options' : [ \ '-verbose', \ '-file-line-error', \ '-synctex=1', \ '-interaction=nonstopmode', \ ], \} " Compile on initialization, cleanup on quit augroup vimtex_event_1 au! au User VimtexEventInitPost call vimtex#compiler#compile() au User VimtexEventQuit call vimtex#compiler#clean(0) augroup END " TOC settings let g:vimtex_toc_config = { \ 'name' : 'TOC', \ 'layers' : ['content', 'todo', 'include'], \ 'resize' : 1, \ 'split_width' : 50, \ 'todo_sorted' : 0, \ 'show_help' : 1, \ 'show_numbers' : 1, \ 'mode' : 2, \} " viewer settings for different platforms if has('win32') let g:vimtex_view_general_viewer = 'SumatraPDF' let g:vimtex_view_general_options_latexmk = '-reuse-instance' let g:vimtex_view_general_options \ = '-reuse-instance -forward-search @tex @line @pdf' endif if has('macunix') " let g:vimtex_view_method = "skim" let g:vimtex_view_general_viewer \ = '/Applications/Skim.app/Contents/SharedSupport/displayline' let g:vimtex_view_general_options = '-r @line @pdf @tex' " This adds a callback hook that updates Skim after compilation let g:vimtex_compiler_callback_hooks = ['UpdateSkim'] function! UpdateSkim(status) if !a:status | return | endif let l:out = b:vimtex.out() let l:tex = expand('%:p') let l:cmd = [g:vimtex_view_general_viewer, '-r'] if !empty(system('pgrep Skim')) call extend(l:cmd, ['-g']) endif if has('nvim') call jobstart(l:cmd + [line('.'), l:out, l:tex]) elseif has('job') call job_start(l:cmd + [line('.'), l:out, l:tex]) else call system(join(l:cmd + [line('.'), shellescape(l:out), shellescape(l:tex)], ' ')) endif endfunction endif endif "}} "{{ status line, look """""""""""""""""""""""""indentLine settings"""""""""""""""""""""""""" " whether to enable indentLine let g:indentLine_enabled = 1 " the character used for indicating indentation " let g:indentLine_char = '┊' let g:indentLine_char = '│' " whether to use conceal color by indentLine let g:indentLine_setColors = 0 " show raw code when cursor is current line (mainly for markdown file) " see https://github.com/plasticboy/vim-markdown/issues/395 let g:indentLine_concealcursor = '' " disable indentline for certain filetypes augroup indentline_disable_ft autocmd! autocmd FileType help,startify let g:indentLine_enabled = 0 augroup END """""""""""""""""""""""""""vim-airline setting"""""""""""""""""""""""""""""" " set a airline theme only if it exists, else we resort to default color let s:candidate_airlinetheme = ['alduin', 'ayu_mirage', 'base16_flat', \ 'monochrome', 'base16_grayscale', 'lucius', 'base16_tomorrow', \ 'base16_adwaita', 'biogoo', 'distinguished', 'gruvbox', 'jellybeans', \ 'luna', 'raven', 'seagull', 'solarized_flood', 'term', 'vice', 'zenburn'] let s:idx = RandInt(0, len(s:candidate_airlinetheme)-1) let s:theme = s:candidate_airlinetheme[s:idx] if HasAirlinetheme(s:theme) let g:airline_theme=s:theme endif " tabline settings " show tabline let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#formatter = 'unique_tail_improved' " buffer number display format let g:airline#extensions#tabline#buffer_nr_format = '%s. ' " show buffer number for easier switching between buffer " see https://github.com/vim-airline/vim-airline/issues/1149 let g:airline#extensions#tabline#buffer_nr_show = 1 " whether to show function or other tags on status line let g:airline#extensions#tagbar#enabled = 0 " skip empty sections if nothing to show " extract from https://vi.stackexchange.com/a/9637/15292 let g:airline_skip_empty_sections = 1 "make airline more beautiful, see https://goo.gl/XLY19H for more info let g:airline_powerline_fonts = 1 " show only hunks which is non-zero (git-related) let g:airline#extensions#hunks#non_zero_only = 1 " enable gutentags integration let g:airline#extensions#gutentags#enabled = 1 " custom status line symbols if !exists('g:airline_symbols') let g:airline_symbols = {} endif let g:airline_left_sep = '»' let g:airline_left_sep = '▶' let g:airline_right_sep = '«' let g:airline_right_sep = '◀' let g:airline_symbols.crypt = '🔒' let g:airline_symbols.linenr = '☰' let g:airline_symbols.linenr = '␊' let g:airline_symbols.linenr = '␤' let g:airline_symbols.linenr = '¶' let g:airline_symbols.maxlinenr = '' let g:airline_symbols.maxlinenr = '㏑' let g:airline_symbols.branch = '⎇' let g:airline_symbols.paste = 'ρ' let g:airline_symbols.paste = 'Þ' let g:airline_symbols.paste = '∥' let g:airline_symbols.spell = 'Ꞩ' let g:airline_symbols.notexists = 'Ɇ' let g:airline_symbols.whitespace = 'Ξ' " powerline symbols let g:airline_left_sep = '' let g:airline_left_alt_sep = '' let g:airline_right_sep = '' let g:airline_right_alt_sep = '' let g:airline_symbols.branch = '' let g:airline_symbols.readonly = '' let g:airline_symbols.linenr = '☰' let g:airline_symbols.maxlinenr = '' "}} "{{ misc plugin setting """"""""""""""""""" vim-highlightedyank settings """""""""""""" " reverse the highlight color for yanked text for better visuals highlight HighlightedyankRegion cterm=reverse gui=reverse " let highlight endures longer let g:highlightedyank_highlight_duration = 1000 """"""""""""""""""""""""""""vim-matchup settings""""""""""""""""""""""""""""" " whether to enable matching inside comment or string let g:matchup_delim_noskips = 0 " change highlight color of matching bracket for better visual effects augroup matchup_matchparen_highlight autocmd! autocmd ColorScheme * highlight MatchParen cterm=underline gui=underline augroup END " show matching keyword as underlined text to reduce color clutter augroup matchup_matchword_highlight autocmd! autocmd ColorScheme * hi MatchWord cterm=underline gui=underline augroup END """"""""""""""""""""""""""quickrun settings""""""""""""""""""""""""""""" let g:quickrun_no_default_key_mappings = 1 nnoremap :QuickRun let g:quickrun_config = {'outputter/buffer/close_on_empty': 1} """"""""""""""""""""""""comfortable-motion settings """""""""""""""""""""" let g:comfortable_motion_scroll_down_key = 'j' let g:comfortable_motion_scroll_up_key = 'k' " mouse settings noremap :call comfortable_motion#flick(40) noremap :call comfortable_motion#flick(-40) "}} "} "{ Colorscheme and highlight settings "{{ general settings about colors " enable true colors support (do not use this option if your terminal does not " support true colors. For a comprehensive list of terminals supporting true " colors, see https://github.com/termstandard/colors and " https://bit.ly/2InF97t) set termguicolors " use dark background (better for the eye, IMHO) set background=dark "}} "{{ colorscheme settings """"""""""""""""""""""""""""gruvbox settings""""""""""""""""""""""""""" " we should check if theme exists before using it, otherwise you will get " error message when starting Nvim if HasColorscheme('gruvbox') " italic options should be put before colorscheme setting, " see https://goo.gl/8nXhcp let g:gruvbox_italic=1 let g:gruvbox_contrast_dark='hard' colorscheme gruvbox else " fall back to a pre-installed theme colorscheme desert endif """"""""""""""""""""""""""" onedark.vim settings""""""""""""""""""""""""" " let g:onedark_terminal_italics = 1 " colorscheme onedark """"""""""""""""""""""""""" deus settings""""""""""""""""""""""""""""""""" " colorscheme deus """""""""""""""""""""""" challenger_deep settings"""""""""""""""""""""""" " colorscheme challenger_deep """"""""""""""""""""""""""" solarized8 settings""""""""""""""""""""""""" " solarized colorscheme without bullshit " let g:solarized_term_italics=1 " let g:solarized_visibility="high" " colorscheme solarized8_high """"""""""""""""""""""""""" sublimemonokai settings""""""""""""""""""""""""" " let g:sublimemonokai_term_italic = 1 " colorscheme sublimemonokai """"""""""""""""""""""""""" nord-vim settings""""""""""""""""""""""""" " let g:nord_italic = 1 " let g:nord_underline = 1 " let g:nord_italic_comments = 1 " colorscheme nord """"""""""""""""""""""""""" vim-one settings""""""""""""""""""""""""""""" " let g:one_allow_italics = 1 " colorscheme one """""""""""""""""""""""""""material.vim settings"""""""""""""""""""""""""" " let g:material_terminal_italics = 1 " " theme_style can be 'default', 'dark' or 'palenight' " let g:material_theme_style = 'default' " colorscheme material """""""""""""""""""""""""""vim-material settings"""""""""""""""""""""""""" " let g:material_style='palenight' " colorscheme vim-material "}} "{{ custom highlight group settings " change the color of popup menu for autocompletion " extracted from spf13-vim, see https://goo.gl/frRXHP " highlight Pmenu guifg=#000000 guibg=#F8F8F8 ctermfg=black ctermbg=Lightgray " highlight PmenuSbar guifg=#8A95A7 guibg=#F8F8F8 gui=NONE ctermfg=darkcyan " \ ctermbg=lightgray cterm=NONE " highlight PmenuThumb guifg=#F8F8F8 guibg=#8A95A7 gui=NONE ctermfg=lightgray " \ ctermbg=darkcyan cterm=NONE "custom highlight for ColorColumn " highlight ColorColumn ctermbg=235 guibg=#2c2d27 "}} "} "{ A list of resources which inspire me " this list is non-exhaustive as I can not remember the source of many " settings " - http://stevelosh.com/blog/2010/09/coming-home-to-vim/ " - https://github.com/tamlok/tvim/blob/master/.vimrc " - https://nvie.com/posts/how-i-boosted-my-vim/ " - https://blog.carbonfive.com/2011/10/17/vim-text-objects-the-definitive-guide/ " - https://sanctum.geek.nz/arabesque/vim-anti-patterns/ " - https://github.com/gkapfham/dotfiles/blob/master/.vimrc " The ascii art on the frontpage is generated using http://tinyurl.com/y6szckgd "}