""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " _ _ _ _____ __ _ " " | \ | | (_) / ____| / _(_) " " | \| |_ ___ _ __ ___ | | ___ _ __ | |_ _ __ _ " " | . ` \ \ / / | '_ ` _ \ | | / _ \| '_ \| _| |/ _` | " " | |\ |\ V /| | | | | | | | |___| (_) | | | | | | | (_| | " " |_| \_| \_/ |_|_| |_| |_| \_____\___/|_| |_|_| |_|\__, | " " __/ | " " |___/ " " " """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " The above ASCII art is generated using service provided in this webpage: " http://tinyurl.com/y6szckgd. "{ Header and Licence "{{ header info " Description: This is my Neovim 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 it is " very long (more than 1000 lines!), you should read it carefully and " take only 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: Jie-dong Hao " Email: jdhao@hotmail.com " Update: 2019-09-17 17:35:03+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. Change this variable " in accordance with your system. if executable('python') " The output of `system()` function contains a newline character which " should be removed, see https://vi.stackexchange.com/a/2868/15292 if has('win32') let g:python3_host_prog=substitute(system('where python'), '.exe\n\+$', '', 'g') elseif has('unix') let g:python3_host_prog=substitute(system('which python'), '\n\+$', '', 'g') endif else echoerr 'Python executable not found! You must install Python and set its PATH!' endif " Custom mapping (see `:h mapleader` for more info) let mapleader = ',' "}} "{{ Disable loading certain plugins " 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 checking files inside compressed files) let g:loaded_zipPlugin = 1 let loaded_gzip = 1 let g:loaded_tarPlugin = 1 " Do not use builtin matchit.vim and matchparen.vim let loaded_matchit = 1 let g:loaded_matchparen = 1 "}} "} "{ 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 good-old paste mode set pastetoggle= " Split window below/right when creating horizontal/vertical windows set splitbelow splitright " Time in milliseconds to wait for a mapped sequence to complete, " see https://goo.gl/vHvyu8 for more info set timeoutlen=500 " For CursorHold events set updatetime=2000 " 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 matching pairs of characters and highlight matching brackets set matchpairs+=<:>,「:」 " Show line number and relative line number set number relativenumber " Ignore case in general, but become case-sensitive when uppercase is present set ignorecase smartcase " File and script 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 " Break line at predefined characters set linebreak " Character to show before the lines that have been soft-wrapped set showbreak=↪ " List all items and start selecting matches in cmd completion set wildmode=list:full " Show current line where the cursor is set cursorline " Set a ruler at column 80, see https://goo.gl/vEkF5i set colorcolumn=80 " Minimum lines to keep above and below cursor when scrolling set scrolloff=3 " Use mouse to select and resize windows, etc. if has('mouse') set mouse=nv " Enable mouse in several mode set mousemodel=popup " Set the behaviour of mouse endif " Do not show mode on command line since vim-airline can show it set noshowmode " Fileformats to use for new files set fileformats=unix,dos " The mode in which cursorline text can be concealed set concealcursor=nc " The way to show the result of substitution in real time for preview set inccommand=nosplit " Ignore certain files and 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 errors, do not use errorbells set visualbell noerrorbells " The level we start to fold set foldlevel=0 " The number of command and search history to keep set history=500 " Use list mode and customized listchars set list listchars=tab:▸\ ,extends:❯,precedes:❮,nbsp:+ " Auto-write the file based on some condition set autowrite " Show hostname, full path of file and last-mod 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()}\ \ %{expand('%:p')}\ \ %{strftime('%Y-%m-%d\ %H:%M',getftime(expand('%')))} " Persistent undo even after you close a file and re-open it set undofile " Do not show "match xx of xx" and other messages during auto-completion set shortmess+=c " Completion behaviour set completeopt+=noinsert " Auto select the first completion entry set completeopt+=menuone " Show menu even if there is only one item set completeopt-=preview " Disable the preview window " Settings for popup menu set pumheight=15 " Maximum number of items to show in popup menu set pumblend=5 " Pesudo blend effect for popup menu " Scan files given by `dictionary` option set complete+=k,kspell complete-=w complete-=b complete-=u complete-=t " Dictionary files for different systems let g:MY_DICT = expand(stdpath('config') . '/dict/words') let &dictionary = &dictionary . ',' . g:MY_DICT set spelllang=en,cjk " Spell languages " Align indent to next multiple value of shiftwidth. For its meaning, " see http://tinyurl.com/y5n87a6m set shiftround " Virtual edit is useful for visual block edit set virtualedit=block " Correctly break multi-byte characters such as CJK, " see http://tinyurl.com/y4sq6vf3 set formatoptions+=mM " Tilde (~) is an operator, thus must be followed by motions like `e` or `w`. set tildeop " Do not add two space after a period when joining lines or formatting texts, " see https://tinyurl.com/y3yy9kov set nojoinspaces set ambiwidth=double "} "{ Custom key mappings " Save key strokes (now we do not need to press shift to enter command mode). " Vim-sneak has also mapped `;`, so using the below mapping will break the map " used by vim-sneak nnoremap ; : xnoremap ; : " Quicker way to open command window nnoremap q; q: " Quicker in insert mode inoremap jk " Turn the word under cursor to upper case inoremap viwUea " Turn the current word into title case inoremap b~lea " Paste non-linewise text above or below current cursor, " see https://stackoverflow.com/a/1346777/6064933 nnoremap p m`op`` nnoremap P m`Op`` " Shortcut for faster save and quit nnoremap w :update " Saves the file if modified and quit nnoremap q :x " Quit all opened buffers nnoremap Q :qa " Navigation in the location and quickfix list nnoremap [l :lpreviouszv nnoremap ]l :lnextzv nnoremap [L :lfirstzv nnoremap ]L :llastzv nnoremap [q :cpreviouszv nnoremap ]q :cnextzv nnoremap [Q :cfirstzv nnoremap ]Q :clastzv " Close location list or quickfix list if they are present, " see https://goo.gl/uXncnS nnoremap \x :windo lclose cclose " Close a buffer and switching to another buffer, do not close the " window, see https://goo.gl/Wd8yZJ nnoremap \d :bprevious bdelete # " Toggle search highlight, see https://goo.gl/3H85hh nnoremap hl (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n" " Disable arrow key in vim, see https://goo.gl/s1yfh4. 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`' . v:count1 . 'o``' nnoremap OO 'm`' . v:count1 . 'O``' " nnoremap oo @='m`o``' " nnoremap OO @='m`O``' " the following two mappings work, but if you change double quote to single, it " will not work " nnoremap oo @="m`o\Esc>``" " nnoremap oo @="m`o\e``" " Insert a space after current character nnoremap ah " Yank from current cursor position to the end of the line (make it " consistent with the behavior of D, C) nnoremap Y y$ " Move the cursor based on physical lines, not the actual lines. nnoremap j (v:count == 0 ? 'gj' : 'j') nnoremap k (v:count == 0 ? 'gk' : 'k') nnoremap ^ g^ nnoremap 0 g0 " Do not include white space characters when using $ in visual mode, " see https://goo.gl/PkuZox xnoremap $ g_ " Jump to matching pairs easily in normal mode nnoremap % " Go to start or end of line easier nnoremap H ^ xnoremap H ^ nnoremap L g_ xnoremap L g_ " Resize windows using and h,j,k,l, inspiration from " https://goo.gl/vVQebo (bottom page). " If you enable mouse support, shorcuts below may not be necessary. nnoremap < nnoremap > 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 xnoremap < >gv " When completion menu is shown, use to select an item " and do not add an annoying newline. Otherwise, is 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())?("\"):("\")) " Edit and reload init.vim quickly nnoremap ev :edit $MYVIMRC nnoremap sv :silent update $MYVIMRC source $MYVIMRC \ echomsg "Nvim config successfully reloaded!" " Reselect the text that has just been pasted nnoremap v `[V`] " Use sane regex expression (see `:h magic` for more info) nnoremap / /\v " Find and replace (like Sublime Text 3) nnoremap :%s/ xnoremap :s/ " Change current working directory locally and print cwd after that, " see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file nnoremap cd :lcd %:p:h:pwd " Use Esc to quit builtin terminal tnoremap " Toggle spell checking (autosave does not play well with z=, so we disable it " when we are doing spell checking) nnoremap :set spell! :AutoSaveToggle inoremap :set spell! :AutoSaveToggle " Decrease indent level in insert mode with shift+tab inoremap < :call utils#StripTrailingWhitespaces() " check the syntax group of current cursor position nnoremap st :call utils#SynGroup() "} "{ Auto commands " 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 BufNewFile,BufRead *.md,*.MD,*.markdown setlocal textwidth=79 augroup END augroup term_settings autocmd! " Do not use number and relative number for terminal inside nvim autocmd TermOpen * setlocal norelativenumber nonumber " Go to insert mode by default to start typing command autocmd TermOpen * 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 augroup resume_edit_position autocmd! autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit' \ | execute "normal! g`\"zvzz" \ | endif augroup END " Display a message when the current file is not in utf-8 format. " Note that we need to use `unsilent` command here because of this issue: " https://github.com/vim/vim/issues/4379 augroup non_utf8_file_warn autocmd! autocmd BufRead * if &fileencoding != 'utf-8' \ | unsilent echomsg 'File not in UTF-8 format!' | endif augroup END " Automatically reload the file if it is changed outside of Nvim, see " https://unix.stackexchange.com/a/383044/221410. It seems that `checktime` " command does not work in command line. We need to check if we are in command " line before executing this command. See also http://tinyurl.com/y6av4sy9. augroup auto_read autocmd! autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * \ if mode() == 'n' && getcmdwintype() == '' | checktime | endif autocmd FileChangedShellPost * echohl WarningMsg \ | echo "File changed on disk. Buffer reloaded!" | echohl None augroup END "} "{ Plugin installation "{{ Vim-plug Install and related settings " Auto-install vim-plug on different systems if it does not exist. " For Windows, only Windows 10 with curl installed are supported (after " Windows 10 build 17063, source: http://tinyurl.com/y23972tt). " The following script to install vim-plug is adapted from vim-plug " wiki: https://github.com/junegunn/vim-plug/wiki/tips#tips if !executable('curl') echomsg 'You have to install curl to install vim-plug. Or install ' \ . 'vim-plug yourself following the guide on vim-plug git repo' else let g:VIM_PLUG_PATH = expand(stdpath('config') . '/autoload/plug.vim') if empty(glob(g:VIM_PLUG_PATH)) echomsg 'Installing Vim-plug on your system' silent execute '!curl -fLo ' . g:VIM_PLUG_PATH . ' --create-dirs ' \ . 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' augroup plug_init autocmd! autocmd VimEnter * PlugInstall --sync | quit |source $MYVIMRC augroup END endif endif " Set up directory to install the plugins based on the platform let g:PLUGIN_HOME=expand(stdpath('data') . '/plugged') "}} "{{ Autocompletion related plugins call plug#begin(g:PLUGIN_HOME) " Auto-completion Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " Python source for deoplete Plug 'zchee/deoplete-jedi', { 'for': 'python' } " Vim source for deoplete Plug 'Shougo/neco-vim', { 'for': 'vim' } " Insert mode completion Plug 'ervandew/supertab' "}} "{{ Python-related plugins " Python completion, goto definition etc. Plug 'davidhalter/jedi-vim', { 'for': 'python' } " Python syntax highlighting and more Plug 'numirias/semshi', { 'do': ':UpdateRemotePlugins', 'for': 'python' } " Python indent (follows the PEP8 style) Plug 'Vimjas/vim-python-pep8-indent', {'for': 'python'} " Python code folding Plug 'tmhedberg/SimpylFold', { 'for': 'python' } "}} "{{ Search related plugins " 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' " Stay after pressing * and search selected text Plug 'haya14busa/vim-asterisk' " File search, tag search and more if has('win32') Plug 'Yggdroot/LeaderF' else Plug 'Yggdroot/LeaderF', { 'do': './install.sh' } endif " 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 " Another similar plugin is command-t " Plug 'wincent/command-t' " Another grep tool (similar to Sublime Text Ctrl+Shift+F) " Plug 'dyng/ctrlsf.vim' " A greping tool " Plug 'mhinz/vim-grepper', { 'on': ['Grepper', '(GrepperOperator)'] } "}} "{{ UI: Color, theme etc. " A list of colorscheme plugin you may want to try. Find what suits you. Plug 'lifepillar/vim-gruvbox8' Plug 'sjl/badwolf' Plug 'ajmwagar/vim-deus' " Plug 'sainnhe/vim-color-desert-night' " Plug 'YorickPeterse/happy_hacking.vim' " Plug 'lifepillar/vim-solarized8' " Plug 'sickill/vim-monokai' " Plug 'whatyouhide/vim-gotham' " Plug 'rakr/vim-one' " Plug 'kaicataldo/material.vim' " colorful status line and theme Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' "}} "{{ Plugin to deal with URL " Highlight URLs inside vim Plug 'itchyny/vim-highlighturl' " For Windows and Mac, we can open an URL in the browser. For Linux, it may " not be possible since we maybe in a server which disables GUI. 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 your tags Plug 'ludovicchabant/vim-gutentags' " show file tags in vim window Plug 'majutsushi/tagbar', { 'on': ['TagbarToggle', 'TagbarOpen'] } endif "}} "{{ File editting plugin " Snippet engine and snippet template Plug 'SirVer/ultisnips' Plug 'honza/vim-snippets' " Automatic insertion and deletion of a pair of characters Plug 'jiangmiao/auto-pairs' " Comment plugin Plug 'scrooloose/nerdcommenter' " Multiple cursor plugin like Sublime Text? " 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' " Manage your yank history if has('win32') || has('macunix') Plug 'svermeulen/vim-yoink' endif " Show marks in sign column for quicker navigation Plug 'kshenoy/vim-signature' " Another good plugin to show signature " Plug 'jeetsukumaran/vim-markology' " Handy unix command inside Vim (Rename, Move etc.) Plug 'tpope/vim-eunuch' " Repeat vim motions Plug 'tpope/vim-repeat' " Show the content of register in preview window " Plug 'junegunn/vim-peekaboo' " IME toggle for Mac if has('macunix') Plug 'rlue/vim-barbaric' endif "}} "{{ Linting, formating " Syntax check and make Plug 'neomake/neomake' " Another linting plugin " Plug 'w0rp/ale' " Auto format tools " Plug 'sbdchd/neoformat' " Plug 'Chiel92/vim-autoformat' "}} "{{ Git related plugins " Show git change (change, delete, add) signs in vim sign column Plug 'mhinz/vim-signify' " Another similar plugin " Plug 'airblade/vim-gitgutter' " 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 to help you focus 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' } " 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'] } " Markdown previewing (only for Mac and Windows) if has('win32') || has('macunix') Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug'] } endif "}} "{{ 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' "}} "{{ LaTeX editting and previewing plugin " Only use these plugin on Windows and Mac and when LaTeX is installed 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' " 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, e.g., `pi`, then press , the alias will be expanded " to the full command automatically call utils#Cabbrev('pi', 'PlugInstall') call utils#Cabbrev('pud', 'PlugUpdate') call utils#Cabbrev('pug', 'PlugUpgrade') call utils#Cabbrev('ps', 'PlugStatus') call utils#Cabbrev('pc', 'PlugClean') "}} "{{ Auto-completion related """""""""""""""""""""""""""" deoplete settings"""""""""""""""""""""""""" " Wheter to enable deoplete automatically after start nvim let g:deoplete#enable_at_startup = 1 " Maximum candidate window width call deoplete#custom#source('_', 'max_menu_width', 80) " Minimum character length needed to activate auto-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'] " \ }) 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 number limit call deoplete#custom#option('max_list', 30) " The number of processes used for the deoplete parallel feature. call deoplete#custom#option('num_processes', 16) " The delay for completion after input, measured in milliseconds. call deoplete#custom#option('auto_complete_delay', 100) " Enable 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 " Tab-complete, see https://goo.gl/LvwZZY " inoremap pumvisible() ? "\" : "\" """""""""""""""""""""""""UltiSnips settings""""""""""""""""""" " Trigger configuration. Do not use if you use YouCompleteMe let g:UltiSnipsExpandTrigger='' " Shortcut to jump forward and backward in tabstop positions let g:UltiSnipsJumpForwardTrigger='' let g:UltiSnipsJumpBackwardTrigger='' " Configuration for custom snippets directory, see " https://jdhao.github.io/2019/04/17/neovim_snippet_s1/ for details. 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 = '' "}} "{{ Python-related """"""""""""""""""deoplete-jedi settings""""""""""""""""""""""""""" " Whether to show doc string let g:deoplete#sources#jedi#show_docstring = 0 " For large package, set autocomplete wait time longer let g:deoplete#sources#jedi#server_timeout = 50 " Ignore jedi errors during completion let g:deoplete#sources#jedi#ignore_errors = 1 """"""""""""""""""""""""jedi-vim settings""""""""""""""""""" " Disable autocompletion, because I use deoplete for auto-completion let g:jedi#completions_enabled = 0 " Whether to show function call signature let g:jedi#show_call_signatures = '0' """""""""""""""""""""""""" semshi settings """"""""""""""""""""""""""""""" " Do not highlight for all occurances of 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 """""""""""""""""""""""""" simpylFold settings """"""""""""""""""""""""""""""" " Do not fold docstring let g:SimpylFold_fold_docstring = 0 "}} "{{ Search related """""""""""""""""""""""""""""vim-sneak settings""""""""""""""""""""""" " Use sneak label mode let g:sneak#label = 1 nmap f Sneak_s xmap f Sneak_s onoremap f :call sneak#wrap(v:operator, 2, 0, 1, 1) nmap F Sneak_S xmap F Sneak_S onoremap F :call sneak#wrap(v:operator, 2, 1, 1, 1) " Immediately after entering sneak mode, you can press f and F to go to next " or previous match let g:sneak#s_next = 1 """"""""""""""""""""""""""""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""""""""""""""""""""""" " Do not show search index in statusline since it is shown on command line let g:airline#extensions#anzu#enabled = 0 " Maximum number of words to search let g:anzu_search_limit = 500000 """""""""""""""""""""""""""""vim-asterisk settings""""""""""""""""""""" nmap * (asterisk-z*)(is-nohl-1) nmap # (asterisk-z#)(is-nohl-1) nmap g* (asterisk-gz*)(is-nohl-1) nmap g# (asterisk-gz#)(is-nohl-1) """""""""""""""""""""""""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 """""""""""""""""""""""""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' let $FZF_DEFAULT_OPTS = '--layout=reverse' " Floating windows only works for latest nvim version. " 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 "{{ Navigation and tags """"""""""""""""""""""" nerdtree settings """""""""""""""""""""""""" " Toggle nerdtree window and keep cursor in file window, " adapted from http://tinyurl.com/y2kt8cy9 nnoremap s :NERDTreeToggle:wincmd p " Reveal currently editted file in nerdtree widnow, " see https://goo.gl/kbxDVK nnoremap f :NERDTreeFind " Ignore certain files and folders let NERDTreeIgnore = ['\.pyc$', '^__pycache__$'] " 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 t :TagbarToggle "}} "{{ File editting """"""""""""""""""""""""""""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 " A list of events to trigger autosave let g:auto_save_events = ['InsertLeave', 'TextChanged'] " let g:auto_save_events = ['InsertLeave'] " Show autosave status on command line let g:auto_save_silent = 0 """"""""""""""""""""""""""""vim-yoink settings""""""""""""""""""""""""" if has('win32') || has('macunix') " ctrl-n and ctrl-p will not work if you add the TextChanged event to " vim-auto-save events " 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) " Do 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-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 """""""""""""""""""""""""""""" neomake settings """"""""""""""""""""""" " When to activate neomake call neomake#configure#automake('nrw', 50) " Change warning signs and color, see https://goo.gl/eHcjSq. let g:neomake_warning_sign={'text': '!', 'texthl': 'NeomakeWarningSign'} let g:neomake_error_sign={'text': '✗'} " Linters enabled for Python source file linting let g:neomake_python_enabled_makers = ['pylint'] " Whether to open quickfix or location list automatically let g:neomake_open_list = 0 " Which linter to use for TeX source files let g:neomake_tex_enabled_makers = [] "}} "{{ 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""""""""""""""""""""""""" " Whether to 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 " Shortcuts to start and stop markdown previewing nnoremap :MarkdownPreview nnoremap :MarkdownPreviewStop 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 = { \ 'build_dir' : 'build', \} " TOC settings let g:vimtex_toc_config = { \ 'name' : 'TOC', \ 'layers' : ['content', 'todo', 'include'], \ 'resize' : 1, \ 'split_width' : 30, \ '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 "}} "{{ UI: Status line, look """""""""""""""""""""""""""vim-airline setting"""""""""""""""""""""""""""""" " Set airline theme to a random one if it exists let s:candidate_airlinetheme = ['ayu_mirage', 'base16_flat', \ 'base16_grayscale', 'lucius', 'base16_tomorrow', 'ayu_dark', \ 'base16_adwaita', 'biogoo', 'distinguished', 'jellybeans', \ 'luna', 'raven', 'seagull', 'term', 'vice', 'zenburn', 'tomorrow'] let s:idx = utils#RandInt(0, len(s:candidate_airlinetheme)-1) let s:theme = s:candidate_airlinetheme[s:idx] if utils#HasAirlinetheme(s:theme) let g:airline_theme=s:theme endif " Tabline settings let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#formatter = 'unique_tail_improved' " 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 " Buffer number display format let g:airline#extensions#tabline#buffer_nr_format = '%s. ' " Whether to show function or other tags on status line let g:airline#extensions#tagbar#enabled = 1 " Skip empty sections if there are nothing to show, " extracted from https://vi.stackexchange.com/a/9637/15292 let g:airline_skip_empty_sections = 1 " Whether to use powerline symbols, see https://goo.gl/XLY19H. let g:airline_powerline_fonts = 0 if !exists('g:airline_symbols') let g:airline_symbols = {} endif let g:airline_symbols.branch = '⎇' let g:airline_symbols.paste = 'ρ' let g:airline_symbols.spell = 'Ꞩ' " Only show git hunks which are non-zero let g:airline#extensions#hunks#non_zero_only = 1 " Speed up airline let g:airline_highlighting_cache = 1 "}} "{{ 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 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 utils#HasColorscheme('gruvbox8') " Italic options should be put before colorscheme setting, " see https://goo.gl/8nXhcp let g:gruvbox_italics=1 let g:gruvbox_italicize_strings=1 let g:gruvbox_filetype_hi_groups = 0 let g:gruvbox_plugin_hi_groups = 0 colorscheme gruvbox8_hard else colorscheme desert endif """"""""""""""""""""""""""" deus settings""""""""""""""""""""""""""""""""" " colorscheme deus """"""""""""""""""""""""""" solarized8 settings""""""""""""""""""""""""" " Solarized colorscheme without bullshit " let g:solarized_term_italics=1 " let g:solarized_visibility="high" " colorscheme solarized8_high """"""""""""""""""""""""""" 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 = 'dark' " colorscheme material """""""""""""""""""""""""""badwolf settings"""""""""""""""""""""""""" " let g:badwolf_darkgutter = 0 " " Make the tab line lighter than the background. " let g:badwolf_tabline = 2 " colorscheme badwolf "}} "} "{ 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 "}