" If anything not work as expected. Please make sure all plugins " are installed by running: " :PlugInstall " " Content " ('#' jump to the topic) " " Plugin_Install " Plugin_Preferences " Theme_Appearance " Key_Mappings " Useful_Info " Environment { set nocompatible " Must be first line " } " Plugin_Install " { " Plugin environment let g:mydotfiles_directory = expand('~/.dotfiles/') let s:plugin_dir = expand('~/.vim/plugged/') let g:vim_dir = expand('~/.vim/') call plug#begin(s:plugin_dir) "Plug 'NoahTheDuke/vim-just' " Plug 'mbbill/undotree' " { " Plug 'alvan/vim-closetag' " let g:closetag_filenames = '*.html,*.xhtml,*.phtml, *.js' " } " for markdown{ " Plug 'preservim/vim-markdown' "} Plug 'dstein64/vim-startuptime' Plug 'simeji/winresizer' Plug 'rust-lang/rust.vim' Plug 'tpope/vim-surround' Plug 'rhysd/conflict-marker.vim' Plug 'jiangmiao/auto-pairs' Plug 'mg979/vim-visual-multi' "Plug 'easymotion/vim-easymotion' Plug 'vim-scripts/restore_view.vim' Plug 'mhinz/vim-startify' if executable('fzf') " fzf#install() makes sure that you have the latest binary, comment out because I don't want it to install binary for me Plug 'junegunn/fzf' ", { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' Plug 'antoinemadec/coc-fzf' endif Plug 'NLKNguyen/papercolor-theme' Plug 'airblade/vim-rooter' " Comment stuff out Plug 'tpope/vim-commentary' " put text in neibouring tmux pane into auto complete Plug 'wellle/tmux-complete.vim' Plug 'ludovicchabant/vim-gutentags', { 'for': ['c', 'cpp'] } Plug 'lambdalisue/readablefold.vim' " only work with vim if g:vim_type == 'vim' set encoding=UTF-8 Plug 'scrooloose/nerdtree' Plug 'tiagofumo/vim-nerdtree-syntax-highlight' " Plug 'tribela/vim-transparent' Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' " The bottom buffer display Plug 'Donaldttt/vim-bufferline' Plug 'ryanoasis/vim-devicons' Plug 'Yggdroot/indentLine' endif if executable('node') Plug 'neoclide/coc.nvim', {'branch': 'release'} endif " only work with nvim > 0.5 " For other versions, just loading the plugin may " cause error if g:vim_type == 'nvim' if g:vim_version >= 0.5 Plug 'xiyaowong/nvim-transparent' Plug 'lukas-reineke/indent-blankline.nvim' " nvim theme Plug 'EdenEast/nightfox.nvim' Plug 'projekt0n/github-nvim-theme', { 'tag': 'v0.0.7' } Plug 'nvim-lualine/lualine.nvim' endif if g:vim_version >= 0.7 Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} " comment out this plugin if the machine doesn't have required " font install Plug 'nvim-tree/nvim-web-devicons' Plug 'ziontee113/color-picker.nvim' endif if g:vim_version >= 0.8 Plug 'nvim-tree/nvim-tree.lua' endif if g:vim_version < 0.8 Plug 'scrooloose/nerdtree' endif endif call plug#end() " } function! HasPlug(plug_name, ...) let plug_dir_name = get(a:, 1, a:plug_name) " optional argument for the name of plug's folder if has_key(g:plugs, a:plug_name) && isdirectory(s:plugin_dir . "/" . plug_dir_name) return v:true endif return v:false endfunction " Plugin_Preferences " { " Yggdroot/indentLine { if HasPlug('indentLine') let g:indentLine_fileTypeExclude = ['startify'] endif " } " mhinz/vim-startify { if HasPlug("vim-startify") if g:vim_type == 'nvim' let buffer_str_len = (&columns - 60) / 2 let buf_str = repeat(' ', buffer_str_len) let g:startify_custom_header = [ \ buf_str . ' __ __ ________ ______ __ __ ______ __ __ ', \ buf_str . '| \ | \| \ / \ | \ | \| \| \ / \', \ buf_str . '| $$\ | $$| $$$$$$$$| $$$$$$\| $$ | $$ \$$$$$$| $$\ / $$', \ buf_str . '| $$$\| $$| $$__ | $$ | $$| $$ | $$ | $$ | $$$\ / $$$', \ buf_str . '| $$$$\ $$| $$ \ | $$ | $$ \$$\ / $$ | $$ | $$$$\ $$$$', \ buf_str . '| $$\$$ $$| $$$$$ | $$ | $$ \$$\ $$ | $$ | $$\$$ $$ $$', \ buf_str . '| $$ \$$$$| $$_____ | $$__/ $$ \$$ $$ _| $$_ | $$ \$$$| $$', \ buf_str . '| $$ \$$$| $$ \ \$$ $$ \$$$ | $$ \| $$ \$ | $$', \ buf_str . ' \$$ \$$ \$$$$$$$$ \$$$$$$ \$ \$$$$$$ \$$ \$$', \] else let buffer_str_len = (&columns - 30) / 2 let buf_str = repeat(' ', buffer_str_len) let g:startify_custom_header = [ \ buf_str . ' __ __ ______ __ __ ', \ buf_str . '| \ | \| \| \ / \', \ buf_str . '| $$ | $$ \$$$$$$| $$\ / $$', \ buf_str . '| $$ | $$ | $$ | $$$\ / $$$', \ buf_str . ' \$$\ / $$ | $$ | $$$$\ $$$$', \ buf_str . ' \$$\ $$ | $$ | $$\$$ $$ $$', \ buf_str . ' \$$ $$ _| $$_ | $$ \$$$| $$', \ buf_str . ' \$$$ | $$ \| $$ \$ | $$', \ buf_str . ' \$ \$$$$$$ \$$ \$$', \] endif let g:startify_lists = [ \ { 'header': [' RECENT'], 'type': 'files' }, \ { 'header': [' SESSIONS'], 'type': 'sessions' }, \ ] endif " } " " ryanoasis/vim-devicons { if HasPlug("vim-devicons") let g:webdevicons_enable_airline_statusline = 0 endif " } " " simeji/winresizer { if HasPlug("winresizer") let g:winresizer_vert_resize = 2 let g:winresizer_horiz_resize = 2 nnoremap r :WinResizerStartResize endif " } " ludovicchabant/vim-gutentags { if HasPlug("vim-gutentags") if exists("*gutentags#statusline()") set statusline+=%{gutentags#statusline()} endif let g:gutentags_cache_dir=g:vim_dir . '/.vimtags/' let g:gutentags_project_root=['.git', '.hg', '.svn', '.bzr', '_darcs', '_FOSSIL_', '.fslckout', 'src'] endif " } " easymotion/vim-easymotion { " f{char} to move to {char} map f (easymotion-bd-f) nmap f (easymotion-overwin-f) " s{char}{char} to move to {char}{char} nmap s (easymotion-overwin-f2) " Move to line map L (easymotion-bd-jk) nmap L (easymotion-overwin-line) " Move to word map w (easymotion-bd-w) nmap w (easymotion-overwin-w) " } " antoinemadec/coc-fzf { if HasPlug("coc-fzf") nnoremap :CocFzfList nnoremap o :CocFzfList outline endif " } " bling/vim-bufferline { let g:bufferline_echo = 0 let g:bufferline_modified = '+' " scrolling with fixed current buffer position let g:bufferline_rotate = 0 let g:bufferline_active_buffer_left = '' let g:bufferline_active_buffer_right = '' let g:bufferline_fixed_index = -1 let g:bufferline_inactive_highlight = 'StatusLineNC' let g:bufferline_active_highlight = 'StatusLine' " } " mbbill/undotree { nnoremap ut :UndotreeToggle " } " airblade/vim-rooter { if HasPlug("vim-rooter") let g:rooter_patterns = ['.vscode', '.git', '*.sln', 'src'] let g:rooter_change_directory_for_non_project_files = 'current' let g:rooter_silent_chdir = 1 endif " } " NerdTree { if (g:vim_type == 'vim' || g:vim_version < 0.8) && HasPlug('nerdtree') let g:NERDShutUp=1 " work around for nerdtree bug: https://github.com/preservim/nerdtree/issues/1321 let g:NERDTreeMinimalMenu = v:true let g:NERDTreeMinimalUI = v:true "nnoremap :NERDTreeToggle function! NERDTreeFindToggle() let my_filetype = &filetype let specical_fts = ['nerdtree', 'startify'] if my_filetype == '' || index(specical_fts, my_filetype) >= 0 :NERDTreeToggle else :NERDTreeFind endif endfunction nnoremap e :call NERDTreeFindToggle() "let NERDTreeShowBookmarks=1 "let NERDTreeIgnore=['\.py[cd]$', '\~$', '\.swo$', '\.swp$', '^\.git$', '^\.hg$', '^\.svn$', '\.bzr$'] let NERDTreeChDirMode = 0 let NERDTreeQuitOnOpen = 1 let NERDTreeMouseMode = 2 let NERDTreeShowHidden = 1 let NERDTreeKeepTreeInNewTab = 1 " Exit Vim if NERDTree is the only window remaining in the only tab. autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif endif " } " nvim-tree.lua { if g:vim_type == 'nvim' && HasPlug("nvim-tree.lua") " Hide vim bottom statusline " autocmd FileType NvimTree setlocal noshowmode noruler laststatus=0 noshowcmd " set noshowmode noruler laststatus=0 noshowcmd " autocmd BufRead,BufNewFile NvimTree set laststatus=0 " This will work instead endif " } "if has('nvim') && str2float(g:nvim_version) >= 0.5 && HasPlug("lualine.nvim") " nvim-lualine/lualine.nvim { " } "else " " vim-airline { if g:vim_type == 'vim' && HasPlug("vim-airline") " Set configuration options for the statusline plugin vim-airline. " Use the powerline theme and optionally enable powerline symbols. " This must using my fork version of bufferline " let g:bufferline_max_length = &columns - 22 function! BufferNumber() return len(g:index_to_buffer) endfunction call airline#parts#define_function('bufnum', 'BufferNumber') let g:airline_extensions = ['bufferline'] let g:airline_section_x = airline#section#create(['bufnum']) let g:airline_section_y = '' let g:airline_section_z = airline#section#create(['filetype']) let g:airline_skip_empty_sections = 1 "let g:airline_exclude_filetypes = ['nerdtree'] " see source for current list let g:airline#extensions#nerdtree_statusline = 0 "let g:airline#extensions#bufferline#overwrite_variables = 0 let g:airline_mode_map = { \ '__' : '-', \ 'c' : 'C', \ 'i' : 'I', \ 'ic' : 'I', \ 'ix' : 'I', \ 'n' : 'N', \ 'multi' : 'M', \ 'ni' : 'N', \ 'no' : 'N', \ 'R' : 'R', \ 'Rv' : 'R', \ 's' : 'S', \ 'S' : 'S', \ '' : 'S', \ 't' : 'T', \ 'v' : 'V', \ 'V' : 'V', \ '' : 'V', \ } if HasPlug("vim-airline-themes/") "let g:airline_theme = 'solarized' endif endif " } "endif " junegunn/fzf { " [Buffers] Jump to the existing window if possible let g:fzf_buffers_jump = 1 "let $FZF_DEFAULT_COMMAND='find . \( -name node_modules -o -name .git \) -prune -o -print' " - Preview window on the right with 50% width " - CTRL-/ will toggle preview window. if g:os == 'Windows' let g:fzf_preview_window = [] else let g:fzf_preview_window = ['right:50%', 'ctrl-/'] end " check if ripgrep is installed if ! executable('rg') command! -bang -nargs=* Rg \ call fzf#vim#grep( \ 'grep -R --line-number --exclude-dir=".git;.svn" --color=always -- '.shellescape(), 1, \ fzf#vim#with_preview(), 0) endif noremap r :Rg noremap f :Files " } " neoclide/coc.nvim { if HasPlug("coc.nvim") && executable('node') " add desired extensions to the following global variable " coc-clangd: c/c++, may need to install clangd seperatly if filereadable(g:mydotfiles_directory . "/coc-nvim-config.vim") exec "source " . g:mydotfiles_directory . "/coc-nvim-config.vim" endif " warning that coc work best for vim >= 8.3 let g:coc_disable_startup_warning = 1 endif " } " } " Theme_Appearance " { " " debug function print out highlight group of cursor position function! SynStack() if !exists("*synstack") return endif echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') endfunc nmap db :call SynStack() " search and filter highlight group " :call Sh('airline') function! Sh(pattern) execute("filter /" . a:pattern . "/ highlight") endfunc " dark or light if filereadable(g:vim_dir . '.light_theme.signal') let g:dark_or_light_theme = 'light' else let g:dark_or_light_theme = 'dark' endif " what to use for dark theme let g:dark_theme = 'default' " let g:airline_dark_theme = "violet" let g:airline_dark_theme = "angr" " what to use for light theme let g:light_theme = 'default' let g:airline_light_theme = "silver" " delete signal file if exist function! DeleteSignalFile(name) if filereadable(g:vim_dir . a:name) call delete(g:vim_dir . a:name) endif endfunction " Create signal file if not exist function! CreateSignalFile(name) call system("touch " . g:vim_dir . a:name) endfunction " all signal files: " .transparent_light_theme.signal " .transparent_dark_theme.signal function! SignalFileExists(filename) if filereadable(g:vim_dir . a:filename) return v:true endif return v:false endfunction " transparent backgroud for supported terminal emulator " check if transparent_dark_theme.signl or transparent_light_theme.signl " exist and set respect variable let g:transparent_dark_theme = v:false let g:transparent_light_theme = v:false if SignalFileExists('.transparent_dark_theme.signal') let g:transparent_dark_theme = v:true endif if SignalFileExists('.transparent_light_theme.signal') let g:transparent_light_theme = v:true endif function! SetDarkTheme() set background=dark hi clear execute("colorscheme " . g:dark_theme) let g:dark_or_light_theme = 'dark' endfunction function! SetLightTheme() set background=light hi clear execute("colorscheme " . g:light_theme) let g:dark_or_light_theme = 'light' endfunction " Change bottom airline/lualine theme " Currently only support airline function! SetStatusLineTheme(theme) if g:vim_type == 'nvim' && g:vim_version >= 0.5 "execute('AirlineTheme ' . a:theme) else execute('AirlineTheme ' . a:theme) endif endfunction " Fix colorscheme not working correctly under transparent background " There is no plugin for this for nvim < 0.5 or vim without lua support function! TransparentBackgroundFix() if !has('nvim') || g:vim_version < 0.5 " if v:true " if v:true highlight CursorLineNr ctermbg=none highlight SignColumn ctermbg=none if v:false "highlight CursorLineNr ctermbg=none highlight CocWarningHighlight ctermbg=none highlight CocErrorSign ctermbg=none ctermfg=9 cterm=bold highlight CocErrorHighlight ctermbg=none ctermfg=9 cterm=underline,bold highlight CocInfoHighlight ctermbg=none highlight CocHintHighlight ctermbg=none highlight CocWarningSign ctermbg=none highlight CocInfoSign ctermbg=none highlight CocHintSign ctermbg=none if g:dark_or_light_theme == 'dark' highlight! link TempColor Visual highlight! link CocFloating TempColor highlight! link CocErrorFloat TempColor highlight! link CocWarningFloat TempColor highlight! link CocInfoFloat TempColor highlight! link CocHintFloat TempColor endif endif endif endfunction function! EnableTransparent() if g:vim_type == 'nvim' && g:vim_version > 0.5 :TransparentEnable else if g:dark_or_light_theme == 'dark' let g:PaperColor_Theme_Options = { \ 'theme': { \ 'default.dark': { \ 'transparent_background': 1 \ } \ } \ } execute("colorscheme " . g:dark_theme) elseif g:dark_or_light_theme == 'light' let g:PaperColor_Theme_Options = { \ 'theme': { \ 'default.light': { \ 'transparent_background': 1 \ } \ } \ } execute("colorscheme " . g:light_theme) endif endif " call TransparentBackgroundFix() endfunction function! DisableTransparent() if g:vim_type == 'nvim' && g:vim_version > 0.5 :TransparentDisable else if g:dark_or_light_theme == 'dark' let g:PaperColor_Theme_Options = { \ 'theme': { \ 'default.dark': { \ 'transparent_background': 0 \ } \ } \ } execute("colorscheme " . g:dark_theme) elseif g:dark_or_light_theme == 'light' let g:PaperColor_Theme_Options = { \ 'theme': { \ 'default.light': { \ 'transparent_background': 0 \ } \ } \ } execute("colorscheme " . g:light_theme) DeleteSignalFile() endif endif endfunction " ToggleTransparent background " only works in dark theme function! ToggleTransparent() if g:transparent_dark_theme && g:dark_or_light_theme == 'dark' call DisableTransparent() let g:transparent_dark_theme = v:false call DeleteSignalFile('.transparent_dark_theme.signal') elseif g:transparent_light_theme && g:dark_or_light_theme == 'light' call DisableTransparent() let g:transparent_light_theme = v:false call DeleteSignalFile('.transparent_light_theme.signal') else call EnableTransparent() if g:dark_or_light_theme == 'dark' let g:transparent_dark_theme = v:true call CreateSignalFile('.transparent_dark_theme.signal') else let g:transparent_light_theme = v:true call CreateSignalFile('.transparent_light_theme.signal') endif endif endfunction " vim theme if !has('nvim') && HasPlug("papercolor-theme") && HasPlug('papercolor-theme') set t_Co=256 " improve coc color in this theme let g:light_theme = 'PaperColor' let g:dark_theme = 'PaperColor' "let g:airline_dark_theme = "papercolor" "let g:airline_light_theme = "papercolor" endif " nvim only theme if g:vim_type == 'nvim' if g:vim_version >= 0.8 && HasPlug("nightfox.nvim") let g:light_theme = 'dawnfox' "let g:dark_theme = 'nightfox' end if g:vim_version >= 0.5 && HasPlug("github-nvim-theme") let g:dark_theme = 'github_dark' " let g:dark_theme = 'github_dark_default' " let g:dark_theme = 'github_dimmed' let g:airline_dark_theme = "hybrid" end endif if g:dark_or_light_theme == 'dark' let g:airline_theme=g:airline_dark_theme call SetDarkTheme() else let g:airline_theme=g:airline_light_theme call SetLightTheme() endif " Since in .vimrc we cannot call plugin function as they " are not loaded (:help startup) if (g:transparent_dark_theme && g:dark_or_light_theme == 'dark') || (g:transparent_light_theme && g:dark_or_light_theme == 'light') if g:vim_type == 'nvim' && g:vim_version > 0.5 let g:transparent_enabled = v:true else call EnableTransparent() endif " call TransparentBackgroundFix() else if g:vim_type == 'nvim' && g:vim_version > 0.5 let g:transparent_enabled = v:false else call DisableTransparent() endif endif " Allow to trigger background function! ToggleBG() " Inversion if g:dark_or_light_theme == "dark" call SetLightTheme() call SetStatusLineTheme(g:airline_light_theme) call CreateSignalFile('.light_theme.signal') else call SetDarkTheme() call SetStatusLineTheme(g:airline_dark_theme) " for saving theme state call DeleteSignalFile(".light_theme.signal") endif if (g:transparent_dark_theme && g:dark_or_light_theme == 'dark') || (g:transparent_light_theme && g:dark_or_light_theme == 'light') call EnableTransparent() else call DisableTransparent() endif endfunction " } " Key_Mappings " (This doesn't include plugin specific mapping. " For them please check plugin Preferences) " { " Toggle dark/light theme noremap bg :call ToggleBG() " Toggle transparent background noremap tb :call ToggleTransparent() " Buffer navigation nnoremap q :bprevious nnoremap e :bnext " leader s change all occurence nnoremap s :%s/\<\>/ " leader num change tab " only for vim or nvim without lualine if g:vim_type == 'vim' || (g:vim_type == 'nvim' && g:vim_version < 0.5) nnoremap 1 :call bufferline#jump(1) nnoremap 2 :call bufferline#jump(2) nnoremap 3 :call bufferline#jump(3) nnoremap 4 :call bufferline#jump(4) nnoremap 5 :call bufferline#jump(5) nnoremap 6 :call bufferline#jump(6) nnoremap 7 :call bufferline#jump(7) nnoremap 8 :call bufferline#jump(8) nnoremap 9 :call bufferline#jump(9) nnoremap 10 :call bufferline#jump(10) nnoremap 11 :call bufferline#jump(11) nnoremap 12 :call bufferline#jump(12) nnoremap 13 :call bufferline#jump(13) end " split window comform with other window management shortcuts nnoremap % :vsplit nnoremap " :split " session related KeyBinding. These KeyBinding uses function from startify nnoremap s :SSave nnoremap l :SLoad nnoremap d :SDelete! nnoremap c :SClose " } " " Lua configuration if g:vim_type == 'nvim' && filereadable(g:mydotfiles_directory . '.vimrc.lua') execute('source ' . g:mydotfiles_directory . '/.vimrc.lua') endif " " Useful_Info{ " show mapping info " :verbose map ,cf " } if filereadable(g:mydotfiles_directory . "/config/theme.vim") exec "source " . g:mydotfiles_directory . "/config/theme.vim" endif