PageRenderTime 56ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/vim/init.vim

https://github.com/superbrothers/dotfiles
Vim Script | 380 lines | 275 code | 55 blank | 50 comment | 18 complexity | a18093c1cf8e01f71f5e196a2e2fe4f3 MD5 | raw file
  1. if has('vim_starting')
  2. set rtp+=~/.vim/plugged/vim-plug
  3. if !isdirectory(expand('~/.vim/plugged/vim-plug'))
  4. echo 'Install vim-plug...'
  5. call system('mkdir -p ~/.vim/plugged/vim-plug')
  6. call system('git clone git://github.com/junegunn/vim-plug.git ~/.vim/plugged/vim-plug/autoload')
  7. end
  8. endif
  9. " detect os type
  10. let uname = substitute(system('uname'), '\n', '', '')
  11. call plug#begin('~/.vim/plugged')
  12. Plug 'junegunn/vim-plug', {'dir': '~/.vim/plugged/vim-plug/autoload'}
  13. Plug 'superbrothers/vim-bclose'
  14. Plug 'Yggdroot/indentLine'
  15. Plug 'airblade/vim-gitgutter'
  16. Plug 'tpope/vim-fugitive'
  17. Plug 'tpope/vim-rhubarb'
  18. Plug 'fatih/molokai'
  19. Plug 'vim-airline/vim-airline'
  20. Plug 'vim-airline/vim-airline-themes'
  21. Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' }
  22. Plug 'junegunn/fzf.vim'
  23. Plug 'scrooloose/nerdtree'
  24. Plug 'Xuyuanp/nerdtree-git-plugin'
  25. Plug 'scrooloose/nerdcommenter'
  26. Plug 'mattn/webapi-vim'
  27. Plug 'mattn/gist-vim', { 'on': ['Gist'] }
  28. Plug 'ekalinin/Dockerfile.vim', { 'for': ['Dockerfile'] }
  29. Plug 'majutsushi/tagbar', { 'tag': '*' }
  30. Plug 'elzr/vim-json', { 'for' : 'json' }
  31. Plug 'tyru/open-browser.vim'
  32. Plug 'ConradIrwin/vim-bracketed-paste'
  33. Plug 't9md/vim-choosewin'
  34. Plug 'godlygeek/tabular', { 'for' : 'markdown' }
  35. Plug 'plasticboy/vim-markdown', { 'for' : 'markdown' }
  36. Plug 'noahfrederick/vim-skeleton'
  37. Plug 'vim-scripts/YankRing.vim'
  38. Plug 'othree/eregex.vim'
  39. Plug 'ap/vim-buftabline'
  40. Plug 'fatih/vim-go', { 'for': 'go', 'do': ':GoInstallBinaries' }
  41. Plug 'hashivim/vim-terraform', { 'for': 'tf' }
  42. Plug 'cespare/vim-toml', { 'for': 'toml' }
  43. Plug 'google/vim-jsonnet'
  44. " vim-lsp
  45. Plug 'prabirshrestha/async.vim'
  46. Plug 'prabirshrestha/asyncomplete.vim'
  47. Plug 'prabirshrestha/asyncomplete-lsp.vim'
  48. Plug 'prabirshrestha/vim-lsp'
  49. Plug 'mattn/vim-lsp-settings'
  50. Plug 'mattn/vim-goimports'
  51. Plug 'mattn/vim-lsp-icons'
  52. if uname == 'Linux'
  53. Plug 'wincent/vim-clipper'
  54. endif
  55. if uname == 'Darwin'
  56. Plug 'zerowidth/vim-copy-as-rtf'
  57. endif
  58. call plug#end()
  59. set nocompatible
  60. filetype off
  61. filetype plugin indent on
  62. set ttyfast
  63. set lazyredraw
  64. " http://stackoverflow.com/questions/20186975/vim-mac-how-to-copy-to-clipboard-without-pbcopy
  65. set clipboard^=unnamed
  66. set clipboard^=unnamedplus
  67. " increase max memory to show syntax highlighting for large files
  68. set maxmempattern=20000
  69. """ ENCODING
  70. set encoding=utf-8
  71. set fileencoding=utf-8
  72. """ DISPLAY
  73. set number
  74. set ruler
  75. set laststatus=2
  76. set list
  77. set listchars=tab:>-,trail:_
  78. set linespace=0
  79. set showcmd
  80. set cmdheight=1
  81. set hlsearch
  82. set foldmethod=marker
  83. set nocursorcolumn
  84. set nocursorline
  85. set completeopt=menuone,noinsert
  86. set conceallevel=0
  87. """ COLOR
  88. syntax on
  89. set t_Co=256
  90. set background=dark
  91. let g:molokai_original = 1
  92. let g:rehash256 = 1
  93. colorscheme molokai
  94. highlight Normal ctermbg=NONE guibg=NONE
  95. highlight NonText ctermbg=NONE guibg=NONE
  96. highlight SpecialKey ctermbg=NONE guibg=NONE
  97. highlight EndOfBuffer ctermbg=NONE guibg=NONE
  98. """ TAB
  99. set tabstop=4
  100. set softtabstop=4
  101. set shiftwidth=4
  102. set expandtab
  103. set shiftround
  104. """ INDENT
  105. set autoindent
  106. set backspace=indent,eol,start
  107. set smartindent
  108. """ FILE
  109. set autoread
  110. set autowrite
  111. set hidden
  112. set autochdir
  113. set nobackup
  114. set noswapfile
  115. """ SEARCH
  116. set ignorecase
  117. set smartcase
  118. set wrapscan
  119. set incsearch
  120. """ HISTORY
  121. set history=1000
  122. """ COMPLETE
  123. set infercase
  124. set wildmenu
  125. set wildmode=list:longest,full
  126. """ MODELINE
  127. set modeline
  128. set modelines=5
  129. """ KEY REMAP
  130. let mapleader = ","
  131. " Move cursor by display lines when wrapping
  132. nmap j gj
  133. nmap k gk
  134. vmap j gj
  135. vmap k gk
  136. " emacs like keys
  137. cnoremap <C-B> <Left>
  138. cnoremap <C-F> <Right>
  139. cnoremap <C-A> <Home>
  140. cnoremap <C-E> <End>
  141. cnoremap <A-b> <S-Left>
  142. cnoremap <A-f> <S-Right>
  143. inoremap <C-A> <Home>
  144. inoremap <C-B> <Left>
  145. inoremap <C-D> <Del>
  146. inoremap <C-E> <End>
  147. inoremap <C-F> <Right>
  148. inoremap <A-n> <Down>
  149. inoremap <A-p> <Up>
  150. inoremap <A-b> <S-Left>
  151. inoremap <A-f> <S-Right>
  152. " operate buffer
  153. nnoremap <silent> bb :b#<CR>
  154. nnoremap <silent> bp :bp<CR>
  155. nnoremap <silent> bn :bn<CR>
  156. nnoremap <silent> bd :Bclose<CR>
  157. " insert datetime
  158. inoremap <Leader>date <C-R>=strftime('%Y/%m/%d %H:%M:%S')<CR>
  159. inoremap <Leader>time <C-R>=strftime('%H:%M')<CR>
  160. " close window
  161. nnoremap cl :close<CR>
  162. " quick vimrc
  163. nnoremap <Leader>. :<C-u>edit $MYVIMRC<CR>
  164. nnoremap <Leader>s. :<C-u>source $MYVIMRC<CR>
  165. " execute current buffer
  166. nmap <Leader>e :execute '!' &ft ' %'<CR>
  167. " toggle paste mode
  168. nnoremap <Leader>tp :<C-u>set paste!<CR>
  169. " no search highlight
  170. nnoremap gh :nohlsearch<CR>
  171. " don't yank with replaced word
  172. xnoremap p "_dP
  173. """ NVIM
  174. if has('nvim')
  175. let g:clipboard = {
  176. \ 'name': 'myclipboard',
  177. \ 'copy': {
  178. \ '*': ['pbcopy'],
  179. \ '+': ['pbcopy'],
  180. \ },
  181. \ 'cache_enabled': 1,
  182. \ }
  183. endif
  184. """ PLUGINS
  185. " indentLine ======================================
  186. let g:indentLine_conceallevel=0
  187. " vim-airline ======================================
  188. let g:airline_theme='molokai'
  189. " fugitive =========================================
  190. vnoremap <leader>gb :Gblame<CR>
  191. nnoremap <leader>gb :Gblame<CR>
  192. " fzf ===============================================
  193. let g:fzf_command_prefix = 'Fzf'
  194. let g:fzf_layout = { 'down': '~20%' }
  195. nmap <Leader>p :FzfHistory<CR>
  196. imap <Leader>p <esc>:<C-u>FzfHistory<cr>
  197. nmap <Leader>] :FzfGFiles<CR>
  198. imap <Leader>] <esc>:<C-u>FzfGFiles<CR>
  199. nmap <Leader>[ :FzfFiles<cr>
  200. imap <Leader>[ <esc>:<C-u>FzfFiles<cr>
  201. let g:rg_command = '
  202. \ rg --column --line-number --no-heading --fixed-strings --ignore-case --no-ignore --hidden --follow --color "always"
  203. \ -g "*.{js,json,php,md,styl,jade,html,config,py,cpp,c,go,hs,rb,conf}"
  204. \ -g "!{.git,node_modules,vendor}/*" '
  205. command! -bang -nargs=* Rg
  206. \ call fzf#vim#grep(
  207. \ 'rg --column --line-number --no-heading --color=always '.shellescape(<q-args>), 1,
  208. \ <bang>0 ? fzf#vim#with_preview('up:60%')
  209. \ : fzf#vim#with_preview('right:50%:hidden', '?'),
  210. \ <bang>0)
  211. command! -bang -nargs=* F call fzf#vim#grep(g:rg_command .shellescape(<q-args>), 1, <bang>0)
  212. " NERDTree =========================================
  213. let g:NERDTreeShowHidden=1
  214. let g:NERDTreeChDirMode=2
  215. nnoremap <silent><C-e> :NERDTreeToggle<CR>
  216. " start NERDTree
  217. autocmd VimEnter * if argc() > 0 && &filetype != "gitcommit" | NERDTree | endif
  218. " go to previous (last accessed) window
  219. autocmd VimEnter * wincmd p
  220. " close vim if the only window left open is a NERDTree
  221. autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
  222. " asyncomplete ====================================
  223. let g:asyncomplete_auto_popup = 1
  224. let g:asyncomplete_auto_completeopt = 0
  225. " Force refresh completion
  226. imap <C-Space> <Plug>(asyncomplete_force_refresh)
  227. " To auto close preview window when completion is done.
  228. autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif
  229. " vim-lsp =========================================
  230. if empty(globpath(&rtp, 'autoload/lsp.vim'))
  231. finish
  232. endif
  233. function! s:on_lsp_buffer_enabled() abort
  234. setlocal omnifunc=lsp#complete
  235. setlocal signcolumn=yes
  236. if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
  237. nmap <buffer> gd <plug>(lsp-definition)
  238. nmap <buffer> gs <plug>(lsp-document-symbol-search)
  239. nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
  240. nmap <buffer> gr <plug>(lsp-references)
  241. nmap <buffer> gi <plug>(lsp-implementation)
  242. nmap <buffer> gt <plug>(lsp-type-definition)
  243. nmap <buffer> <leader>rn <plug>(lsp-rename)
  244. nmap <buffer> [g <Plug>(lsp-previous-diagnostic)
  245. nmap <buffer> ]g <Plug>(lsp-next-diagnostic)
  246. nmap <buffer> K <plug>(lsp-hover)
  247. autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')
  248. endfunction
  249. augroup lsp_install
  250. au!
  251. autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
  252. augroup END
  253. command! LspDebug let lsp_log_verbose=1 | let lsp_log_file = expand('~/lsp.log')
  254. " tagbar ===============================================
  255. noremap <Leader>t :TagbarToggle<CR>
  256. let g:tagbar_autofocus = 1
  257. let g:tagbar_type_go = {
  258. \ 'ctagstype' : 'go',
  259. \ 'kinds' : [
  260. \ 'p:package',
  261. \ 'i:imports:1',
  262. \ 'c:constants',
  263. \ 'v:variables',
  264. \ 't:types',
  265. \ 'n:interfaces',
  266. \ 'w:fields',
  267. \ 'e:embedded',
  268. \ 'm:methods',
  269. \ 'r:constructor',
  270. \ 'f:functions'
  271. \ ],
  272. \ 'sro' : '.',
  273. \ 'kind2scope' : {
  274. \ 't' : 'ctype',
  275. \ 'n' : 'ntype'
  276. \ },
  277. \ 'scope2kind' : {
  278. \ 'ctype' : 't',
  279. \ 'ntype' : 'n'
  280. \ },
  281. \ 'ctagsbin' : 'gotags',
  282. \ 'ctagsargs' : '-sort -silent'
  283. \ }
  284. " vim-choosewin ==============================================
  285. nmap - <Plug>(choosewin)
  286. let g:choosewin_overlay_enable = 1
  287. " vim-markdown ===============================================
  288. let g:vim_markdown_folding_disabled = 1
  289. let g:vim_markdown_toc_autofit = 1
  290. " scrooloose/nerdcommenter ===================================
  291. let g:NERDSpaceDelims = 1
  292. let g:NERDCompactSexyComs = 1
  293. nmap ,, <Plug>NERDCommenterToggle
  294. vmap ,, <Plug>NERDCommenterToggle
  295. " vim-scripts/YangRing.vim ==================================
  296. let g:yankring_history_dir = $HOME.'/'
  297. let g:yankring_history_file = '.yankring_history'
  298. let g:yankring_paste_v_akey = ''
  299. let g:yankring_paste_v_bkey = ''
  300. let g:yankring_paste_v_key = ''
  301. nmap ,y :YRShow<CR>
  302. " vim-go =================================-=
  303. let g:go_code_completion_enabled = 0
  304. let g:go_gopls_enabled = 1
  305. let g:go_fmt_autosave = 0
  306. let g:go_mod_fmt_autosave = 0
  307. let g:go_asmfmt_autosave = 0
  308. let g:go_metalinter_autosave = 0
  309. let g:go_auto_type_info = 0
  310. " othree/eregex.vim ==========================================
  311. nnoremap / :M/
  312. nnoremap ,/ /
  313. " vim-clipper ================================================
  314. let g:ClipperAddress = '~/.clipper.sock'
  315. let g:ClipperPort = 0
  316. " disable vim-clipper if ~/.clipper.sock does not exist
  317. if empty(glob('~/.clipper.sock'))
  318. let g:ClipperLoaded = 1
  319. endif
  320. """ OTHERS
  321. " Restore the last cursor position of a file
  322. autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g`\"" | endif
  323. if filereadable(glob('~/.vimrc.local'))
  324. source ~/.vimrc.local
  325. endif