506 lines
17 KiB
VimL
506 lines
17 KiB
VimL
"set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
|
"let &packpath = &runtimepath
|
|
"source ~/.vimrc
|
|
|
|
set suffixes+=.aux,.bbl,.blg,.brf,.cb,.dvi,.idx,.ilg,.ind,.inx,.jpg,.log,.out,.png,.toc
|
|
set suffixes-=.h
|
|
set suffixes-=.obj
|
|
|
|
set tabstop=3 softtabstop=3
|
|
set shiftwidth=3
|
|
set expandtab
|
|
set smartindent
|
|
" set foldmethod=indent
|
|
" set foldlevel=0
|
|
|
|
set undodir=~/.vim/undo
|
|
set undofile
|
|
|
|
set guifont=SauceCodePro\ NF\ Regular
|
|
|
|
set hlsearch
|
|
set hidden
|
|
set ignorecase
|
|
set smartcase
|
|
set wrap
|
|
set linebreak
|
|
" set guicursor= " always use the block cursor
|
|
syntax on
|
|
set redrawtime=1000 " max syntax highlight time
|
|
set number relativenumber
|
|
set noerrorbells
|
|
set encoding=UTF-8
|
|
set cursorline
|
|
set mouse=a
|
|
set incsearch
|
|
set scrolloff=6
|
|
" set wildmenu
|
|
" set wildmode=full
|
|
" TextEdit might fail if hidden is not set.
|
|
set hidden
|
|
set cmdheight=1 " Give more space for displaying messages.
|
|
" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
|
|
" delays and poor user experience.
|
|
set updatetime=300
|
|
" Don't pass messages to |ins-completion-menu|.
|
|
set shortmess+=c
|
|
" Spell check!
|
|
set spell spelllang=en_us
|
|
" spell check in git commits
|
|
autocmd Filetype gitcommit setlocal spell
|
|
set showcmd
|
|
set signcolumn=yes
|
|
" disable spell check in help files
|
|
autocmd FileType help setlocal nospell
|
|
filetype plugin on
|
|
" Macro for opening a new terminal with spell check off
|
|
command! Term tabnew | setlocal nospell | term
|
|
autocmd FileType help setlocal nospell
|
|
" test whitespace ->
|
|
" more test whitespace ->
|
|
" Indented text
|
|
" even more test whitespace ->
|
|
|
|
" Key bindings
|
|
let mapleader = " "
|
|
" *sigh*...
|
|
command! Q q
|
|
command! W w
|
|
command! Wq wq
|
|
command! WQ wq
|
|
" nnoremap ; :
|
|
" vnoremap ; :
|
|
" Press Alt h to toggle highlighting on/off, and show current value.
|
|
noremap <M-h> :set hlsearch! hlsearch?<CR>
|
|
" Escape to enter normal mode in the terminal
|
|
tnoremap <Esc> <C-\><C-n>
|
|
" Replace with alt S
|
|
nnoremap <M-s> :%s//g<Left><Left>
|
|
" Wrapped line movement (hold ctrl to move like a word processor)
|
|
nmap <C-h> h
|
|
nmap <C-j> gj
|
|
nmap <C-k> gk
|
|
nmap <C-l> l
|
|
" nmap <C-4> g$
|
|
nmap <C>$ g$
|
|
nmap <C-6> g^
|
|
nmap <C-^> g^
|
|
nmap <C-0> g^
|
|
vmap <C-h> h
|
|
vmap <C-j> gj
|
|
vmap <C-k> gk
|
|
vmap <C-l> l
|
|
vmap <C-4> g$
|
|
vmap <C>$ g$
|
|
vmap <C-6> g^
|
|
vmap <C-^> g^
|
|
vmap <C-0> g^
|
|
" " Hold ctrl to move between windows, shift to reorder the windows
|
|
" nmap <C-h> <C-w>h
|
|
" nmap <C-j> <C-w>j
|
|
" nmap <C-k> <C-w>k
|
|
" nmap <C-l> <C-w>l
|
|
" nmap <C-H> <C-w>H
|
|
" nmap <C-J> <C-w>J
|
|
" nmap <C-K> <C-w>K
|
|
" nmap <C-L> <C-w>L
|
|
" " and for visual mode
|
|
" vmap <C-h> <C-w>h
|
|
" vmap <C-j> <C-w>j
|
|
" vmap <C-k> <C-w>k
|
|
" vmap <C-l> <C-w>l
|
|
" vmap <C-H> <C-w>H
|
|
" vmap <C-J> <C-w>J
|
|
" vmap <C-K> <C-w>K
|
|
" vmap <C-L> <C-w>L
|
|
|
|
""""""" Quality of life things that aren't one line (also from stack overflow and stuff)
|
|
"Use 24-bit (true-color) mode in Vim/Neovim when outside tmux.
|
|
"If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support
|
|
"(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.)
|
|
if (empty($TMUX))
|
|
if (has("nvim"))
|
|
"For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >
|
|
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
|
|
endif
|
|
"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >
|
|
"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >
|
|
" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >
|
|
if (has("termguicolors"))
|
|
set termguicolors
|
|
endif
|
|
endif
|
|
|
|
" 'Visual At' plugin (https://github.com/stoeffel/.dotfiles/blob/master/vim/visual-at.vim)
|
|
xnoremap @ :<C-u>call ExecuteMacroOverVisualRange()<CR>
|
|
function! ExecuteMacroOverVisualRange()
|
|
echo "@".getcmdline()
|
|
execute ":'<,'>normal @".nr2char(getchar())
|
|
endfunction
|
|
|
|
" Make shift-insert work like in Xterm
|
|
if has('gui_running')
|
|
map <S-Insert> <MiddleMouse>
|
|
map! <S-Insert> <MiddleMouse>
|
|
endif
|
|
set exrc
|
|
|
|
" Automatically jump to the last position in a file when opening
|
|
if has("autocmd")
|
|
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
|
|
endif
|
|
|
|
"" Plugins
|
|
" disable polyglot in markdown (needs to go before it loads)
|
|
let g:polyglot_disabled = ['markdown']
|
|
" make ALE work with CoC
|
|
let g:ale_disable_lsp = 1
|
|
call plug#begin('$HOME/.vim/plugins/')
|
|
""" Colors
|
|
Plug 'joshdick/onedark.vim' " Theme (status line)
|
|
Plug 'romgrk/doom-one.vim' " Theme (UI)
|
|
Plug 'vim-airline/vim-airline' " Status line theme
|
|
Plug 'Yggdroot/indentLine' " Indent lines
|
|
Plug 'sheerun/vim-polyglot' " Syntax highlighting
|
|
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} " Syntax highlighting (neovim 0.5)
|
|
Plug 'airblade/vim-gitgutter' " Inline git info
|
|
" Plug 'tribela/vim-transparent' " Transparency always
|
|
|
|
""" IDE features/LSP
|
|
Plug 'editorconfig/editorconfig-vim' " editorconfig support
|
|
Plug 'neoclide/coc.nvim', {'branch': 'release'} " Code completion
|
|
Plug 'dense-analysis/ale' " Code formatting, linting
|
|
Plug 'dbeniamine/cheat.sh-vim' " cheat.sh
|
|
|
|
""" Smaller IDE features
|
|
Plug 'mbbill/undotree' " Undo tree
|
|
Plug 'jiangmiao/auto-pairs' " Quote pairing
|
|
Plug 'junegunn/vim-easy-align'
|
|
Plug 'tpope/vim-repeat' " Repeatability for various tpope plugins
|
|
Plug 'tpope/vim-surround' " Quote/parenthesis changing
|
|
Plug 'tpope/vim-sensible' " Some sensible defaults
|
|
Plug 'tpope/vim-commentary' " Comments
|
|
Plug 'tpope/vim-fugitive' " git integration
|
|
|
|
" File explorer
|
|
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
|
|
Plug 'tiagofumo/vim-nerdtree-syntax-highlight' " File type colors
|
|
Plug 'ryanoasis/vim-devicons' " File icons
|
|
Plug 'Xuyuanp/nerdtree-git-plugin' " File git status
|
|
|
|
" Misc
|
|
Plug 'junegunn/goyo.vim', {'for': 'markdown', 'on': 'Goyo'} " Minimalist writing mode
|
|
Plug 'glacambre/firenvim', { 'do': { _ -> firenvim#install(0) } } " Firefox nvim integration
|
|
|
|
call plug#end()
|
|
|
|
"""""""""""""""""""""""""""""" Things set as a result of plugins
|
|
""" Colors
|
|
set background=dark
|
|
if match(&runtimepath, 'doom-one') != -1
|
|
let g:doom_one_terminal_colors = v:true
|
|
colorscheme doom-one
|
|
elseif match(&runtimepath, 'one') != -1
|
|
let g:one_allow_italics = 1
|
|
colorscheme one
|
|
else
|
|
colorscheme slate
|
|
set nocursorline
|
|
endif
|
|
|
|
""" Transparency
|
|
if match(&runtimepath, 'transparent') != -1
|
|
call g:background#clear_background()
|
|
endif
|
|
|
|
""" Airline
|
|
if match(&runtimepath, 'airline') != -1
|
|
let g:airline_powerline_fonts = 1
|
|
let g:airline_detect_spell=0 " (*YES*, I KNOW I have spell check on all the time)
|
|
let g:airline#extensions#tabline#enabled = 1
|
|
let g:airline#extensions#tabline#formatter = 'unique_tail_improved'
|
|
if match(&runtimepath, 'onedark') != -1
|
|
let g:airline_theme='onedark'
|
|
elseif match(&runtimepath, 'one') != -1
|
|
let g:airline_theme='one'
|
|
endif
|
|
|
|
" this is the first bit of vimscript I ever wrote
|
|
function! Tabline_auto_show_hide()
|
|
let tab_count = tabpagenr("$")
|
|
if tab_count == 2
|
|
" if there is one tab
|
|
if &lines > 3
|
|
set showtabline=2
|
|
endif
|
|
" echom 'The tab bar was enabled'
|
|
elseif tab_count == 1
|
|
if &lines > 3
|
|
set showtabline=1
|
|
endif
|
|
" echom 'The tab bar was disabled'
|
|
endif
|
|
endfunction
|
|
|
|
augroup TablineShowHide
|
|
" autocmd! BufEnter * call Tabline_auto_show_hide()
|
|
autocmd! TabNew * call Tabline_auto_show_hide()
|
|
autocmd! TabClosed * call Tabline_auto_show_hide()
|
|
autocmd! VimEnter * call Tabline_auto_show_hide()
|
|
autocmd! User GoyoLeave * call Tabline_auto_show_hide()
|
|
augroup END
|
|
endif
|
|
|
|
""" Commentary
|
|
if match(&runtimepath, 'commentary') != -1
|
|
nnoremap <Leader>l :Commentary<CR>
|
|
endif
|
|
|
|
""" indentline
|
|
if match(&runtimepath, 'indentline') != -1
|
|
let g:indentLine_char = '▏'
|
|
let g:indentLine_conceallevel = 1
|
|
let g:indentLine_fileTypeExclude = ['markdown']
|
|
endif
|
|
|
|
""" CtrlP
|
|
if match(&runtimepath, 'indentline') != -1
|
|
let g:ctrlp_map = '<c-p>'
|
|
let g:ctrlp_cmd = 'CtrlP'
|
|
let g:ctrlp_working_path_mode = 'ra'
|
|
" set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*. " ignored file extensions
|
|
" let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard'] " Ignoer files in .gitignore's
|
|
endif
|
|
|
|
""" Undotree
|
|
if match(&runtimepath, 'undotree') != -1
|
|
nnoremap <F5> :UndotreeToggle<CR>
|
|
endif
|
|
|
|
""" Asynchronous Lint Engine (ALE)
|
|
" if match(&runtimepath, 'ale') != -1
|
|
" endif
|
|
|
|
""" Auto-pairs
|
|
if match(&runtimepath, 'autopairs') != -1
|
|
let g:AutoPairsFlyMode = 1
|
|
endif
|
|
|
|
""" Goyo
|
|
if match(&runtimepath, 'indentline') != -1
|
|
function! s:goyo_enter()
|
|
if executable('tmux') && strlen($TMUX)
|
|
silent !tmux set status off
|
|
silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z
|
|
endif
|
|
" silent Limelight
|
|
echo
|
|
endfunction
|
|
|
|
function! s:goyo_leave()
|
|
if executable('tmux') && strlen($TMUX)
|
|
silent !tmux set status on
|
|
silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z
|
|
endif
|
|
" set showmode
|
|
" set showcmd
|
|
" set scrolloff=5
|
|
" silent Limelight!
|
|
echo
|
|
endfunction
|
|
|
|
autocmd! User GoyoEnter nested call <SID>goyo_enter()
|
|
autocmd! User GoyoLeave nested call <SID>goyo_leave()
|
|
endif
|
|
|
|
""" Treesitter
|
|
if match(&runtimepath, 'treesitter') != -1
|
|
lua << EOF
|
|
require'nvim-treesitter.configs'.setup {
|
|
ensure_installed = "maintained", -- one of "all", "maintained" (parsers with maintainers), or a list of languages
|
|
--ignore_install = { "javascript", "java" }, -- List of parsers to ignore installing
|
|
highlight = {
|
|
enable = true, -- false will disable the whole extension
|
|
-- disable = { "c", "rust" }, -- list of language that will be disabled
|
|
-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
|
|
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
|
|
-- Using this option may slow down your editor, and you may see some duplicate highlights.
|
|
-- Instead of true it can also be a list of languages
|
|
additional_vim_regex_highlighting = true,
|
|
},
|
|
indent = {
|
|
enable = true
|
|
}
|
|
}
|
|
EOF
|
|
endif
|
|
|
|
""" CoC
|
|
if match(&runtimepath, 'coc') != -1
|
|
" Set internal encoding of vim, not needed on neovim, since coc.nvim using some
|
|
" unicode characters in the file autoload/float.vim
|
|
set encoding=utf-8
|
|
|
|
" TextEdit might fail if hidden is not set.
|
|
set hidden
|
|
|
|
" Some servers have issues with backup files, see #649.
|
|
set nobackup
|
|
set nowritebackup
|
|
|
|
" Give more space for displaying messages.
|
|
set cmdheight=1
|
|
|
|
" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
|
|
" delays and poor user experience.
|
|
set updatetime=300
|
|
|
|
" Don't pass messages to |ins-completion-menu|.
|
|
set shortmess+=c
|
|
|
|
" Always show the signcolumn, otherwise it would shift the text each time
|
|
" diagnostics appear/become resolved.
|
|
if has("patch-8.1.1564")
|
|
" Recently vim can merge signcolumn and number column into one
|
|
set signcolumn=number
|
|
else
|
|
set signcolumn=yes
|
|
endif
|
|
|
|
" Use tab for trigger completion with characters ahead and navigate.
|
|
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
|
|
" other plugin before putting this into your config.
|
|
inoremap <silent><expr> <TAB>
|
|
\ pumvisible() ? "\<C-n>" :
|
|
\ <SID>check_back_space() ? "\<TAB>" :
|
|
\ coc#refresh()
|
|
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
|
|
|
|
function! s:check_back_space() abort
|
|
let col = col('.') - 1
|
|
return !col || getline('.')[col - 1] =~# '\s'
|
|
endfunction
|
|
|
|
" Use <c-space> to trigger completion.
|
|
if has('nvim')
|
|
inoremap <silent><expr> <c-space> coc#refresh()
|
|
else
|
|
inoremap <silent><expr> <c-@> coc#refresh()
|
|
endif
|
|
|
|
" Make <CR> auto-select the first completion item and notify coc.nvim to
|
|
" format on enter, <cr> could be remapped by other vim plugin
|
|
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
|
|
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
|
|
|
|
" Use `[g` and `]g` to navigate diagnostics
|
|
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
|
|
nmap <silent> [g <Plug>(coc-diagnostic-prev)
|
|
nmap <silent> ]g <Plug>(coc-diagnostic-next)
|
|
|
|
" GoTo code navigation.
|
|
nmap <silent> gd <Plug>(coc-definition)
|
|
nmap <silent> gy <Plug>(coc-type-definition)
|
|
nmap <silent> gi <Plug>(coc-implementation)
|
|
nmap <silent> gr <Plug>(coc-references)
|
|
|
|
" Use K to show documentation in preview window.
|
|
nnoremap <silent> K :call <SID>show_documentation()<CR>
|
|
|
|
function! s:show_documentation()
|
|
if (index(['vim','help'], &filetype) >= 0)
|
|
execute 'h '.expand('<cword>')
|
|
elseif (coc#rpc#ready())
|
|
call CocActionAsync('doHover')
|
|
else
|
|
execute '!' . &keywordprg . " " . expand('<cword>')
|
|
endif
|
|
endfunction
|
|
|
|
" Highlight the symbol and its references when holding the cursor.
|
|
autocmd CursorHold * silent call CocActionAsync('highlight')
|
|
|
|
" Symbol renaming.
|
|
nmap <leader>rn <Plug>(coc-rename)
|
|
|
|
" Formatting selected code.
|
|
xmap <leader>f <Plug>(coc-format-selected)
|
|
nmap <leader>f <Plug>(coc-format-selected)
|
|
|
|
augroup mygroup
|
|
autocmd!
|
|
" Setup formatexpr specified filetype(s).
|
|
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
|
|
" Update signature help on jump placeholder.
|
|
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
|
|
augroup end
|
|
|
|
" Applying codeAction to the selected region.
|
|
" Example: `<leader>aap` for current paragraph
|
|
xmap <leader>a <Plug>(coc-codeaction-selected)
|
|
nmap <leader>a <Plug>(coc-codeaction-selected)
|
|
|
|
" Remap keys for applying codeAction to the current buffer.
|
|
nmap <leader>ac <Plug>(coc-codeaction)
|
|
" Apply AutoFix to problem on the current line.
|
|
nmap <leader>qf <Plug>(coc-fix-current)
|
|
|
|
" Map function and class text objects
|
|
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
|
|
xmap if <Plug>(coc-funcobj-i)
|
|
omap if <Plug>(coc-funcobj-i)
|
|
xmap af <Plug>(coc-funcobj-a)
|
|
omap af <Plug>(coc-funcobj-a)
|
|
xmap ic <Plug>(coc-classobj-i)
|
|
omap ic <Plug>(coc-classobj-i)
|
|
xmap ac <Plug>(coc-classobj-a)
|
|
omap ac <Plug>(coc-classobj-a)
|
|
|
|
" Remap <C-f> and <C-b> for scroll float windows/popups.
|
|
if has('nvim-0.4.0') || has('patch-8.2.0750')
|
|
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
|
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
|
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
|
|
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
|
|
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
|
|
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
|
|
endif
|
|
|
|
" Use CTRL-S for selections ranges.
|
|
" Requires 'textDocument/selectionRange' support of language server.
|
|
nmap <silent> <C-s> <Plug>(coc-range-select)
|
|
xmap <silent> <C-s> <Plug>(coc-range-select)
|
|
|
|
" Add `:Format` command to format current buffer.
|
|
command! -nargs=0 Format :call CocAction('format')
|
|
|
|
" Add `:Fold` command to fold current buffer.
|
|
command! -nargs=? Fold :call CocAction('fold', <f-args>)
|
|
|
|
" Add `:OR` command for organize imports of the current buffer.
|
|
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')
|
|
|
|
" Add (Neo)Vim's native statusline support.
|
|
" NOTE: Please see `:h coc-status` for integrations with external plugins that
|
|
" provide custom statusline: lightline.vim, vim-airline.
|
|
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
|
|
|
|
" Mappings for CoCList
|
|
" Show all diagnostics.
|
|
nnoremap <silent><nowait> <space>a :<C-u>CocList diagnostics<cr>
|
|
" Manage extensions.
|
|
nnoremap <silent><nowait> <space>e :<C-u>CocList extensions<cr>
|
|
" Show commands.
|
|
nnoremap <silent><nowait> <space>C :<C-u>CocList commands<cr>
|
|
" Find symbol of current document.
|
|
nnoremap <silent><nowait> <space>o :<C-u>CocList outline<cr>
|
|
" Search workspace symbols.
|
|
nnoremap <silent><nowait> <space>s :<C-u>CocList -I symbols<cr>
|
|
" Do default action for next item.
|
|
nnoremap <silent><nowait> <space>j :<C-u>CocNext<CR>
|
|
" Do default action for previous item.
|
|
nnoremap <silent><nowait> <space>k :<C-u>CocPrev<CR>
|
|
" Resume latest coc list.
|
|
nnoremap <silent><nowait> <space>p :<C-u>CocListResume<CR>
|
|
endif
|
|
"""""""""""""""""""""""""""" END Plugin-dependent settings
|