" __ __ __ _____ __ __ ____ ____
" | / |_ _ \ \ / /_ | / | _ \ / |
" | |/| | | | | \ \ / / | || |/| | |) | |
" | | | | || | \ 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
let mapleader=" "
" Column (:) mods
map ; :
map q; q:
map
map
map
" Save & quit
map Q :q
map S :w
" Open the vimrc file anytime
map
" 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
noremap = nzz
noremap - Nzz
" Duplicate words
map
" Others
map
" ===
" === 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
noremap
inoremap
inoremap
" ===
" === Window management
" ===
" Use
map
map
map
map
map
"map
" Disabling the default s key
noremap s
" split the screens to up (horizontal), down (horizontal), left (vertical), right (vertical)
map su :set nosplitbelow
map se :set splitbelow
map sn :set nosplitright
map si :set splitright
" Resize splits with arrow keys
map
map
map
map
" Place the two screens up and down
noremap sh
" Place the two screens side by side
noremap sv
" Rotate screens
noremap srh
noremap srv
" ===
" === 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
" Toggle Spelling Check with
" <z=> 智能修改单词
map
noremap
inoremap
" Press to change case (instead of ~) map
~
imap
nmap
" 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' to
word`
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
" 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
map
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
autocmd WinEnter * silent! unmap
" ===
" === 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
" ===
" === vim-table-mode
" ===
map
" ===
" === CtrlP
" ===
map
" ===
" === vim-better-whitespace
" ===
let g:better_whitespace_enabled=0
" ===
" === Goyo
" ===
map
" ===
" === 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
" ==
" == 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
inoremap
nnoremap
nnoremap
set updatetime=1000
set shortmess+=c
set signcolumn=yes
inoremap
\ pumvisible() ? “<C-n>” :
\
\ coc#refresh()
inoremap
function! s:check_back_space() abort
let col = col(‘.’) - 1
return !col || getline(‘.’)[col - 1] =~# ‘\s’
endfunction
" Use <C-g>u
means break undo chain at current position.
" Coc only does snippet and additional edit on confirm.
inoremap
" Use K to show documentation in preview window
nnoremap ? :call
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