Daniel Liu

I Need You To Tell Me That I’m A Good Person.

vim-config

2021年3月19日

" __ __ __ _____ __ __ ____ ____
" | / |_ _ \ \ / /_ | / | _ \ / |
" | |/| | | | | \ \ / / | || |/| | |
) | |
" | | | | |
| | \ V / | || | | | _ <| |
_
" || ||_, | _/ ||| ||| _\|
" |
/

" Todos
" - vimwiki
" - pylint reports error when doing vim ~/Github/vim-calc/build-up/calc.py
" instead of doing cd ~/Github/vim-calc/build-up and then do vim calc.py
" - hotkey to switch between light theme and dark theme (in progress, still
" some bugs

" ===
" === Auto load for first time uses
" ===
if empty(glob(‘~/.vim/autoload/plug.vim’))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

" ====================
" === Editor Setup ===
" ====================

" ===
" === System
" ===
set nocompatible
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
set mouse=a
set encoding=utf-8

set clipboard=unnamed

" Prevent incorrect backgroung rendering
let &t_ut=‘’

" ===
" === Main code display
" ===
set number
set relativenumber
set ruler
set cursorline
syntax enable
syntax on

" ===
" === Editor behavior
" ===
" Better tab
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set list
set listchars=tab:▸\ ,trail:▫
set scrolloff=5 " 页面上下多5行

" Prevent auto line split
set wrap
set tw=0

set indentexpr=
" Better backspace
set backspace=indent,eol,start

set foldmethod=indent
set foldlevel=99

" let &t_si = “<esc>]50;cursorshape=1\x7”
" let &t_sr = “<esc>]50;cursorshape=2\x7”
" let &t_ei = “<esc>]50;cursorshape=0\x7”

" ===
" === Window behaviors
" ===
set splitright
set splitbelow

" ===
" === Status/command bar
" ===
set laststatus=2
set autochdir
set showcmd
set formatoptions-=tc

" Show command autocomplete
set wildignore=log/,node_modules/,target/,tmp/,*.rbc
set wildmenu " show a navigable menu for tab completion
set wildmode=longest,list,full

" Searching options
set hlsearch
exec “nohlsearch”
set incsearch
set ignorecase
set smartcase

