dotfiles/cli/vim/init.vim
2021-09-04 09:58:19 +08:00

345 lines
9.4 KiB
VimL

" basic settings
set ts=4
set sw=4
set cc=120
set expandtab
set nu
set hidden
set list
set autoindent
set confirm
set noundofile
set nobackup
set nowritebackup
set hlsearch
set noswapfile
set ignorecase
set smarttab
set smartindent
set cursorline
set incsearch
set signcolumn=yes
set laststatus=2
set fillchars=vert:\ ,fold:-
set clipboard=unnamedplus " system clipboard as default register. for vim to work need installing gvim package
set mouse=a
set spell
filetype plugin indent on
syntax on
au! BufWritePost $MYVIMRC source %
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-f> <Right>
cnoremap <C-b> <Left>
cnoremap <C-d> <Delete>
cnoremap <C-n> <Down>
cnoremap <C-p> <Up>
inoremap <C-a> <Home>
inoremap <C-e> <End>
inoremap <C-f> <Right>
inoremap <C-b> <Left>
inoremap <C-d> <Delete>
inoremap <C-n> <Down>
inoremap <C-p> <Up>
noremap <C-a> <Home>
noremap <C-e> <End>
noremap <C-f> <Right>
noremap <C-b> <Left>
vnoremap <leader>p pgvy
nnoremap <leader>q :qall<CR>
nnoremap <Leader>v <c-v>
nnoremap <Leader>s :b#<CR>
nnoremap <leader>1 :b1<CR>
nnoremap <leader>2 :b2<CR>
nnoremap <leader>3 :b3<CR>
nnoremap <leader>4 :b4<CR>
nnoremap <leader>5 :b5<CR>
nnoremap <leader>w :w<CR>
nnoremap <leader><Esc> :noh<return><esc>
function! WSLCopy()
" Why is this not a built-in Vim script function?!
let [line_start, column_start] = getpos("'<")[1:2]
let [line_end, column_end] = getpos("'>")[1:2]
let lines = getline(line_start, line_end)
if len(lines) == 0
return ''
endif
let lines[-1] = lines[-1][: column_end - (&selection == 'inclusive' ? 1 : 2)]
let lines[0] = lines[0][column_start - 1:]
call system('xsel -b', join(lines, "\n"))
endfunction
xnoremap <leader>y <esc>:call WSLCopy()<CR>
nmap <leader>"" ysiW"
nmap <leader>'' ysiW'
nmap <leader>" ysiw"
nmap <leader>' ysiw'
nmap <leader>`` ysiW`
nmap <leader>` ysiw`
nmap <leader>sb :windo set scrollbind<CR>:windo set cursorbind<CR>:set mouse=a<CR>
nmap <leader>nsb :windo set noscrollbind<CR>:windo set nocursorbind<CR>:set mouse=<CR>
inoremap <C-w> <esc><C-w>
nmap <silent> <leader>ss :syntax sync fromstart<CR>
" // to search highlighted text
vnoremap // y/\V<C-R>=escape(@",'/\')<CR><CR>
" trailing spaces
highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
au Syntax * match ExtraWhitespace /\s\+$/
nnoremap <leader>es :%s/\s\+$//g<CR>
" location jumping
nnoremap <leader>n :cnext<CR>
nnoremap <leader>p :cprev<CR>
" auto install vim-plug
if has('nvim')
if has('win32')
let vim_plug_path = $LOCALAPPDATA . "/nvim/autoload/plug.vim"
else
let vim_plug_path = expand("~/.config/nvim/autoload/plug.vim")
endif
else
set ttymouse=sgr
"map <ScrollWheelUp> <C-Y>
"map <ScrollWheelDown> <C-E>
let vim_plug_path = expand("~/.vim/autoload/plug.vim")
set listchars=eol:\ ,tab:>\ ,trail:~,extends:>,precedes:<
endif
let vim_plug_just_installed = 0
if !filereadable(vim_plug_path)
echo "Installing vim-plug..."
:exe "!curl -fLo \"" . vim_plug_path . "\" --create-dirs https://gitee.com/klesh/vim-plug/raw/master/plug.vim"
let vim_plug_just_installed = 1
echo "vim-plug installed"
endif
call plug#begin('~/.vim/plugged')
Plug 'editorconfig/editorconfig-vim'
Plug 'tpope/vim-surround'
Plug 'jiangmiao/auto-pairs'
Plug 'posva/vim-vue', { 'for': 'vue' }
Plug 'tpope/vim-repeat'
Plug 'liuchengxu/eleline.vim'
Plug 'klesh/vim-fugitive' " git 功能
Plug 'scrooloose/nerdcommenter'
Plug 'mhinz/vim-grepper', { 'on': ['Grepper', '<plug>(GrepperOperator)'] }
Plug 'morhetz/gruvbox'
Plug 'klesh/vim-fish', { 'for': 'fish' }
Plug 'alvan/vim-closetag', { 'for': ['vue', 'html', 'xml'] }
"Plug 'francoiscabrol/ranger.vim'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'preservim/nerdtree'
if $VIM_MODE == 'enhanced'
if !executable("node") || !executable("yarnpkg")
echo "nodejs/yarnpkg must be installed in order to use coc.nvim"
else
Plug 'neoclide/coc.nvim', {'branch': 'release'}
end
Plug 'chrisbra/Colorizer'
Plug 'tpope/vim-markdown', { 'for': 'markdown' }
Plug 'cespare/vim-toml', { 'for': 'toml' }
Plug 'vim-scripts/mom.vim'
else
Plug 'Vimjas/vim-python-pep8-indent', { 'for': 'python' }
endif
if has('win32')
Plug 'zigford/vim-powershell'
endif
call plug#end()
" ==== vim-markdown configuration ====
let g:vim_markdown_folding_disabled = 1
" ==== vim-closetag configuration ====
let g:closetag_filetypes = 'html,xhtml,phtml,vue'
if $VIM_MODE == 'enhanced'
" ==== coc configuration ====
let g:coc_global_extensions = [
\ 'coc-diagnostic',
\ 'coc-clangd'
\ ]
"let g:coc_disable_startup_warning = 1
set statusline^=%{coc#status()}
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)
xmap <silent> <leader>fs <Plug>(coc-format-selected)
nmap <silent> <leader>fs <Plug>(coc-format-selected)
nmap <silent> <leader>fd <Plug>(coc-format)
nmap <silent> <leader>rn <Plug>(coc-rename)
nmap <silent> <leader>ne <Plug>(coc-diagnostic-next-error)
nmap <silent> <leader>pe <Plug>(coc-diagnostic-prev-error)
nmap <silent> <leader>oi :CocInfo<CR>
"nmap <silent> <leader>ol :<C-u>CocList<CR>
nmap <silent> <leader>olr :<C-u>CocListResume<CR>
nmap <silent> <leader>od :call CocAction('doHover')<CR>
nmap <silent> <leader>ol <Plug>(coc-openlink)
nmap <silent> <leader>oc :CocCommand<CR>
autocmd BufEnter,BufRead,BufNewFile *.js set syntax=typescript
" ==== vimspector configuration ====
let g:vimspector_enable_mappings = 'VISUAL_STUDIO'
let g:vimspector_install_gadgets = [ 'debugpy', 'vscode-cpptools' ]
endif
" ==== auto-pairs configuration ====
nmap <silent> <leader>ap :call AutoPairsToggle()<CR>
let g:AutoPairsShortcutToggle = ''
" ==== grepper configuration ====
"
nnoremap <leader>sg :Grepper -tool git<CR>
nnoremap <leader>sc :Grepper -tool grep<CR>
nnoremap <leader>sa :Grepper -tool ag<CR>
" ==== quickfix configuration ====
nnoremap <leader>j :cn<CR>
nnoremap <leader>k :cp<CR>
"" ==== NERDTree configuration ====
"nnoremap <leader>fe :NERDTreeToggle<CR>
" ==== Ranger configuration ====
let g:ranger_map_keys = 0
"nnoremap <C-t> :Ranger<CR>
" ==== netrw configuration ====
nnoremap <C-t> :Explore<CR>
autocmd BufEnter,BufRead nnoremap <leader>cg :<C-u>call OpenRangerIn(system("git rev-parse --show-toplevel >/dev/null || pwd"), 'edit ')<CR>
" ==== fugitive configuration ====
nnoremap <leader>gs :Gstatus<CR>
nnoremap <leader>gc :Gcommit<CR>
nnoremap <leader>gp :Gpush<CR>
nnoremap <leader>gg :Gpull<CR>
nnoremap <leader>gd :Gdiff<CR>
nnoremap <leader>gb :Gblame<CR>
nnoremap <leader>gl :Glog<CR>
nnoremap <leader>gms :Gvdiffsplit!<CR>
nnoremap <leader>gmh :diffget //2<CR>
nnoremap <leader>gml :diffget //3<CR>
nnoremap <leader>gsc :exec "!git switch -c " . input("Enter new branch name:")<CR>
" ==== functions ======
fu! SilentOK(cmd)
let l:output = system(substitute(a:cmd, "%", expand("%"), "g"))
if v:shell_error != 0
echo l:output
endif
endfu
fu! SystemOr(cmd, default)
let l:output = system(substitute(a:cmd, "%", expand("%"), "g"))
if v:shell_error != 0
return a:default
endif
return trim(l:output)
endfu
" ==== ctrlp configuration ====
"let g:ctrlp_user_command = ['.git', 'git ls-files -co --exclude-standard']
" ==== fzf configuration ====
" enable <C-p> for fzf
let g:fugitive_no_maps=1
let $FZF_DEFAULT_COMMAND = 'ag --hidden --ignore .git -l -g ""'
nnoremap <C-p> :call fzf#vim#files(SystemOr("git rev-parse --show-toplevel", "."))<Cr>
nnoremap <leader>gco :call fzf#run({'source': 'git branch \| cut -c 3-; git tag -l', 'sink': '!git checkout'})<CR>
nnoremap <leader>gm :call fzf#run({'source': 'git branch \| cut -c 3-', 'sink': '!git merge'})<CR>
nnoremap <leader>b :Buffers<CR>
" ==== gruvbox configuration ====
color gruvbox
set background=dark
" for background transparence to work
highlight Normal ctermbg=None
highlight CursorLine ctermbg=240
" ==== NERDCommenter for vue ====
let g:ft = ''
fu! NERDCommenter_before()
if &ft == 'vue'
let g:ft = 'vue'
let stack = synstack(line('.'), col('.'))
if len(stack) > 0
let syn = synIDattr((stack)[0], 'name')
if len(syn) > 0
let syn = tolower(syn)
exe 'setf '.syn
endif
endif
endif
endfu
fu! NERDCommenter_after()
if g:ft == 'vue'
setf vue
g:ft
endif
endfu
" ==== groff ====
fu! ToggleGroffMomAutoCompilation()
let g:GroffMomAutoCompilation = !get(g:, "GroffMomAutoCompilation", 0)
augroup GroffPdf
autocmd!
augroup END
if g:GroffMomAutoCompilation
augroup GroffPdf
autocmd BufWritePost,FileWritePost *.mom :call SilentOK("groff -Kutf8 -mom % > /tmp/tmp.ps && ps2pdf /tmp/tmp.ps %.pdf")
augroup END
echo "Auto compilation for groff_mom enabled"
else
echo "Auto compilation for groff_mom disabled"
endif
endfu
nnoremap <leader>ac :call ToggleGroffMomAutoCompilation()<CR>
autocmd BufEnter,BufRead *.mom :set ft=mom
" for yaml need cursorcolumn
autocmd FileType yaml :set cursorcolumn
" spell highlight
highlight clear SpellBad
highlight SpellBad cterm=underline
highlight SpellBad gui=undercurl
" commitmsg
autocmd BufEnter,BufRead commitmsg.md :set colorcolumn=100
" nerdtree
nnoremap <leader>t :NERDTreeToggle<CR>