" (jump to the topic) " " OPTIONS " PLUGIN_INSTALL " UTILITIES " PLUGIN_CONFIGURATION " THEME_CONFIGURATION " KEY_MAPS " OTHER_CONFIGS let g:debug_mode = v:false let g:high_performence = v:false " set true will also disable animation let g:autocomplte_enable = v:true let g:copilot_enable = v:false " only in nvim (using which-key) let g:key_prompt = v:false " only used by neovim let g:classic_vim_ui = v:true let g:animation_enable = v:true let g:swap_dict = [ \ ['v:false', '0', 'dark', 'false' ], \ ['v:true' , '1', 'light', 'true']] " convinient function to swap between two options nmap t :call SwapWord() """""" PLUGIN_INSTALL """""" let g:dotfiledir = expand('~/.dotfiles/') let g:plugin_dir = expand('~/.vim/plugged/') let g:config_file_path = g:vim_dir . ".config.vim" call plug#begin(g:plugin_dir) " https://github.com/junegunn/vim-plug/wiki/tips function! Cond(cond, ...) let opts = get(a:000, 0, {}) return a:cond ? opts : extend(opts, { 'on': [], 'for': [] }) endfunction let g:animation_enable = g:high_performence ? v:false : g:animation_enable " custom plugin Plug 'Donaldttt/fzf-color-preview', Cond(g:vim_v >= 800) """" THEME_PLUGINS """" Plug 'sainnhe/everforest' if !g:high_performence Plug 'bluz71/vim-moonfly-colors', { 'as': 'moonfly' } Plug 'jacoborus/tender.vim' Plug 'cocopon/iceberg.vim' Plug 'catppuccin/nvim', Cond( has('nvim-0.8.2') \|\| g:vim_v >= 900 , { 'as': 'catppuccin' }) Plug 'NLKNguyen/papercolor-theme' Plug 'EdenEast/nightfox.nvim', Cond(has('nvim-0.5')) Plug 'projekt0n/github-nvim-theme', Cond(has('nvim-0.5'), { 'tag': 'v0.0.7' }) Plug 'folke/tokyonight.nvim', Cond(g:vim_type == 'nvim', { 'branch': 'main' }) endif """""""" END """""""""" Plug 'lervag/vimtex' Plug 'github/copilot.vim', Cond(( g:vim_type == 'nvim' \|\| g:vim_v >= 900 ) \ && g:copilot_enable && executable('node')) Plug 'gelguy/wilder.nvim', Cond((g:vim_type == 'vim' \|\| g:classic_vim_ui) && !g:high_performence) " " To use Python remote plugin features in Vim for wilder, can be skipped " " Plug 'roxma/nvim-yarp', Cond(g:vim_type == 'vim') Plug 'roxma/vim-hug-neovim-rpc', Cond(g:vim_v >= 800 && has('python3')) Plug 'dstein64/vim-startuptime', Cond(!g:high_performence) Plug 'simeji/winresizer', Cond(!g:high_performence) Plug 'rust-lang/rust.vim', { 'for': ['rust'] } Plug 'machakann/vim-sandwich' Plug 'rhysd/conflict-marker.vim' Plug 'jiangmiao/auto-pairs' " Plug 'mg979/vim-visual-multi' Plug 'RRethy/vim-illuminate', Cond(!g:high_performence) "Plug 'easymotion/vim-easymotion' Plug 'mhinz/vim-startify' " Plug 'ludovicchabant/vim-gutentags' Plug 'christoomey/vim-tmux-navigator' Plug 'airblade/vim-rooter' Plug 'roxma/vim-tmux-clipboard', Cond(executable('tmux')) Plug 'liuchengxu/vista.vim', Cond(!g:high_performence) "" ESSENTIAL_PLUGINS "" " Comment stuff out Plug 'tpope/vim-commentary' Plug 'vim-scripts/restore_view.vim' " vim only plugins Plug 'scrooloose/nerdtree', Cond(g:vim_type == 'vim' \|\| !has('nvim-0.8'), { 'on' : ['NERDTreeToggle', 'NERDTreeFind'] }) Plug 'tiagofumo/vim-nerdtree-syntax-highlight', Cond(g:vim_type == 'vim' && !g:high_performence) Plug 'neoclide/coc.nvim', Cond(g:autocomplte_enable && executable('node'), {'branch': 'release'}) " only work with vim if g:vim_type == 'vim' Plug 'voldikss/vim-floaterm', Cond(has('terminal')) set encoding=UTF-8 if executable('fzf') Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' Plug 'antoinemadec/coc-fzf' endif Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'Donaldttt/vim-bufferline' Plug 'ryanoasis/vim-devicons' Plug 'wfxr/minimap.vim', Cond(executable('code-minimap'), {'on' : ['MinimapToggle']}) endif if g:vim_type == 'nvim' if g:vim_version >= 0.5 Plug 'xiyaowong/nvim-transparent' Plug 'lukas-reineke/indent-blankline.nvim', Cond(!g:animation_enable) Plug 'echasnovski/mini.indentscope', Cond(g:animation_enable) Plug 'echasnovski/mini.animate', Cond(g:animation_enable) Plug 'nvim-lualine/lualine.nvim' Plug 'karb94/neoscroll.nvim', Cond(g:animation_enable) Plug 'petertriho/nvim-scrollbar', Cond(g:animation_enable) Plug 'folke/which-key.nvim', Cond(!g:high_performence && g:key_prompt) endif if g:vim_version >= 0.7 Plug 'nvim-treesitter/nvim-treesitter', Cond(executable('make'), {'do': ':TSUpdate'}) " for telescope Plug 'nvim-lua/plenary.nvim' Plug 'nvim-telescope/telescope.nvim', Cond(g:vim_type == 'nvim', { 'branch': '0.1.x' }) " c plugin for telescope to make it faster Plug 'nvim-telescope/telescope-fzf-native.nvim', Cond(executable('make'), { 'do': 'make' }) " comment out this plugin if the machine doesn't have required " font install Plug 'nvim-tree/nvim-web-devicons' Plug 'akinsho/toggleterm.nvim', Cond(g:vim_type == 'nvim', {'tag' : '*'}) endif if g:vim_version >= 0.8 Plug 'nvim-tree/nvim-tree.lua' Plug 'rcarriga/nvim-notify', Cond(!g:high_performence && !g:classic_vim_ui) Plug 'folke/noice.nvim', Cond(!g:high_performence && !g:classic_vim_ui) Plug 'MunifTanjim/nui.nvim', Cond(!g:high_performence && !g:classic_vim_ui) endif endif call plug#end() augroup InitConfig autocmd VimLeave * call SaveConfig() " Automatically install missing plugins at startup autocmd VimEnter * \ if len(filter(values(g:plugs), '!isdirectory(v:val.dir)')) \| PlugInstall --sync | q \| endif augroup end """""" UTILITIES """""" " import ultilities functions execute('source ' . g:dotfiledir . '/utils.vim') function! SaveConfig() let p = ReadVariable(g:config_file_path) if type(p) != type({}) let p = {} endif let config = has_key(p, g:vim_type) && type(p[g:vim_type]) == 4 \ ? p[g:vim_type] : {} let config = Merge(config, g:my_config) " vim and nvim may have diferenrt available plugins let p[g:vim_type] = config call SaveVariable(p, g:config_file_path) endfunction function! LoadConfig() let result = ReadVariable(g:config_file_path) " if it is dictionary if type(result) == 4 if has_key(result, g:vim_type) let config = result[g:vim_type] if type(config) == 4 | return config | endif endif endif return {} endfunction """"""" PLUGIN_CONFIGURATION """""" " a list of funcref that will be initilized late let s:post_init_func = [] function s:registerLateInit(func) let Funcref = type(a:func) == 10 ? func : function(a:func) call add(s:post_init_func, Funcref) endfunction function s:executeLateInit() function s:lateInitHelper(...) for Funcref in s:post_init_func call Funcref() endfor endfunction autocmd VimEnter * call timer_start(1, function('s:lateInitHelper')) endfunction if HasPlug('vim-floaterm') let g:floaterm_wintype = 'float' let g:floaterm_keymap_toggle = '' let g:floaterm_position = 'bottomright' let g:floaterm_width = 0.5 let g:floaterm_height = 0.5 autocmd QuitPre * :FloatermKill! autocmd FileType floaterm tmap endif if HasPlug('Copilot.vim') " imap (copilot-next) " imap (copilot-prev) endif if HasPlug('vimtex') if g:os == 'Darwin' let g:vimtex_view_method = 'skim' endif nmap lv (vimtex-view) nmap lc :VimtexCompile let g:vimtex_quickfix_open_on_warning = 0 endif if HasPlug('minimap.vim') nnoremap mm :MinimapToggle let g:minimap_highlight_search = 1 let g:minimap_git_colors = 1 let g:minimap_enable_highlight_colorgroup = 1 let g:minimap_block_filetypes = ['help', 'nerdtree'] endif if HasPlug('vista.vim') let g:vista_default_executive = 'vim_lsp' if HasPlug('coc.nvim') let g:vista_default_executive = 'coc' elseif HasPlug('coc.nvim') let g:vista_default_executive = 'ctags' endif nnoremap v :Vista!! let g:vista_cursor_delay = 0 let g:vista_echo_cursor = 0 let g:vista_echo_cursor_strategy = 'floating_win' let g:vista_close_on_jump = 0 let g:vista_floating_delay = 0 let g:vista_ignore_kinds = ['Variable', 'Field', 'EnumMember', \ 'String', 'Object', 'Array', 'Constant', 'Package', 'Boolean', 'Number' \ ] let g:vista_floating_border = 'rounded' let g:vista_disable_statusline = 1 " let g:vista_keep_fzf_colors = 1 let g:vista_update_on_text_changed_delay = 0 let g:vista_update_on_text_changed = 1 let g:vista#renderer#enable_kind = 1 let g:vista#renderer#enable_icon = 1 " return to last position of vista let g:vista_last_row = v:null function VistaCursorJump() " let found = vista#util#BinarySearch(g:vista.raw, line('.'), 'line', '') let found = g:vista_last_row if empty(found) return endif let vlnum = get(found, 'vlnum', v:null) call cursor(vlnum, 3) endfunction " save tag for VistaCursorJump use function VistaH2() if exists('*vista#util#BinarySearch') let bufs = map(filter(copy(getbufinfo()), 'v:val.listed'), 'v:val.bufnr') if index(bufs, bufnr('%')) < 0 return endif let found = vista#util#BinarySearch(g:vista.raw, line('.'), 'line', '') if empty(found) return endif let g:vista_last_row = found endif endfunction autocmd BufLeave * call VistaH2() autocmd FileType vista call VistaCursorJump() endif if HasPlug('indentLine') let g:indentLine_fileTypeExclude = ['startify'] endif if HasPlug('vim-illuminate') && g:vim_type == 'vim' " nvim doesn't need this config let g:Illuminate_ftHighlightGroups = { \ 'vim:blacklist': ['vimLet', 'vimFuncKey', 'vimNotFunc', 'vimOperParen', 'vimLineComment'], \ 'java:blacklist' : [ 'javaType', 'javaScopeDecl', 'javaMethodDecl', \ 'javaComment', 'javaStorageClass', 'javaClassDecl', 'javaExternal', \ 'javaTypedef', 'javaLineComment', 'javaStatement', 'javaCommentTitle', 'javaDocComment' ], \ 'lua:blacklist' : [ 'luaComment', 'luaCond', 'luaStatement', 'luaFunction' ] \ } let g:Illuminate_ftwhitelist = ['vim', 'sh', 'python', 'rust', 'java', \ 'c', 'cpp', 'javascript', 'typescript', 'lua'] " ugly workaround for the bug that illuminate not working after first " enter vim function s:init_illuminate(...) hi illuminatedWord cterm=underline gui=underline endfunction call s:registerLateInit('s:init_illuminate') augroup illuminate_augroup autocmd! autocmd ColorScheme * hi illuminatedWord cterm=underline gui=underline augroup END endif if HasPlug('wilder.nvim') call wilder#setup({ \ 'modes': [':'], \ 'next_key': '', \ 'previous_key': '', \ 'enable_cmdline_enter': 0, \ }) call wilder#set_option('pipeline', [ \ wilder#debounce(10), \ wilder#branch( \ wilder#cmdline_pipeline({'language': g:vim_type == 'nvim' ? 'python' : 'vim'}), \ ), \ ]) if g:vim_type == 'vim' call wilder#set_option('renderer', wilder#popupmenu_renderer()) else call wilder#set_option('renderer', wilder#popupmenu_renderer( \ wilder#popupmenu_border_theme({ \ 'highlights': { \ 'default': 'Normal', \ }, \ 'pumblend': 20, \ 'border': 'rounded', \ }))) endif endif if HasPlug('vim-tmux-navigator') let g:tmux_navigator_no_mappings = 1 noremap :TmuxNavigateLeft noremap :TmuxNavigateDown noremap :TmuxNavigateUp noremap :TmuxNavigateRight " noremap {Previous-Mapping} :TmuxNavigatePrevious endif if HasPlug("vim-startify") if g:vim_type == 'nvim' let buffer_str_len = (&columns - 60) / 2 let g:startify_custom_header = GenVimAsciiArt(buffer_str_len) else let buffer_str_len = (&columns - 30) / 2 let g:startify_custom_header = GenVimAsciiArt(buffer_str_len) endif let g:startify_lists = [ \ { 'header': [' RECENT'], 'type': 'files' }, \ { 'header': [' SESSIONS'], 'type': 'sessions' }, \ ] " session related KeyBinding. These KeyBinding uses function from startify nnoremap s :SSave! nnoremap l :SLoad nnoremap d :SDelete! nnoremap c :SClose endif if HasPlug("vim-devicons") let g:webdevicons_enable_airline_statusline = 0 endif if HasPlug("winresizer") let g:winresizer_vert_resize = 2 let g:winresizer_horiz_resize = 2 " nnoremap r :WinResizerStartResize let g:winresizer_start_key = 'r' endif if HasPlug("vim-gutentags") if exists("*gutentags#statusline()") set statusline+=%{gutentags#statusline()} endif let g:gutentags_trace = 1 let g:gutentags_cache_dir=g:vim_dir . '/.vimtags/' let g:gutentags_project_root=['.git', '.hg', '.svn', '.bzr', '_darcs', '_FOSSIL_', '.fslckout', 'src'] endif if HasPlug("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) endif if HasPlug("coc-fzf") " nnoremap :CocFzfList " nnoremap o :CocFzfList outline endif if HasPlug("vim-bufferline") && HasPlug("vim-airline") let g:bufferline_echo = 0 let g:bufferline_modified = '+' " scrolling with fixed current buffer position let g:bufferline_active_buffer_left = '[' let g:bufferline_active_buffer_right = ']' let g:bufferline_inactive_highlight = 'airline_c' let g:bufferline_active_highlight = 'airline_c_bold' endif if HasPlug("undotree") nnoremap ut :UndotreeToggle endif 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 if (g:vim_type == 'vim' || g:vim_version < 0.8) && HasPlug('nerdtree') if HasPlug('vim-nerdtree-syntax-highlight') let g:NERDTreeLimitedSyntax = 1 endif 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 function! NERDTreeEchoPathHandler(node) echo a:node.path.str() endfunction autocmd! User nerdtree call NERDTreeAddKeyMap({ \ 'key': 'p', \ 'callback': 'NERDTreeEchoPathHandler', \ 'quickhelpText': 'echo full path of current node', \ 'scope': 'Node' }) 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 if HasPlug('vim-devicons') || HasPlug('nerdfont.vim') let NERDTreeDirArrowCollapsible = '' let NERDTreeDirArrowExpandable = '' else " let NERDTreeDirArrowCollapsible = '' " let NERDTreeDirArrowExpandable = '' endif " 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 if HasPlug("vim-airline") " Set configuration options for the statusline plugin vim-airline. " Use the powerline theme and optionally enable powerline symbols. " TODO " 22 is a magic number, it is best it can change as buffer width " changing " This must use my fork version of bufferline " the number of cols bufferline cannot use out of max of screen cols let g:bufferline_forbided_col = 32 call airline#parts#define_function('bufnum', 'AirlineBufferNumber') call airline#parts#define_function('cocstatus', 'AirlineCocStatus') call airline#parts#define_accent('cocstatus', 'italic') call airline#parts#define_accent('bufnum', 'bold') call airline#parts#define_accent('bufnum', 'italic') call airline#parts#define_accent('filetype', 'italic') let g:airline_experimental = g:vim_v >= 900 ? 1 : 0 function! AirlineInit() let _airline_section_y = '' if HasPlug('coc.nvim') let _airline_section_y = airline#section#create(['cocstatus']) endif " this create function returns a format string for status line (:h " stl). the string we append is what will happend if we pass " cocstatus into the create function. By appending them we have " more freedom format the highlight " let g:airline_section_y = '%{%airline#util#wrap(AirlineCocStatus(), 0)%}' let g:airline_section_a = airline#section#create(['mode']) let g:airline_section_b = '' let g:airline_section_error = '' let g:airline_section_warning = '' " let g:airline_section_x = airline#section#create(['bufnum']) let g:airline_section_x = '' let g:airline_section_y = _airline_section_y let g:airline_section_z = airline#section#create(['filetype']) " see source for current list function s:airline_refresh(timer) :AirlineRefresh! endfunction autocmd! CursorMoved * call s:airline_refresh(0) endfunction function! s:airlineconfig() " TODO " the problem is that colorscheme command will trigger this function " and at that time background=new but airline_theme=old " Right now I decide to modify airline them first and if the " colorscheme has it's own ariline theme it will override user " choice. " call add(g:msgs, g:ccc) " call add(g:msgs, g:airline_theme) " call add(g:msgs, &background) " let g:my_config[&background].airline_theme = g:airline_theme endfunction augroup AirlineAu autocmd! autocmd User AirlineAfterTheme call s:airlineconfig() autocmd User AirlineAfterInit call AirlineInit() augroup end let g:airline#extensions#localsearch#enabled = 0 let g:airline_extensions = ['bufferline'] let g:airline_exclude_filetypes = ['vista', 'minimap'] let g:airline_skip_empty_sections = 1 " without this airline will overwrite some setting like bufferline_active_buffer_left, etc. 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', \ } endif if HasPlug("fzf") && HasPlug("fzf.vim") " [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' " - CTRL-/ will toggle preview window. if g:os == 'Windows' let g:fzf_preview_window = [] else let g:fzf_preview_window = ['right:50%'] end let g:fzf_colors = { \ 'gutter': ['bg', 'Normal'], \ } " 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 command! -bang -nargs=* CFile \ call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case --vimgrep -- " \ .shellescape(). " ".expand('%'), \ 1, fzf#vim#with_preview(), 0) function! FzfColorSelect(color_name) execute("colorscheme " . a:color_name) let g:my_config.background = &background let g:my_config[&background].theme = a:color_name if has_key(g:colo2airline, a:color_name ) call SetStatusLineTheme(&background, g:colo2airline[a:color_name]) endif endfunction function! FzfAirlineColorSelect(color_name) call SetStatusLineTheme(&background, a:color_name) endfunction let g:VimrpcFzfColor = function('FzfColorSelect') let g:VimrpcFzfAirline = function('FzfAirlineColorSelect') noremap fr :Rg noremap ff :Files noremap ft :CFile noremap fa :AirlinePreview noremap fc :ColorsPreview endif if HasPlug("coc.nvim") && executable('node') " coc-clangd: c/c++, may need to install clangd seperatly if filereadable(g:dotfiledir . "/coc-nvim-config.vim") exec "source " . g:dotfiledir . "/coc-nvim-config.vim" endif " warning that coc work best for vim >= 8.3 let g:coc_disable_startup_warning = 1 endif """""" THEME_CONFIGURATION """""" " GOTO menu " THEME_README " THEME_PLUGINS_CONFIG " THEME_ULTILITIES " THEME_INIT " Setup theme when vim first start " THEME_OPTIONS """ THEME_README """ " set custom callback functions to use when when enabling/diabling transparent " for certain colorscheme " let g:light_transparent_enable_cb = '' " let g:light_transparent_disable_cb = '' " let g:dark_transparent_enable_cb = '' " let g:dark_transparent_disable_cb = '' """ THEME_PLUGINS_CONFIG """ if HasPlug('nvim-transparent') " generic nvim transparent enable and disable function function Nvim_TB_enable() :TransparentEnable endfunction function Nvim_TB_disable() :TransparentDisable endfunction let g:light_transparent_enable_cb = 'Nvim_TB_enable' let g:light_transparent_disable_cb = 'Nvim_TB_disable' let g:dark_transparent_enable_cb = 'Nvim_TB_enable' let g:dark_transparent_disable_cb = 'Nvim_TB_disable' endif if HasPlug('everforest') let g:everforest_better_performance = 1 let g:everforest_background = 'hard' " let g:everforest_enable_italic = 1 function! Everforest_trans_enable() let g:everforest_transparent_background = 2 colorscheme everforest call SetStatusLineTheme(&background, 'everforest') " hack to fix caret characters appearing in the statusline when StatusLine " and StatusLineNC has same highlight(https://vi.stackexchange.com/questions/15873/carets-in-status-line) hi StatusLine guifg=#d3c6aa ctermfg=223 endfunction function! Everforest_trans_disable() let g:everforest_transparent_background = 0 colorscheme everforest call SetStatusLineTheme(&background, 'everforest') endfunction function! CB_dark_tb_enable_everforest() call Everforest_trans_enable() endfunction function! CB_light_tb_enable_everforest() call Everforest_trans_enable() endfunction function! CB_dark_tb_disable_everforest() call Everforest_trans_disable() endfunction function! CB_light_tb_disable_everforest() call Everforest_trans_disable() endfunction endif if HasPlug('papercolor-theme') function! CB_dark_tb_enable_PaperColor() let g:PaperColor_Theme_Options = { \ 'theme': {'default.dark': { 'transparent_background': 1 }}} colorscheme PaperColor endfunction function! CB_light_tb_enable_PaperColor() let g:PaperColor_Theme_Options = { \ 'theme': {'default.light': { 'transparent_background': 1 }}} colorscheme PaperColor endfunction function! CB_dark_tb_disable_PaperColor() let g:PaperColor_Theme_Options = { \ 'theme': {'default.dark': { 'transparent_background': 0 }}} colorscheme PaperColor endfunction function! CB_light_tb_disable_PaperColor() let g:PaperColor_Theme_Options = { \ 'theme': {'default.light': { 'transparent_background': 0 }}} colorscheme PaperColor endfunction endif """ THEME_ULTILITIES """ nmap db :call ShowHighLightGroup() function! SetTheme(bg, ...) let colors_name = a:0 > 0 ? a:1 : g:my_config[a:bg].theme if HasColorscheme(colors_name) let g:my_config.background = a:bg let g:my_config[a:bg].theme = colors_name call SetStatusLineTheme(a:bg) execute("colorscheme " . colors_name) if &background != a:bg execute('set background='.a:bg) endif endif endfunction " Change bottom airline/lualine theme function! SetStatusLineTheme(bg, ...) if has('nvim-0.5') " lualine will change theme automatically else if HasPlug('vim-airline') && exists(':AirlineTheme') let theme = a:0 > 0 ? a:1 : g:my_config[a:bg].airline_theme try execute('AirlineTheme ' . theme) catch let theme = g:default_config[a:bg].airline_theme execute('AirlineTheme ' . theme) endtry let g:my_config[a:bg].airline_theme = theme endif endif endfunction function! EnableTransparent() let colorscheme_name = ColourSchemeName() let bg = &background let cb_name = 'CB_' .bg. '_tb_enable_'.colorscheme_name if exists('*' . cb_name) execute('call ' . cb_name . '()') elseif exists('g:'.bg.'_transparent_enable_cb') && g:dark_transparent_enable_cb != '' let cb_name = get(g:, bg.'_transparent_enable_cb', '') if cb_name != '' execute('call '.cb_name.'()') endif else return endif let g:my_config[&background].transparent = v:true endfunction function! DisableTransparent() let colorscheme_name = ColourSchemeName() let bg = &background let cb_name = 'CB_' . bg . '_tb_disable_'.colorscheme_name if exists('*' . cb_name) execute('call ' . cb_name . '()') elseif exists('g:'.bg.'_transparent_disable_cb') let cb_name = get(g:, bg.'_transparent_disable_cb', '') if cb_name != '' execute('call '.cb_name.'()') endif else return endif let g:my_config[&background].transparent = v:false endfunction " ToggleTransparent background function! ToggleTransparent() if g:my_config[&background].transparent call DisableTransparent() else call EnableTransparent() endif endfunction " Allow to trigger background function! ToggleBG() " Inversion let newbg = &background == "dark" ? 'light' : 'dark' call SetTheme(newbg) if g:my_config[&background].transparent call EnableTransparent() else call DisableTransparent() endif endfunction """ THEME_INIT """ function! s:theme_initilize() let bg = g:my_config.background call SetStatusLineTheme(bg) if HasColorscheme(g:my_config[bg].theme) call SetTheme(bg) else call SetTheme(bg, g:my_config[bg].default) endif if g:my_config[bg].transparent call EnableTransparent() else call DisableTransparent() endif endfunction if g:vim_type == 'vim' " workaround that statusline theme doesn't work right call s:registerLateInit('s:theme_initilize') endif autocmd VimEnter * call s:theme_initilize() """ THEME_OPTIONS """ if has('termguicolors') set termguicolors endif let g:default_config = { \ 'background': 'dark', \ 'dark': { \ 'theme': 'default', \ 'default': 'default', \ 'transparent': v:false, \ 'airline_theme': 'angr', \ }, \ 'light': { \ 'theme': 'default', \ 'default': 'default', \ 'transparent': v:false, \ 'airline_theme': 'silver', \ }, \ } let g:my_config = {} let g:colo2airline = { \ } " permenent default if HasPlug("everforest") let g:default_config = Merge(g:default_config, { \ 'dark': { \ 'airline_theme': 'everforest', \ 'default': 'everforest', \ }, \ 'light': { \ 'airline_theme': 'everforest', \ 'default': 'everforest', \ }, \ }) endif let g:my_config = Merge(g:default_config, LoadConfig()) " } """""" KEY_MAPS """""" " (This doesn't include plugin specific mapping. " For them check plugin Preferences) nnoremap ws :call TrimWhitespace() " 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/\<\>/ " disable two easily mispressed yet useless key nnoremap q: nnoremap Q " leader num change tab " only for vim or nvim without lualine if (g:vim_type == 'vim' || !has('nvim-0.5')) && HasPlug('vim-bufferline') for i in range(1, 9) execute "nnoremap " . i . \ " :call bufferline#jump(" . i . ")" endfor for i in range(10, 20) execute "nnoremap " . i . \ " :call bufferline#jump(" . i . ")" endfor end " split window comform with other window management shortcuts nnoremap % :vsplit nnoremap " :split """""" OTHERS """""" " Lua configuration if has('nvim') && filereadable(g:dotfiledir . '.vimrc.lua') execute('source ' . g:dotfiledir . '/.vimrc.lua') endif call s:executeLateInit()