" ===
" === Restore Cursor Position
" ===
au BufReadPost * if line(“'”“) > 1 && line(”‘“”) <= line(“$”) | exe "normal! g’“” | endif

" ===
" === Basic Mappings
" ===

" Set as
let mapleader=" "

" Column (:) mods
map ; :
map q; q:
map / :!
map r :r !
map sr :%s/

" Save & quit
map Q :q
map S :w

" Open the vimrc file anytime
map rc :e ~/.vim/vimrc

" Undo operations
" noremap l u
" Undo in Insert mode
inoremap

" Insert Key
" noremap k i
" noremap K I

" Copy to system clipboard
vnoremap Y :w !xclip -i -sel c

" Search
map :nohlsearch
noremap = nzz
noremap - Nzz

" Duplicate words
map fd /(<\w+>)_s*\1

" Others
map o ou

" ===
" === Cursor Movement
" ===
"
" New cursor movement (the default arrow keys are used for resizing windows)
" ^
" u
" < n i >
" e
" v
" noremap u k
" noremap n h
" noremap e j
" noremap i l
" U/E keys for 5 times u/e (faster navigation)
noremap U 5k
noremap E 5j
" N key: go to the start of the line
" noremap N 0
" I key: go to the end of the line
" noremap I $

" Faster in-line navigation
noremap W 5w
noremap B 5b
" set h (same as n, cursor left) to ‘end of word’
" noremap h e

" Ctrl + U or E will move up/down the view port without moving the cursor
noremap 5
noremap 5
inoremap 5a
inoremap 5a

" ===
" === Window management
" ===
" Use + new arrow keys for moving the cursor around windows
map w w
map u k
map e j
map n h
map i l
"map r r

" Disabling the default s key
noremap s

" split the screens to up (horizontal), down (horizontal), left (vertical), right (vertical)
map su :set nosplitbelow:split:set splitbelow
map se :set splitbelow:split
map sn :set nosplitright:vsplit:set splitright
map si :set splitright:vsplit

" Resize splits with arrow keys
map :res +5
map :res -5
map :vertical resize-5
map :vertical resize+5

" Place the two screens up and down
noremap sh tK
" Place the two screens side by side
noremap sv tH

" Rotate screens
noremap srh bK
noremap srv bH

" ===
" === Tab management
" ===
" Create a new tab with tu
map tu :tabe
" Move around tabs with tn and ti
map tn :-tabnext
map ti :+tabnext
" Move the tabs with tmn and tmi
map tmn :-tabmove
map tmi :+tabmove

" ===
" === Other useful stuff
" ===

" Press space twice to jump to the next ‘<++>’ and edit it
map /<++>:nohlsearchc4i

" Toggle Spelling Check with sc
" <z=> 智能修改单词
map sc :set spell!
noremap beas
inoremap eas

" Press to change case (instead of ~) map ~

imap zza
nmap zz

" Auto change directory to current dir
autocmd BufEnter * silent! lcd %:p:h

" Call figlet
map tx :r !figlet

" Compile function
map r :call CompileRunGcc()
func! CompileRunGcc()
exec “w”
if &filetype == ‘c’
exec “!g++ % -o %<”
exec “!time ./%<”
elseif &filetype == ‘cpp’
exec “!g++ % -o %<”
exec “!time ./%<”
elseif &filetype == ‘java’
exec “!javac %”
exec “!time java %<”
elseif &filetype == ‘sh’
:!time bash %
elseif &filetype == ‘python’
silent! exec “!clear”
exec “!time python3 %”
elseif &filetype == ‘html’
exec “!firefox % &”
elseif &filetype == ‘markdown’
exec “MarkdownPreview”
elseif &filetype == ‘vimwiki’
exec “MarkdownPreview”
endif
endfunc

map R :call CompileBuildrrr()
func! CompileBuildrrr()
exec “w”
if &filetype == ‘vim’
exec “source $MYVIMRC”
elseif &filetype == ‘markdown’
exec “echo”
endif
endfunc

" ===
" === Install Plugins with Vim-Plug
" ===

call plug#begin(‘~/.vim/plugged’)

" Pretty Dress
Plug ‘vim-airline/vim-airline’
Plug ‘vim-airline/vim-airline-themes’
Plug ‘connorholyday/vim-snazzy’
Plug ‘NLKNguyen/papercolor-theme’
Plug ‘ayu-theme/ayu-vim’
Plug ‘bling/vim-bufferline’

" File navigation
Plug ‘scrooloose/nerdtree’, { ‘on’: ‘NERDTreeToggle’ }
Plug ‘Xuyuanp/nerdtree-git-plugin’
Plug ‘ctrlpvim/ctrlp.vim’, { ‘on’: ‘CtrlP’ }

" Taglist
Plug ‘majutsushi/tagbar’, { ‘on’: ‘TagbarOpenAutoClose’ }

" Error checking
Plug ‘w0rp/ale’

" Auto Complete
" Plug ‘Valloric/YouCompleteMe’
Plug ‘neoclide/coc.nvim’, {‘branch’: ‘release’}
" Plug ‘davidhalter/jedi-vim’

" Undo Tree
Plug ‘mbbill/undotree/’

" Snippits
" Plug ‘SirVer/ultisnips’ , { ‘for’: [‘vim-plug’, ‘python’] }
" Plug ‘honza/vim-snippets’, { ‘for’: [‘vim-plug’, ‘python’] }

" Other visual enhancement
Plug ‘nathanaelkane/vim-indent-guides’
Plug ‘itchyny/vim-cursorword’
Plug ‘tmhedberg/SimpylFold’

" Git
Plug ‘rhysd/conflict-marker.vim’
Plug ‘tpope/vim-fugitive’
Plug ‘mhinz/vim-signify’
Plug ‘gisphm/vim-gitignore’, { ‘for’: [‘gitignore’, ‘vim-plug’] }

" HTML, CSS, JavaScript, PHP, JSON, etc.
Plug ‘elzr/vim-json’
Plug ‘hail2u/vim-css3-syntax’
Plug ‘spf13/PIV’, { ‘for’ :[‘php’, ‘vim-plug’] }
Plug ‘gko/vim-coloresque’, { ‘for’: [‘vim-plug’, ‘php’, ‘html’, ‘javascript’, ‘css’, ‘less’] }
Plug ‘pangloss/vim-javascript’, { ‘for’ :[‘javascript’, ‘vim-plug’] }
Plug ‘mattn/emmet-vim’

" Python
Plug ‘vim-scripts/indentpython.vim’
" Plug ‘vim-python/python-syntax’, { ‘for’ :[‘python’, ‘vim-plug’] }

" Markdown
Plug ‘iamcco/markdown-preview.nvim’, { ‘do’: { -> mkdp#util#install_sync() }, ‘for’ :[‘markdown’, ‘vim-plug’] }
Plug ‘dhruvasagar/vim-table-mode’, { ‘on’: ‘TableModeToggle’ }
Plug ‘vimwiki/vimwiki’

" For general writing
Plug ‘reedes/vim-wordy’
Plug ‘ron89/thesaurus_query.vim’

" Bookmarks
Plug ‘kshenoy/vim-signature’

" Other useful utilities
Plug ‘jiangmiao/auto-pairs’
Plug ‘terryma/vim-multiple-cursors’
Plug ‘junegunn/goyo.vim’ " distraction free writing mode
Plug ‘ntpeters/vim-better-whitespace’, { ‘on’: [‘EnableWhitespace’, ‘ToggleWhitespace’] } "displays trailing whitespace (after :EnableWhitespace, vim slows down)
Plug ‘tpope/vim-surround’ " type ysks’ to wrap the word with ‘’ or type cs’to change 'word' toword`
Plug ‘godlygeek/tabular’ " type ;Tabularize /= to align the =
Plug ‘gcmt/wildfire.vim’ " in Visual mode, type i’ to select all text in ‘’, or type i) i] i} ip
Plug ‘scrooloose/nerdcommenter’ " in cc to comment a line

" Dependencies
Plug ‘MarcWeber/vim-addon-mw-utils’
Plug ‘kana/vim-textobj-user’
Plug ‘fadein/vim-FIGlet’

call plug#end()

" ===
" === Create a _machine_specific.vim file to adjust machine specific stuff, like python interpreter location
" ===
let has_machine_specific_file = 1
if empty(glob(‘~/.vim/_machine_specific.vim’))
let has_machine_specific_file = 0
exec “!cp ~/.vim/default_configs/_machine_specific_default.vim ~/.vim/_machine_specific.vim”
endif
source ~/.vim/_machine_specific.vim

" ===
" === Dress up my vim
" ===
map c1 :set background=dark:colorscheme snazzy:AirlineTheme dracula
map c2 :set background=light:colorscheme ayu:AirlineTheme ayu_light

set termguicolors " enable true colors support
let ayucolor=“light” " for light version of theme
" let ayucolor=“mirage” " for mirage version of theme
" let ayucolor=“dark” " for dark version of theme
colorscheme snazzy
let g:SnazzyTransparent = 1
set background=dark
let g:airline_theme=‘dracula’

let g:lightline = {
\ ‘active’: {
\ ‘left’: [[‘mode’, ‘paste’ ], [‘readonly’, ‘filename’, ‘modified’]],
\ ‘right’: [[‘lineinfo’], [‘percent’], [‘fileformat’, ‘fileencoding’]]
\ }
\ }

" set statusline+=%#warningmsg#
" set statusline+=%{SyntasticStatuslineFlag()}
" set statusline+=%*

" ===
" === NERDTree
" ===
map tt :NERDTreeToggle
let NERDTreeMapOpenExpl = “”
let NERDTreeMapUpdir = “”
let NERDTreeMapUpdirKeepOpen = “l”
let NERDTreeMapOpenSplit = “”
let NERDTreeOpenVSplit = “”
let NERDTreeMapActivateNode = “i”
let NERDTreeMapOpenInTab = “o”
let NERDTreeMapPreview = “”
let NERDTreeMapCloseDir = “n”
let NERDTreeMapChangeRoot = “y”

" ===
" === You Complete ME
" ===
nnoremap gd :YcmCompleter GoToDefinitionElseDeclaration
nnoremap g/ :YcmCompleter GetDoc
nnoremap gt :YcmCompleter GetType
nnoremap gr :YcmCompleter GoToReferences
let g:ycm_autoclose_preview_window_after_completion=0
let g:ycm_autoclose_preview_window_after_insertion=1
let g:ycm_use_clangd = 0
let g:ycm_python_binary_path = g:ycm_python_interpreter_path
"let g:ycm_python_interpreter_path = system(‘which python3’)
"let g:ycm_python_binary_path = system(‘which python3’)
"let g:ycm_key_list_select_completion = [‘’, ‘’, ‘’]
"let g:ycm_key_list_previous_completion = [‘’, ‘’, ‘’]

" ===
" === vim-indent-guide
" ===
let g:indent_guides_guide_size = 1
let g:indent_guides_start_level = 2
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_color_change_percent = 1
silent! unmap ig
autocmd WinEnter * silent! unmap ig

" ===
" === ale
" ===
let b:ale_linters = [] "[‘pylint’]
" let b:ale_fixers = [‘autopep8’, ‘yapf’]
let g:ale_python_pylint_options = “–extension-pkg-whitelist=pygame”

" ===
" === MarkdownPreview
" ===
let g:mkdp_auto_start = 0
let g:mkdp_auto_close = 1
let g:mkdp_refresh_slow = 0
let g:mkdp_command_for_global = 0
let g:mkdp_open_to_the_world = 0
let g:mkdp_open_ip = ‘’
let g:mkdp_browser = ‘chromium’
let g:mkdp_echo_preview_url = 0
let g:mkdp_browserfunc = ‘’
let g:mkdp_preview_options = {
\ ‘mkit’: {},
\ ‘katex’: {},
\ ‘uml’: {},
\ ‘maid’: {},
\ ‘disable_sync_scroll’: 0,
\ ‘sync_scroll_type’: ‘middle’,
\ ‘hide_yaml_meta’: 1
\ }
let g:mkdp_markdown_css = ‘’
let g:mkdp_highlight_css = ‘’
let g:mkdp_port = ‘’
let g:mkdp_page_title = ‘「${name}」’

" ===
" === Python-syntax
" ===
let g:python_highlight_all = 1
" let g:python_slow_sync = 0

" ===
" === Taglist
" ===
map T :TagbarOpenAutoClose

" ===
" === vim-table-mode
" ===
map tm :TableModeToggle

" ===
" === CtrlP
" ===
map :CtrlP

" ===
" === vim-better-whitespace
" ===
let g:better_whitespace_enabled=0

" ===
" === Goyo
" ===
map gy :Goyo

" ===
" === CtrlP
" ===
let g:ctrlp_prompt_mappings = {
\ ‘PrtSelectMove(“j”)’: [‘’, ‘’],
\ ‘PrtSelectMove(“k”)’: [‘’, ‘’],
\ }

" ===
" === vim-signiture
" ===
let g:SignatureMap = {
\ ‘Leader’ : “m”,
\ ‘PlaceNextMark’ : “m,”,
\ ‘ToggleMarkAtLine’ : “m.”,
\ ‘PurgeMarksAtLine’ : “dm-”,
\ ‘DeleteMark’ : “dm”,
\ ‘PurgeMarks’ : “dm/”,
\ ‘PurgeMarkers’ : “dm?”,
\ ‘GotoNextLineAlpha’ : “m”,
\ ‘GotoPrevLineAlpha’ : “”,
\ ‘GotoNextSpotAlpha’ : “m”,
\ ‘GotoPrevSpotAlpha’ : “”,
\ ‘GotoNextLineByPos’ : “”,
\ ‘GotoPrevLineByPos’ : “”,
\ ‘GotoNextSpotByPos’ : “mn”,
\ ‘GotoPrevSpotByPos’ : “mp”,
\ ‘GotoNextMarker’ : “”,
\ ‘GotoPrevMarker’ : “”,
\ ‘GotoNextMarkerAny’ : “”,
\ ‘GotoPrevMarkerAny’ : “”,
\ ‘ListLocalMarks’ : “m/”,
\ ‘ListLocalMarkers’ : “m?”
\ }

" ===
" === Undotree
" ===
let g:undotree_DiffAutoOpen = 0
map L :UndotreeToggle

" ===
" === UltiSnip
" ===
autocmd WinEnter * silent! iunmap
autocmd WinEnter * silent! unmap
autocmd WinEnter * silent! vunmap
let g:UltiSnipsExpandTrigger = ‘
let g:UltiSnipsJumpForwardTrigger = ‘
"let g:UltiSnipsJumpBackwardTrigger = ‘

" ==
" == NERDTree-git
" ==
let g:NERDTreeIndicatorMapCustom = {
\ “Modified” : “✹”,
\ “Staged” : “✚”,
\ “Untracked” : “✭”,
\ “Renamed” : “➜”,
\ “Unmerged” : “═”,
\ “Deleted” : “✖”,
\ “Dirty” : “✗”,
\ “Clean” : “✔︎”,
\ “Unknown” : “?”
\ }

" Testring my own plugin
if !empty(glob(‘~/Github/vim-calc/vim-calc.vim’))
source ~/Github/vim-calc/vim-calc.vim
endif
" map a :call Calc()

" ==
" == vim-multiple-cursor
" ==
let g:multi_cursor_use_default_mapping=0
let g:multi_cursor_start_word_key = ‘
let g:multi_cursor_select_all_word_key = ‘
let g:multi_cursor_start_key = ‘g
let g:multi_cursor_select_all_key = ‘g
let g:multi_cursor_next_key = ‘
let g:multi_cursor_prev_key = ‘
let g:multi_cursor_skip_key = ‘
let g:multi_cursor_quit_key = ‘

let g:vimwiki_list = [{
\ ‘automatic_nested_syntaxes’:1,
\ ‘path_html’: ‘~/wiki_html’,
\ ‘path’: ‘~/wiki’,
\ ‘template_path’: ‘~/.vim/vimwiki/template/’,
\ ‘syntax’: ‘markdown’,
\ ‘ext’:‘.md’,
\ ‘template_default’:‘markdown’,
\ ‘custom_wiki2html’: ‘~/.vim/vimwiki/wiki2html.sh’,
\ ‘template_ext’:‘.html’
}]

au BufRead,BufNewFile *.md set filetype=vimwiki

let g:taskwiki_sort_orders={“C”: “pri-”}
let g:taskwiki_syntax = ‘markdown’
let g:taskwiki_markdown_syntax=‘markdown’
let g:taskwiki_markup_syntax=‘markdown’
source ~/.vim/snippits.vim

" === Experimenting coc.nvim features
set timeoutlen=100
set cmdheight=2

inoremap :set cmdheight=2a
inoremap :set cmdheight=10a
nnoremap :set cmdheight=2
nnoremap :set cmdheight=10

set updatetime=1000
set shortmess+=c
set signcolumn=yes
inoremap
\ pumvisible() ? “<C-n>” :
\ check_back_space() ? “<TAB>” :
\ coc#refresh()
inoremap pumvisible() ? “<C-p>” : “<C-h>”

function! s:check_back_space() abort
let col = col(‘.’) - 1
return !col || getline(‘.’)[col - 1] =~# ‘\s’
endfunction
" Use to confirm completion, <C-g>u means break undo chain at current position.
" Coc only does snippet and additional edit on confirm.
inoremap pumvisible() ? “<C-y>” : “<C-g>u<CR>”
" Use K to show documentation in preview window
nnoremap ? :call show_documentation()
function! s:show_documentation()
if (index([‘vim’,‘help’], &filetype) >= 0)
execute ‘h ‘.expand(’’)
else
call CocAction(‘doHover’)
endif
endfunction

" Highlight symbol under cursor on CursorHold
autocmd CursorHold * silent call CocActionAsync(‘highlight’)
"
" Open the _machine_specific.vim file if it has just been created
if has_machine_specific_file == 0
exec “e ~/.vim/_machine_specific.vim”
endif

不许转载😡!!!

Buy me a cup of coffee ☕.