diff --git a/autocommands.vim b/autocommands.vim new file mode 100644 index 0000000..c400791 --- /dev/null +++ b/autocommands.vim @@ -0,0 +1,61 @@ +"{ 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 +"} diff --git a/init.vim b/init.vim index 42e1ba9..fc0babd 100644 --- a/init.vim +++ b/init.vim @@ -49,1372 +49,13 @@ "}} "} -"{ 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' -Plug 'mhinz/vim-startify' -"}} - -"{{ 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 -"}} +"{ Main configurations +source variables.vim +source options.vim +source autocommands.vim +source mappings.vim +source plugins.vim +source ui.vim "} "{ A list of resources which inspire me diff --git a/mappings.vim b/mappings.vim new file mode 100644 index 0000000..ec7b6fa --- /dev/null +++ b/mappings.vim @@ -0,0 +1,170 @@ +"{ 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() +"} diff --git a/options.vim b/options.vim new file mode 100644 index 0000000..1aa7b38 --- /dev/null +++ b/options.vim @@ -0,0 +1,156 @@ +"{ 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 +"} diff --git a/plugins.vim b/plugins.vim new file mode 100644 index 0000000..6aabec6 --- /dev/null +++ b/plugins.vim @@ -0,0 +1,881 @@ +"{ 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' +Plug 'mhinz/vim-startify' +"}} + +"{{ 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) +"}} +"} diff --git a/ui.vim b/ui.vim new file mode 100644 index 0000000..64b5c50 --- /dev/null +++ b/ui.vim @@ -0,0 +1,54 @@ +"{ 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 +"}} +"} diff --git a/variables.vim b/variables.vim new file mode 100644 index 0000000..febf67d --- /dev/null +++ b/variables.vim @@ -0,0 +1,40 @@ +"{ Global 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 +"}} +"}