scriptencoding utf-8 " Plugin installation lua require 'plugins' "{ 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', 'PackerInstall') call utils#Cabbrev('pud', 'PackerUpdate') call utils#Cabbrev('pc', 'PackerClean') call utils#Cabbrev('ps', 'PackerSync') "}} "{{ Auto-completion related lua require('entrance') """""""""""""""""""""""""UltiSnips settings""""""""""""""""""" " Trigger configuration. Do not use if you use YouCompleteMe let g:UltiSnipsExpandTrigger='' " Do not look for SnipMate snippets let g:UltiSnipsEnableSnipMate = 0 " 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'] "}} "{{ Language specific plugin """""""""""""""""""""""""" semshi settings """"""""""""""""""""""""""""""" " Do not highlight for all occurrences of variable under cursor let g:semshi#mark_selected_nodes=0 " Do not show error sign since linting plugin is specialized for that let g:semshi#error_sign=v:false """""""""""""""""""""""""" vlime settings """""""""""""""""""""""""""""""" command! -nargs=0 StartVlime call jobstart(printf("sbcl --load %s/vlime/lisp/start-vlime.lisp", g:package_home)) "}} "{{ Search related """"""""""""""""""""""""""""" settings for nvim-hlslens""""""""""""""" noremap n execute('normal! ' . v:count1 . 'nzzzv') \lua require('hlslens').start() noremap N execute('normal! ' . v:count1 . 'Nzzzv') \lua require('hlslens').start() map * (asterisk-z*)lua require('hlslens').start() map # (asterisk-z#)lua require('hlslens').start() """""""""""""""""""""""""""""LeaderF settings""""""""""""""""""""" " Do not use cache file let g:Lf_UseCache = 0 " Refresh each time we call leaderf let g:Lf_UseMemoryCache = 0 " Ignore certain files and directories when searching files let g:Lf_WildIgnore = { \ 'dir': ['.git', '__pycache__', '.DS_Store'], \ 'file': ['*.exe', '*.dll', '*.so', '*.o', '*.pyc', '*.jpg', '*.png', \ '*.gif', '*.svg', '*.ico', '*.db', '*.tgz', '*.tar.gz', '*.gz', \ '*.zip', '*.bin', '*.pptx', '*.xlsx', '*.docx', '*.pdf', '*.tmp', \ '*.wmv', '*.mkv', '*.mp4', '*.rmvb', '*.ttf', '*.ttc', '*.otf', \ '*.mp3', '*.aac'] \} " Do not show fancy icons for Linux server. if g:is_linux let g:Lf_ShowDevIcons = 0 endif " Only fuzzy-search files names let g:Lf_DefaultMode = 'NameOnly' " Popup window settings let g:Lf_PopupWidth = 0.5 let g:Lf_PopupPosition = [0, &columns/4] " Do not use version control tool to list files under a directory since " submodules are not searched by default. let g:Lf_UseVersionControlTool = 0 " Disable default mapping let g:Lf_ShortcutF = '' let g:Lf_ShortcutB = '' " set up working directory for git repository let g:Lf_WorkingDirectoryMode = 'a' " Search files in popup window nnoremap ff :Leaderf file --popup " Grep project files in popup window nnoremap fg :Leaderf rg --popup " Search vim help files nnoremap fh :Leaderf help --popup nnoremap h :echoerr "Use \leader>fh instead!" " Search tags in current buffer nnoremap ft :Leaderf bufTag --popup nnoremap t :echoerr "Use \leader>ft instead!" " Switch buffers nnoremap fb :Leaderf buffer --popup let g:Lf_PopupColorscheme = 'gruvbox_material' " Change keybinding in LeaderF prompt mode, use ctrl-n and ctrl-p to navigate " items. let g:Lf_CommandMap = {'': [''], '': ['']} "}} "{{ URL related """"""""""""""""""""""""""""open-browser.vim settings""""""""""""""""""" if g:is_win || g:is_mac " Disable netrw's gx mapping. let g:netrw_nogx = 1 " Use another mapping for the open URL method nmap ob (openbrowser-smart-search) xmap ob (openbrowser-smart-search) endif "}} "{{ Navigation and tags """"""""""""""""""""""""""" gutentags settings """""""""""""""""""""""""""""" " The path to store tags files, instead of in the project root. let g:gutentags_cache_dir = stdpath('cache') . '/ctags' let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q'] let g:gutentags_ctags_extra_args += ['--c++-kinds=+px'] let g:gutentags_ctags_extra_args += ['--c-kinds=+px'] let g:gutentags_ctags_exclude = ['*.md', '*.html', '*.json', '*.toml', '*.css', '*.js',] """"""""""""""""""""""""""" vista settings """""""""""""""""""""""""""""""""" let g:vista#renderer#icons = { \ 'member': '', \ } " Do not echo message on command line let g:vista_echo_cursor = 0 " Stay in current window when vista window is opened let g:vista_stay_on_open = 0 nnoremap t :Vista!! "}} "{{ File editing """"""""""""""""""""""""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'] " Whether to show autosave status on command line let g:auto_save_silent = 0 """"""""""""""""""""""""vim-mundo settings""""""""""""""""""""""" let g:mundo_verbose_graph = 0 let g:mundo_width = 80 nnoremap u :MundoToggle """"""""""""""""""""""""""""vim-yoink settings""""""""""""""""""""""""" if g:is_win || g:is_mac " ctrl-n and ctrl-p will not work if you add the TextChanged event to vim-auto-save events. " nmap (YoinkPostPasteSwapBack) " nmap (YoinkPostPasteSwapForward) " The following p/P mappings are also needed for ctrl-n and ctrl-p to work " 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 """"""""""""""""""""""""""""better-escape.vim settings""""""""""""""""""""""""" let g:better_escape_interval = 200 """"""""""""""""""""""""""""vim-xkbswitch settings""""""""""""""""""""""""" let g:XkbSwitchEnabled = 1 "}} "{{ Linting and formatting """""""""""""""""""""""""""""" neoformat settings """"""""""""""""""""""" let g:neoformat_enabled_python = ['black', 'yapf'] let g:neoformat_cpp_clangformat = { \ 'exe': 'clang-format', \ 'args': ['--style="{IndentWidth: 4}"'] \ } let g:neoformat_c_clangformat = { \ 'exe': 'clang-format', \ 'args': ['--style="{IndentWidth: 4}"'] \ } let g:neoformat_enabled_cpp = ['clangformat'] let g:neoformat_enabled_c = ['clangformat'] "}} "{{ 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 = '~' """""""""""""""""""""""""vim-fugitive settings"""""""""""""""""""""""""""""" nnoremap gs :Git nnoremap gw :Gwrite nnoremap gc :Git commit nnoremap gpl :Git pull " Note that to use bar literally, we need backslash it, see also `:h :bar`. nnoremap gpu :15split \| term git push "}} "{{ Markdown writing """""""""""""""""""""""""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 g:is_win || g:is_mac " 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-grammarous settings"""""""""""""""""""""""""""""" if g:is_mac let g:grammarous#languagetool_cmd = 'languagetool' let g:grammarous#disabled_rules = { \ '*' : ['WHITESPACE_RULE', 'EN_QUOTES', 'ARROWS', 'SENTENCE_WHITESPACE', \ 'WORD_CONTAINS_UNDERSCORE', 'COMMA_PARENTHESIS_WHITESPACE', \ 'EN_UNPAIRED_BRACKETS', 'UPPERCASE_SENTENCE_START', \ 'ENGLISH_WORD_REPEAT_BEGINNING_RULE', 'DASH_RULE', 'PLUS_MINUS', \ 'PUNCTUATION_PARAGRAPH_END', 'MULTIPLICATION_SIGN', 'PRP_CHECKOUT', \ 'CAN_CHECKOUT', 'SOME_OF_THE', 'DOUBLE_PUNCTUATION', 'HELL', \ 'CURRENCY', 'POSSESSIVE_APOSTROPHE', 'ENGLISH_WORD_REPEAT_RULE', \ 'NON_STANDARD_WORD', 'AU', 'DATE_NEW_YEAR'], \ } augroup grammarous_map autocmd! autocmd FileType markdown nmap x (grammarous-close-info-window) autocmd FileType markdown nmap (grammarous-move-to-next-error) autocmd FileType markdown nmap (grammarous-move-to-previous-error) augroup END endif """"""""""""""""""""""""unicode.vim settings"""""""""""""""""""""""""""""" nmap ga (UnicodeGA) "}} "{{ text objects """"""""""""""""""""""""""""vim-sandwich settings""""""""""""""""""""""""""""" " Map s to nop since s in used by vim-sandwich. Use cl instead of s. nmap s omap s "}} "{{ LaTeX editing """"""""""""""""""""""""""""vimtex settings""""""""""""""""""""""""""""" if ( g:is_win || g:is_mac ) && executable('latex') function! SetServerName() abort if has('win32') let nvim_server_file = $TEMP . '/curnvimserver.txt' else let nvim_server_file = '/tmp/curnvimserver.txt' endif let cmd = printf('echo %s > %s', v:servername, nvim_server_file) call system(cmd) endfunction augroup vimtex_common autocmd! autocmd FileType tex nmap (vimtex-compile) autocmd FileType tex call SetServerName() augroup END 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 g:is_win 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 g:is_mac " 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' augroup vimtex_mac autocmd! autocmd User VimtexEventCompileSuccess call UpdateSkim() augroup END " The following code is adapted from https://gist.github.com/skulumani/7ea00478c63193a832a6d3f2e661a536. function! UpdateSkim() abort let l:out = b:vimtex.out() let l:src_file_path = expand('%:p') let l:cmd = [g:vimtex_view_general_viewer, '-r'] if !empty(system('pgrep Skim')) call extend(l:cmd, ['-g']) endif call jobstart(l:cmd + [line('.'), l:out, l:src_file_path]) 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', 'lucius', 'ayu_dark', 'base16_bright', \ 'base16_adwaita', 'raven', 'term', 'deus', 'onedark'] let g:airline_theme = utils#RandElement(s:candidate_airlinetheme) " Whether to show function or other tags on status line let g:airline#extensions#vista#enabled = 0 let g:airline#extensions#gutentags#enabled = 1 " Do not show search index in statusline since it is shown on command line let g:airline#extensions#anzu#enabled = 0 " Enable vim-airline extension for nvim-lsp let g:airline#extensions#nvimlsp#enabled = 1 let g:airline#extensions#searchcount#enabled = 0 " 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://vi.stackexchange.com/q/3359/15292 let g:airline_powerline_fonts = 0 if !exists('g:airline_symbols') let g:airline_symbols = {} endif let g:airline_symbols.paste = 'ρ' if !g:is_linux let g:airline_symbols.branch = '' let g:airline_symbols.spell = 'Ꞩ' endif " Custom branch name let g:airline#extensions#branch#custom_head = 'utils#GetGitBranch' " 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 " The keys in the following shortcode are the layout when we use a specific " input method mode. On my macOS, 0 means that we are trying to input Chinese, " and 1 means we are using English mode. " See also https://github.com/vim-airline/vim-airline/blob/master/autoload/airline/extensions/xkblayout.vim#L11 let g:airline#extensions#xkblayout#short_codes = {'0': 'CN', '1': 'US'} """"""""""""""""""""""""""""vim-startify settings"""""""""""""""""""""""""""" " Do not change working directory when opening files. let g:startify_change_to_dir = 0 let g:startify_fortune_use_unicode = 1 "}} "{{ Misc plugin setting """"""""""""""""""""""""""""vim-matchup settings""""""""""""""""""""""""""""" " Improve performance let g:matchup_matchparen_deferred = 1 let g:matchup_matchparen_timeout = 100 let g:matchup_matchparen_insert_timeout = 30 " Enhanced matching with matchup plugin let g:matchup_override_vimtex = 1 " Whether to enable matching inside comment or string let g:matchup_delim_noskips = 0 " Show offscreen match pair in popup window let g:matchup_matchparen_offscreen = {'method': 'popup'} """""""""""""""""""""""""" asyncrun.vim settings """""""""""""""""""""""""" " Automatically open quickfix window of 6 line tall after asyncrun starts let g:asyncrun_open = 6 if g:is_win " Command output encoding for Windows let g:asyncrun_encs = 'gbk' endif """"""""""""""""""""""""""""""firenvim settings"""""""""""""""""""""""""""""" if exists('g:started_by_firenvim') && g:started_by_firenvim if g:is_mac set guifont=Iosevka\ Nerd\ Font:h18 endif " general config for firenvim let g:firenvim_config = { \ 'globalSettings': { \ 'alt': 'all', \ }, \ 'localSettings': { \ '.*': { \ 'cmdline': 'neovim', \ 'priority': 0, \ 'selector': 'textarea', \ 'takeover': 'never', \ }, \ } \ } augroup firenvim autocmd! autocmd BufEnter *.txt setlocal filetype=markdown laststatus=0 nonumber noshowcmd noruler showtabline=1 augroup END endif """"""""""""""""""""""""""""""nvim-gdb settings"""""""""""""""""""""""""""""" nnoremap dp :GdbStartPDB python -m pdb % """"""""""""""""""""""""""""""wilder.nvim settings"""""""""""""""""""""""""""""" augroup wilder_init autocmd! autocmd CmdlineEnter * ++once call s:wilder_init() augroup END function! s:wilder_init() abort try call wilder#enable_cmdline_enter() set wildcharm= cmap wilder#in_context() ? wilder#next() : "\" cmap wilder#in_context() ? wilder#previous() : "\" " only / and ? are enabled by default call wilder#set_option('modes', ['/', '?', ':']) call wilder#set_option('pipeline', [ \ wilder#branch( \ wilder#cmdline_pipeline({ \ 'language': 'python', \ 'fuzzy': 1, \ 'sorter': wilder#python_difflib_sorter(), \ 'debounce': 30, \ }), \ wilder#python_search_pipeline({ \ 'pattern': wilder#python_fuzzy_pattern(), \ 'sorter': wilder#python_difflib_sorter(), \ 'engine': 're', \ 'debounce': 30, \ }), \ ), \ ]) let l:hl = wilder#make_hl('WilderAccent', 'Pmenu', [{}, {}, {'foreground': '#f4468f'}]) call wilder#set_option('renderer', wilder#popupmenu_renderer({ \ 'highlighter': wilder#basic_highlighter(), \ 'winblend': 5, \ 'max_height': 15, \ 'highlights': { \ 'accent': l:hl, \ }, \ 'apply_incsearch_fix': 0, \ })) catch /^Vim\%((\a\+)\)\=:E117/ echohl Error |echomsg "Wilder.nvim missing. Run :PackerInstall to install all plugins."|echohl None endtry endfunction "}} "}