vimrc 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. " wreed vimrc
  2. " vim:foldmethod=marker:foldlevel=0:
  3. " let g:python_host_prog= expand('$HOME') . '/.pyenv/versions/neovim2/bin/python'
  4. let g:python3_host_prog= expand('$HOME') . '/.pyenv/versions/neovim3/bin/python'
  5. "{{{ ***** PLUGINS INSTALLATION ***** "
  6. " ##### vim-plug #####
  7. set nocompatible
  8. call plug#begin('~/.vim/bundle')
  9. " ***** plugins we only want in true vim.
  10. if !exists("g:gui_oni")
  11. " As-you-type semantic completion.
  12. " Plug 'Valloric/YouCompleteMe', { 'on': ['YcmCompleter', 'YcmDiags', 'YcmForceCompileAndDiagnostics'], 'do': './install.py'}
  13. Plug 'Valloric/YouCompleteMe', { 'do': 'python3 ./install.py --go-completer'}
  14. autocmd! User YouCompleteMe if !has('vim_starting') | call youcompleteme#Enable() | endif
  15. " Matching things in insert mode
  16. Plug 'Raimondi/delimitMate'
  17. " Make vim priiiiity
  18. Plug 'bling/vim-airline'
  19. Plug 'vim-airline/vim-airline-themes'
  20. else
  21. Plug 'BurningEther/nvimux'
  22. endif
  23. " Linting.. may conflict with YCM
  24. " Plug 'w0rp/ale'
  25. " ***** simple plugins
  26. " can launch an interactive program within an Vim buffer (like bash or other shells)
  27. " Plug 'oplatek/Conque-Shell', { 'on': ['ConqueTerm', 'ConqueTermSplit', 'ConqueTermVSplit']}
  28. " easy buffer management. Replaced by Unite
  29. "Plugin 'jlanzarotta/bufexplorer'
  30. " supposedly make '%' more powerful
  31. Plug 'tmhedberg/matchit'
  32. " Comments
  33. " Way more lightweight comment plugin
  34. Plug 'tpope/vim-commentary'
  35. " Comment text objects (depends on the following
  36. Plug 'glts/vim-textobj-comment'
  37. " define you're own text objects!!
  38. Plug 'kana/vim-textobj-user'
  39. " Shows file browser. (replaces netrw and :Explore)
  40. Plug 'scrooloose/nerdtree', { 'on': ['NERDTreeToggle', 'NERDTreeFind']}
  41. " show tabs up on top prettily
  42. Plug 'mkitt/tabline.vim'
  43. " shows an outline of all Tags in a file
  44. Plug 'majutsushi/tagbar'
  45. " Snippet completion
  46. Plug 'SirVer/ultisnips' ", { 'on': []}
  47. " Asynchonous building and launching of programs
  48. Plug 'tpope/vim-dispatch'
  49. Plug '5long/pytest-vim-compiler'
  50. " Makes motions way better. lets you jump anywhere on the screen
  51. " Run tests
  52. Plug 'janko-m/vim-test'
  53. " Plug 'Lokaltog/vim-easymotion'
  54. Plug 'justinmk/vim-sneak'
  55. " Allows multiple cursors at once. very useful
  56. Plug 'wreed4/vim-multiple-cursors'
  57. " Dependency for vim-snippets
  58. Plug 'tomtom/tlib_vim'
  59. " A library of snippets that work with Utilsnip
  60. Plug 'honza/vim-snippets'
  61. " ability to surround text objects with things like quotes or parens
  62. Plug 'tpope/vim-surround'
  63. " Amazing plugin that makes a lot of things obsolete...
  64. Plug 'Shougo/unite.vim'
  65. Plug 'Shougo/denite.nvim'
  66. Plug 'Shougo/neomru.vim'
  67. Plug 'Shougo/neoyank.vim'
  68. " Plug 'Shougo/unite-outline'
  69. " Make Tmux pretty
  70. Plug 'edkolev/tmuxline.vim'
  71. " switch between header files easily
  72. Plug 'vim-scripts/a.vim'
  73. " pretty JSON stuff
  74. Plug 'elzr/vim-json'
  75. " Diff directories quickly and powerfully
  76. Plug 'will133/vim-dirdiff'
  77. " Enable nested vimrc files
  78. " Plug 'wreed4/vim-lvimrc'
  79. " Gives a graphical view of vim's undo tree (replaced by neovim-compatible
  80. " fork)
  81. "Plugin 'sjl/gundo.vim'
  82. Plug 'simnalamburt/vim-mundo'
  83. " Plug 'mbbill/undotree'
  84. " Git integration
  85. Plug 'tpope/vim-fugitive'
  86. Plug 'tpope/vim-rhubarb'
  87. " Easy alignment
  88. Plug 'junegunn/vim-easy-align'
  89. " Semantic highlighting
  90. " Plug 'jaxbot/semantic-highlight.vim'
  91. " Additional highlighting for cpp
  92. Plug 'octol/vim-cpp-enhanced-highlight'
  93. " Fancy start screen
  94. Plug 'mhinz/vim-startify'
  95. " Better text objects
  96. Plug 'wellle/targets.vim'
  97. " Diff individual sections of code
  98. Plug 'AndrewRadev/linediff.vim'
  99. " Pull in code from the internet
  100. " Plug 'kasandell/Code-Pull'
  101. " Heuristically set indent settings
  102. Plug 'tpope/vim-sleuth'
  103. " Show differences with style
  104. Plug 'mhinz/vim-signify'
  105. " Write outlines in vim
  106. Plug 'vimoutliner/vimoutliner'
  107. " Better diffs (optionaly)
  108. Plug 'chrisbra/vim-diff-enhanced'
  109. " command line fuzzy finder
  110. Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
  111. Plug 'junegunn/fzf.vim'
  112. " Startup time analyzer
  113. Plug 'tweekmonster/startuptime.vim'
  114. " Automatically change numbering modes (very small, could be a code snippet in vimrc
  115. " Plug 'jeffkreeftmeijer/vim-numbertoggle'
  116. " coding in GO
  117. Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
  118. " Better ways to deal with extra whitespace
  119. Plug 'ntpeters/vim-better-whitespace'
  120. "Interactive Code Scratchpad
  121. Plug 'metakirby5/codi.vim'
  122. " Code refactoring
  123. Plug 'apalmer1377/factorus'
  124. "SYNTAX Files
  125. " Plug 'linkinpark342/xonsh-vim'
  126. Plug 'stephpy/vim-yaml'
  127. Plug 'solarnz/thrift.vim'
  128. Plug 'martinda/Jenkinsfile-vim-syntax'
  129. "COLORSCHEMES
  130. " about 3 billion colorschemes
  131. " Plug 'flazz/vim-colorschemes'
  132. " Plug 'altercation/vim-colors-solarized'
  133. " Plug 'morhetz/gruvbox'
  134. " Plug 'NLKNguyen/papercolor-theme'
  135. " Plug 'freeo/vim-kalisi'
  136. " Plug 'sickill/vim-monokai'
  137. Plug 'chriskempson/base16-vim'
  138. " Plug 'chriskempson/vim-tomorrow-theme'
  139. Plug 'nightsense/vim-crunchbang'
  140. Plug 'gkjgh/cobalt'
  141. Plug 'exitface/synthwave.vim'
  142. " Plug 'jnurmine/Zenburn'
  143. "
  144. " Plugin to quickly switch color schemes
  145. Plug 'xolox/vim-misc', { 'on': [ 'NextColorScheme', 'PrevColorScheme', 'RandomColorScheme' ] }
  146. Plug 'xolox/vim-colorscheme-switcher', { 'on': [ 'NextColorScheme', 'PrevColorScheme', 'RandomColorScheme' ] }
  147. "Machine-specific plugins
  148. Plug 'gisraptor/vim-lilypond-integrator', {'frozen': 1, 'for': ['lilypond']}
  149. " end installed plugins
  150. call plug#end()
  151. " augroup load_us_ycm
  152. " autocmd!
  153. " autocmd! InsertEnter * call plug#load('ultisnips', 'YouCompleteMe')
  154. " \| call youcompleteme#Enable() | autocmd! load_us_ycm
  155. " augroup END
  156. " #####Pathogen#####
  157. " call pathogen#infect()
  158. " call pathogen#helptags()
  159. " }}}
  160. "{{{ ***** PLUGIN SETTINGS ***** "
  161. " {{{##### PyMode #####
  162. "let pymode_lint_ignore="E501,E401,E225,W191,W391,W404"
  163. " use rope code assist instead of a complete function
  164. " au FileType python inoremap <expr> <S-Space> '<C-r>=RopeCodeAssistInsertMode()<CR><C-r>=pumvisible() ? "\<lt>C-p>\<lt>Down>" : ""<CR>'
  165. " }}}
  166. " {{{##### Tlist #####
  167. " Toggle tag list
  168. "nnoremap <C-T> :TlistToggle<CR>
  169. "}}}
  170. " {{{##### EasyMotion #####
  171. " nmap <Leader><Leader>s <Plug>(easymotion-sn)
  172. " }}}
  173. " {{{##### Vim-Sneak #####
  174. let g:sneak#label = 1
  175. nmap s <Plug>Sneak_s
  176. xmap s <Plug>Sneak_s
  177. omap s <Plug>Sneak_s
  178. nmap S <Plug>Sneak_S
  179. xmap S <Plug>Sneak_S
  180. omap S <Plug>Sneak_S
  181. " 1-character enhanced 'f'
  182. nmap f <Plug>Sneak_f
  183. nmap F <Plug>Sneak_F
  184. xmap f <Plug>Sneak_f
  185. xmap F <Plug>Sneak_F
  186. omap f <Plug>Sneak_f
  187. omap F <Plug>Sneak_F
  188. " 1-character enhanced 't'
  189. nmap t <Plug>Sneak_t
  190. nmap T <Plug>Sneak_T
  191. xmap t <Plug>Sneak_t
  192. xmap T <Plug>Sneak_T
  193. omap t <Plug>Sneak_t
  194. omap T <Plug>Sneak_T
  195. " this seems weird, but it's to maintain motor memory with EasyMotion
  196. nmap <Leader>w <Plug>(SneakStreak)
  197. nmap <Leader>W <Plug>(SneakStreakBackward)
  198. "}}}
  199. " {{{##### Tagbar #####
  200. let g:tagbar_autofocus = 1
  201. let g:tagbar_left = 1
  202. let g:tagbar_zoomwidth = 0
  203. let g:tagbar_show_linenumbers = -1
  204. let g:tagbar_foldlevel = 0
  205. let g:tagbar_autoshowtag = 1
  206. let g:tagbar_sort = 0
  207. " open Tagbar automatically when viewing a supported file/files
  208. "autocmd VimEnter * nested :call tagbar#autoopen(1)
  209. " open Tagbar automatically when entering a buffer of supported file/files
  210. "autocmd BufEnter * nested :call tagbar#autoopen(0)
  211. " Toggle Tagbar
  212. nnoremap <leader>tt :TagbarToggle<CR>
  213. "}}}
  214. " {{{##### Airline #####
  215. let g:airline_powerline_fonts=1
  216. " only if YCM is enabled
  217. " autocmd User YouCompleteMe let g:airline#extensions#ycm#enabled = 1 | AirlineRefresh
  218. let g:airline#extensions#tabline#enabled = 1
  219. let g:airline#extentions#tabline#show_splits = 1
  220. let g:airline#extensions#tabline#show_tab_nr = 1
  221. let g:airline#extensions#tabline#tab_nr_type = 2
  222. let g:airline#extensions#tabline#show_close_button =1
  223. let g:airline#extensions#ycm#enabled = 1
  224. let g:airline#extensions#tagbar#flags = 'f'
  225. let g:airline#extensions#tagbar#enabled = 1
  226. let g:airline#extensions#whitespace#enabled = 1
  227. let g:airline#extensions#tmuxline#enabled = 1
  228. let g:airline#extensions#tabline#buffer_idx_mode = 1
  229. nmap <silent> <leader>1 <Plug>AirlineSelectTab1
  230. nmap <silent> <leader>2 <Plug>AirlineSelectTab2
  231. nmap <silent> <leader>3 <Plug>AirlineSelectTab3
  232. nmap <silent> <leader>4 <Plug>AirlineSelectTab4
  233. nmap <silent> <leader>5 <Plug>AirlineSelectTab5
  234. nmap <silent> <leader>6 <Plug>AirlineSelectTab6
  235. nmap <silent> <leader>7 <Plug>AirlineSelectTab7
  236. nmap <silent> <leader>8 <Plug>AirlineSelectTab8
  237. nmap <silent> <leader>9 <Plug>AirlineSelectTab9
  238. " }}}
  239. " {{{##### NERDTree #####
  240. let g:NERDTreeHijackNetrw = 1
  241. let g:NERDTreeDirArrows = 1
  242. let g:NERDTreeWinPos = "right"
  243. let g:NERDTreeMouseMode = 2
  244. let g:NERDTreeShowLineNumbers = 1
  245. let g:NERDTreeIgnore=['\~$', '\.vim$', '\.d$', '\.sw.$']
  246. nnoremap <leader>nt :NERDTreeToggle<CR>
  247. nnoremap <leader>nf :NERDTreeFind<CR>
  248. " }}}
  249. " {{{##### UltiSnips #####
  250. let g:UltiSnipsEditSplit = "vertical"
  251. let g:UltiSnipsExpandTrigger = "<C-Space>"
  252. let g:UltiSnipsJumpForwardTrigger="<TAB>"
  253. let g:UltiSnipsJumpBackwardTrigger="<S-TAB>"
  254. let g:UltiSnipsSnippetsDir="~/.vim/UltiSnips"
  255. " }}}
  256. " {{{##### YouCompleteMe #####
  257. " Do not open preview window when completing
  258. " set completeopt=menuone
  259. " let g:ycm_add_preview_to_completeopt = 0
  260. " Auto Close preview window
  261. let g:ycm_autoclose_preview_window_after_insertion = 1
  262. " Disable Tab for cycling through commands so that UtilSnips will still work
  263. let g:ycm_key_list_select_completion=['<Down>']
  264. let g:ycm_key_list_previous_completion=['<Up>']
  265. let g:ycm_collect_identifiers_from_tags_files=0
  266. let g:ycm_collect_identifiers_from_comments_and_strings = 0
  267. let g:ycm_complete_in_comments = 1
  268. let g:ycm_key_invoke_completion = '<C-N>'
  269. "let g:ycm_extra_conf_globlist = ['~/.ycm_extra_conf.py']
  270. let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
  271. let g:ycm_use_ultisnips_completer = 1
  272. let g:ycm_filetype_blacklist = {
  273. \ 'tagbar' : 1,
  274. \ 'nerdtree': 1,
  275. \ 'qf' : 1,
  276. \ 'notes' : 1,
  277. \ 'unite' : 1,
  278. \ 'vimwiki' : 1,
  279. \ 'pandoc' : 1,
  280. \ 'infolog' : 1,
  281. \ 'mail' : 1
  282. \}
  283. " Python3 completion by default
  284. " let g:ycm_python_binary_path = system('readlink -f ' . system('which python3'))
  285. let g:ycm_python_binary_path = 'python3'
  286. let g:ycm_server_keep_logfile=1
  287. " Mappings
  288. nnoremap <leader>] :YcmCompleter GoTo<CR>
  289. nnoremap <leader>[ :YcmCompleter GoToReferences<CR>
  290. nnoremap <leader>gt :YcmCompleter GetType<CR>
  291. nnoremap <leader>gp :YcmCompleter GetParent<CR>
  292. nnoremap <leader>gd :YcmCompleter GetDoc<CR>
  293. nnoremap <leader>= :YcmCompleter FixIt<CR>
  294. nnoremap <silent> <F1> :YcmDiags<CR>
  295. nnoremap <silent> <leader><F1> :YcmForceCompileAndDiagnostics<CR>
  296. " }}}
  297. " {{{##### Multiple Cursors #####
  298. let g:multi_cursor_exit_from_insert_mode = 0
  299. " }}}
  300. " {{{##### Unite #####
  301. "let g:unite_source_history_yank_enable = 1
  302. "call unite#filters#matcher_default#use(['matcher_fuzzy'])
  303. ""nnoremap <leader>t :<C-u>Unite -buffer-name=files -start-insert file_rec/async:!<CR>
  304. "nnoremap <leader>e :<C-u>Unite -buffer-name=files -toggle file<CR>
  305. "nnoremap <leader>r :<C-u>Unite -buffer-name=mru -start-insert file_mru<CR>
  306. "nnoremap <leader>y :<C-u>Unite -buffer-name=yank history/yank<CR>
  307. "nnoremap <leader>j :<C-u>Unite -buffer-name=jump jump<CR>
  308. "nnoremap <leader>be :<C-u>Unite -buffer-name=buffer buffer<CR>
  309. "nnoremap <leader>/ :<C-u>Unite -keep-focus -no-quit -buffer-name=search -start-insert line:all<CR>
  310. "nnoremap <leader>vg :<C-u>Unite -buffer-name=vimgrep vimgrep<CR>
  311. ""
  312. "nnoremap <leader>t :<C-u>Unite -buffer-name=outline -no-split -start-insert outline<CR>
  313. " }}}
  314. " {{{##### Denite #####
  315. " nnoremap <leader>e :Denite file<CR>
  316. " nnoremap <leader>r :Denite file_rec<CR>
  317. " nnoremap <leader>be :Denite -buffer-name=buffer buffer<CR>
  318. " nnoremap <leader>/ :Denite -no-quit -buffer-name=search line:all<CR>
  319. nnoremap <leader>t :Denite outline<CR>
  320. " nnoremap <leader>vg :Denite grep<CR>
  321. " nnoremap <leader>j :Denite jump<CR>
  322. " }}}
  323. " {{{ ##### FZF #####
  324. command! -nargs=* -complete=dir Cd call fzf#run(fzf#wrap(
  325. \ {'source': 'find '.(empty([<f-args>]) ? '.' : expand(<f-args>)).' -type d',
  326. \ 'sink': 'cd'}))
  327. nnoremap <leader>cd :Cd ~<CR>
  328. nnoremap <leader><leader>cd :Cd
  329. nnoremap <leader>e :Files<CR>
  330. nnoremap <leader><leader>e :Files ~<CR>
  331. nnoremap <leader>be :Buffers<CR>
  332. nnoremap <leader>/ :BLines<CR>
  333. nnoremap <leader>gst :GFiles!?<CR>
  334. " }}}
  335. " {{{##### JSON.vim #####
  336. augroup json_autocmd
  337. autocmd!
  338. autocmd FileType json set autoindent
  339. autocmd FileType json set formatoptions=tcq2l
  340. " autocmd FileType json set textwidth=78 shiftwidth=2
  341. " autocmd FileType json set softtabstop=2 tabstop=8
  342. " autocmd FileType json set expandtab
  343. autocmd FileType json set foldmethod=indent
  344. augroup END
  345. " }}}
  346. " {{{##### DirDiff #####
  347. let g:DirDiffExcludes = ".*.*.swp,*.d"
  348. " }}}
  349. " {{{##### Mundo #####
  350. nnoremap <leader>u :MundoToggle<CR>
  351. let g:mundo_playback_delay = 300
  352. let g:mundo_preview_bottom = 1
  353. " }}}
  354. " {{{##### UndoTree #####
  355. " nnoremap <leader>u :UndotreeToggle<CR>
  356. " let g:undotree_WindowLayout = 2
  357. " let g:undotree_SetFocusWhenToggle = 1
  358. " }}}
  359. " {{{##### EasyAlign #####
  360. vmap <Enter> <Plug>(LiveEasyAlign)
  361. " }}}
  362. " {{{##### DelimitMate #####
  363. let delimitMate_expand_space = 1
  364. let delimitMate_expand_cr = 1
  365. imap <c-l> <Plug>delimitMateS-Tab
  366. " }}}
  367. " {{{##### Semantic-Highlight.vim #####
  368. let g:semanticBlacklistOverride = {
  369. \'cpp': [
  370. \ 'auto', 'const', 'double', 'float', 'int', 'short',
  371. \ 'struct', 'unsigned', 'break', 'continue', 'else', 'for',
  372. \ 'long', 'signed', 'switch', 'void', 'case', 'default',
  373. \ 'enum', 'goto', 'register', 'sizeof', 'typedef', 'volatile',
  374. \ 'char', 'do', 'extern', 'if', 'return', 'static',
  375. \ 'union', 'while', 'asm', 'dynamic_cast', 'namespace', 'reinterpret_cast',
  376. \ 'try', 'bool', 'explicit', 'new', 'static_cast', 'typeid',
  377. \ 'catch', 'false', 'operator', 'template', 'typename', 'class',
  378. \ 'friend', 'private', 'this', 'using', 'const_cast', 'inline',
  379. \ 'public', 'throw', 'virtual', 'delete', 'mutable', 'protected',
  380. \ 'true', 'wchar_t', 'assert'
  381. \ ]
  382. \ }
  383. " }}}
  384. " {{{##### vim-cpp-enhanced-highlight #####
  385. let g:cpp_class_scope_highlight=0
  386. let g:cpp_experimental_template_highlight = 0
  387. " }}}
  388. " {{{##### Startify #####
  389. let g:startify_lists = [
  390. \ { 'type': 'dir', 'header': [ 'MRU '. getcwd()] },
  391. \ { 'type': 'files', 'header': [ 'MRU'] },
  392. \ { 'type': 'sessions', 'header': [ 'Sessions'] },
  393. \ { 'type': 'bookmarks', 'header': [ 'Bookmarks'] },
  394. \ { 'type': 'commands', 'header': [ 'Commands'] },
  395. \ ]
  396. " let g:startify_bookmarks = [ {'v': '~/.vim/vimrc'} ]
  397. let g:startify_commands = [
  398. \ {'rc': 'EditVimrc'},
  399. \ {'crc': 'EditCustomVimrc'},
  400. \ {'p': 'PlugUpdate'}]
  401. let g:startify_session_delete_buffers = 1
  402. if has('nvim')
  403. let g:startify_custom_header =
  404. \ map(split(system('toilet Nvim -t -W -F border'), '\n'), '" ". v:val') + ['','']
  405. " \ map(split(system('cowsay -f dragon Welcome to VIM | sed "s/ *$//"'), '\n'), '" ". v:val') + ['','']
  406. " \ map(split(system('fortune | cowsay'), '\n'), '" ". v:val') + ['','']
  407. else
  408. let g:startify_custom_header =
  409. \ map(split(system('toilet Vim -t -W -F border'), '\n'), '" ". v:val') + ['','']
  410. endif
  411. " }}}
  412. " {{{##### Signify #####
  413. let g:signify_vcs_list = ['git']
  414. omap ih <plug>(signify-motion-inner-pending)
  415. xmap ih <plug>(signify-motion-inner-visual)
  416. omap ah <plug>(signify-motion-outer-pending)
  417. xmap ah <plug>(signify-motion-outer-visual)
  418. " }}}
  419. " {{{ ##### vim-colorscheme switcher #####
  420. let g:colorscheme_switcher_define_mappings = 0
  421. let g:colorscheme_switcher_exclude = []
  422. nnoremap <silent> <F9> :NextColorScheme<CR>
  423. nnoremap <silent> <S-F9> :PrevColorScheme<CR>
  424. nnoremap <silent> <leader><F9> :RandomColorScheme<CR>
  425. " }}}
  426. " {{{ ##### vim-codi #####
  427. let g:codi#interpreters = {
  428. \ 'python': {
  429. \ 'prompt': '^(ins)\(>>>\|\.\.\.\) '
  430. \ },
  431. \}
  432. let codi#log='/home/william/log/codi.log'
  433. " let codi#autocmd = 'None'
  434. " }}}
  435. " {{{ ##### nvimux #####
  436. if exists("g:gui_oni")
  437. lua << EOF
  438. local nvimux = require('nvimux')
  439. -- Nvimux configuration
  440. nvimux.config.set_all{
  441. prefix = '<C-a>',
  442. new_window = 'term', -- Use 'term' if you want to open a new term for every new window
  443. new_tab = nil, -- Defaults to new_window. Set to 'term' if you want a new term for every new tab
  444. new_window_buffer = 'single',
  445. quickterm_direction = 'botright',
  446. quickterm_orientation = 'vertical',
  447. quickterm_scope = 't', -- Use 'g' for global quickterm
  448. quickterm_size = '80',
  449. }
  450. -- Nvimux custom bindings
  451. nvimux.bindings.bind_all{
  452. {'-', ':NvimuxHorizontalSplit', {'n', 'v', 'i', 't'}},
  453. {'\\|', ':NvimuxVerticalSplit', {'n', 'v', 'i', 't'}},
  454. {'<c-l>', ':tabnext', {'n', 'v', 'i', 't'}},
  455. {'<c-h>', ':tabprevious', {'n', 'v', 'i', 't'}},
  456. }
  457. -- Required so nvimux sets the mappings correctly
  458. nvimux.bootstrap()
  459. EOF
  460. endif
  461. " }}}
  462. " }}}
  463. "{{{ ***** VIM FEATURES ***** "
  464. " allow project-specific .vimrc files
  465. if has('nvim')
  466. set shada+=f10
  467. endif
  468. set exrc
  469. set secure
  470. " allow the use of a modeline
  471. set modeline
  472. " automatically read a file if it changes outside of vim
  473. set autoread
  474. " hide buffers by default instead of unloading them
  475. set hidden
  476. " turn ruler on
  477. set ruler
  478. " set incremental search
  479. set hlsearch
  480. set incsearch
  481. if has('nvim')
  482. set inccommand=split
  483. endif
  484. " set status line always on
  485. if exists("g:gui_oni")
  486. set noshowmode
  487. set noruler
  488. set laststatus=0
  489. set noshowcmd
  490. else
  491. set laststatus=2
  492. endif
  493. " turn vim's mode printing off. Airline takes care of this
  494. set noshowmode
  495. " shorten the pause after leaving insert mode
  496. set ttimeoutlen=50
  497. " set mouse always on. I like the mouse sometimes
  498. set mouse=a
  499. " 256 stuff
  500. " disable BackgroundColorErase (BCE) inside of 256-color tmux sessions
  501. if &term =~ '256color'
  502. set t_ut=
  503. endif
  504. " OR... do this shit instead
  505. if &term =~ '^screen'
  506. " tmux will send xterm-style keys when xterm-keys is on
  507. execute "set <xUp>=\e[1;*A"
  508. execute "set <xDown>=\e[1;*B"
  509. execute "set <xRight>=\e[1;*C"
  510. execute "set <xLeft>=\e[1;*D"
  511. endif
  512. " set utf8
  513. if !has('nvim')
  514. " set encoding=utf-8
  515. endif
  516. " set fileencoding=utf-8
  517. " New Splits default to right, or below
  518. set splitbelow
  519. set splitright
  520. set diffopt+=vertical
  521. "turn omnicomplete on
  522. set omnifunc=syntaxcomplete#Complete
  523. " enable persistant undo history
  524. set undofile
  525. set undodir=~/.vim/undodir
  526. " format options
  527. " set expandtab
  528. " set shiftwidth=4
  529. " set softtabstop=4
  530. set autoindent
  531. set nosmartindent
  532. set cindent
  533. set cino=l1,t0,(0
  534. set breakindent
  535. set showbreak=↳
  536. set breakindentopt=min:20
  537. " TOhtml settings
  538. let g:html_ignore_conceal=1
  539. let g:html_dynamic_folds=1
  540. " folding options
  541. set foldlevelstart=99
  542. set foldmethod=syntax
  543. augroup folding_settings
  544. autocmd FileType python,xonsh,yaml,thrift set foldmethod=indent
  545. augroup END
  546. " set filetype options
  547. au BufNewFile,BufRead *.xsh set filetype=python
  548. au BufNewFile,BufRead Dockerfile* set filetype=dockerfile
  549. set wildmode=longest:full
  550. " switch ' and `
  551. noremap ' `
  552. noremap ` '
  553. noremap Y y$
  554. noremap <leader>y "*y
  555. noremap <leader>p "*p
  556. " In nvim, open keyword/help in new terminal,
  557. " as nvim doesn't currently allow terminal scrollback.
  558. function! KeywordNvim(searchTerm)
  559. if &keywordprg == ':Man'
  560. exe ':Man ' . a:searchTerm
  561. else
  562. let l:man = &keywordprg
  563. vsplit | enew
  564. exe 'terminal ' . l:man a:searchTerm
  565. normal i
  566. endif
  567. endfunction
  568. function! KeywordNvimVisual()
  569. let l:saved_reg = @"
  570. execute "normal! vgvy"
  571. call KeywordNvim(@")
  572. let @" = l:saved_reg
  573. endfunction
  574. if has("nvim")
  575. nnoremap K :call KeywordNvim(expand("<cword>"))<CR>
  576. vnoremap K <Esc>:call KeywordNvimVisual()<CR>
  577. endif
  578. let g:clipboard = {
  579. \ 'name': 'My xsel',
  580. \ 'copy': {
  581. \ '+': 'xsel -i',
  582. \ '*': 'xsel -ib',
  583. \ },
  584. \ 'paste': {
  585. \ '+': 'xsel -i',
  586. \ '*': 'xsel -ib',
  587. \ },
  588. \ 'cache_enabled': 1,
  589. \ }
  590. " }}}
  591. "{{{ ***** VISUALS ***** "
  592. set number
  593. set relativenumber
  594. augroup numbertoggle
  595. autocmd!
  596. autocmd BufEnter,FocusGained,InsertLeave,WinEnter,CmdlineLeave * if &nu | set rnu | endif
  597. autocmd BufLeave,FocusLost,InsertEnter,WinLeave,CmdlineEnter * if &nu | set nornu | redraw | endif
  598. augroup END
  599. syntax on
  600. autocmd BufWinEnter * if line2byte(line("$") + 1) > 10000000 | syntax clear | endif
  601. if !exists("g:gui_oni")
  602. if has('nvim')
  603. set termguicolors
  604. " colorscheme base16-ocean
  605. colorscheme base16-eighties
  606. " colorscheme base16-solarized-dark
  607. else
  608. colorscheme cobalt
  609. endif
  610. endif
  611. " Solarized settings
  612. " let g:solarized_termcolors=256
  613. "set background=light
  614. " set background=dark
  615. " colorscheme solarized
  616. " seoul256 settings
  617. " let g:seoul256_background = 235
  618. " colorscheme seoul256
  619. " let g:airline_theme="tomorrow"
  620. " Gruvbox settings
  621. " let g:gruvbox_italic=0
  622. " set background=dark
  623. " set background=light
  624. " colorscheme gruvbox
  625. " Paper-color settings
  626. " colorscheme PaperColor
  627. " set background=dark
  628. " colorscheme monokai
  629. " colorscheme bubblegum
  630. " set background=dark
  631. " colorscheme kalisi
  632. " set background=dark
  633. " colorscheme wombat256
  634. " colorscheme zenburn
  635. " colorscheme kolor
  636. " colorscheme jellybeans
  637. " colorscheme hybrid
  638. " colorscheme devbox-dark-256
  639. " colorscheme Tomorrow-Night-Eighties
  640. " colorscheme Tomorrow-Night
  641. "colorscheme carvedwoodcool
  642. " if has('nvim')
  643. " colorscheme crunchbang
  644. " set termguicolors
  645. " else
  646. " colorscheme cobalt
  647. " endif
  648. " let g:airline_theme="synthwave"
  649. " colorscheme cobalt
  650. " Synthwave
  651. " set background=dark
  652. " colorscheme synthwave
  653. " if has('termguicolors')
  654. " set termguicolors " 24-bit terminal
  655. " else
  656. " let g:synthwave_termcolors=256 " 256 color mode
  657. " endif
  658. set showcmd
  659. "}}}
  660. "{{{ ***** KEY MAPPINGS ***** "
  661. " make <C-A> work the same in tmux and not
  662. nnoremap <C-C> <C-A>
  663. " easier buffer navigation
  664. " nnoremap bn :bn<CR>
  665. " nnoremap bp :bp<CR>
  666. " make backspace work
  667. set backspace=eol,start,indent
  668. set whichwrap+=<,>,h,l
  669. set whichwrap+=<,>,h,l
  670. " nnoremap <silent> <F5> :so ~/.vim/vimrc<CR>:LvimrcReload<CR>
  671. nnoremap <silent> <F5> :so ~/.vim/vimrc<CR>
  672. nnoremap <silent> <F6> :redraw!<CR>
  673. set pastetoggle=<F7>
  674. nmap <F8> :mks!<CR>
  675. " treat wrapped lines as multiple lines when navigating
  676. map j gj
  677. map k gk
  678. " Scroll the window more intuitively
  679. nnoremap <M-j> <C-e>
  680. nnoremap <M-k> <C-y>
  681. nnoremap <M-h> 10zh
  682. nnoremap <M-l> 10zl
  683. nnoremap j <C-e>
  684. nnoremap k <C-y>
  685. nnoremap h 10zh
  686. nnoremap l 10zl
  687. vnoremap <M-j> <C-e>
  688. vnoremap <M-k> <C-y>
  689. vnoremap <M-h> 10zh
  690. vnoremap <M-l> 10zl
  691. vnoremap j <C-e>
  692. vnoremap k <C-y>
  693. vnoremap h 10zh
  694. vnoremap l 10zl
  695. " Open a new line and exit insert mode, staying on the same line
  696. nnoremap <leader>o o<ESC>
  697. nnoremap <leader>O O<ESC>
  698. " Clean a line and exit insert mode
  699. nnoremap <leader>c cc<ESC>
  700. " Exit insert mode and put ';' at the end of the line
  701. inoremap ;<Esc> <Esc>A;<Esc>
  702. " Open tag in new tab
  703. nnoremap <M-]> <C-W><C-]><C-W>T
  704. " Toggle TODOs as done or not
  705. nnoremap <silent> <leader>x :s/\[ \]TODO/[X]TODO/<CR>:nohl<CR>
  706. nnoremap <silent> <leader><space> :s/\[X\]TODO/[ ]TODO/<CR>:nohl<CR>
  707. " copy 'filename:linenumber' to @f register. useful for adding links to
  708. " places in files in comments
  709. nnoremap <silent> <leader>gf :let @f=@% . ':' . line('.')<CR>:echo @f<CR>
  710. " WINDOW ORGANISATION
  711. " Smart way to move between windows
  712. map <C-j> <C-W>j
  713. map <C-k> <C-W>k
  714. map <C-h> <C-W>h
  715. map <C-l> <C-W>l
  716. map <C-Up> <C-W>k
  717. map <C-Down> <C-W>j
  718. map <C-Left> <C-W>h
  719. map <C-Right> <C-W>l
  720. " easy resize windows
  721. nnoremap <S-Up> <C-W>+
  722. nnoremap <S-Down> <C-W>-
  723. nnoremap <S-Left> 3<C-W><
  724. nnoremap <S-Right> 3<C-W>>
  725. " easy move windows
  726. nnoremap <C-S-Up> <C-W><S-K>
  727. nnoremap <C-S-Down> <C-W><S-J>
  728. nnoremap <C-S-Left> <C-W><S-H>
  729. nnoremap <C-S-Right> <C-W><S-L>
  730. " close annoying windows easily
  731. nnoremap cq :cclose<CR>
  732. nnoremap cqq :lclose<CR>
  733. nnoremap cp :pclose<CR>
  734. " Call CopyMode
  735. vnoremap <C-c> :call CopyMode()<CR><CR>
  736. " Visual mode pressing * or # searches for the current selection
  737. " Super useful! From an idea by Michael Naumann
  738. vnoremap <silent> * :call VisualSelection('f')<CR>
  739. vnoremap <silent> # :call VisualSelection('b')<CR>
  740. " Default building/running options
  741. let g:run_command = 'echo No run command defined'
  742. nnoremap <leader>` :execute "Start " . g:run_command<CR>
  743. nnoremap <F3> :Make %<CR>
  744. autocmd FileType lilypond setlocal makeprg=lilypond
  745. augroup python_build
  746. autocmd FileType python compiler pylint
  747. autocmd FileType python nnoremap <F3> :Make %<CR>
  748. autocmd FileType python nnoremap <S-F3> :Make .<CR>
  749. autocmd FileType python nnoremap <F4> :Dispatch mypy %<CR>
  750. autocmd FileType python nnoremap <S-F4> :Dispatch mypy .<CR>
  751. augroup END
  752. " Quickly edit a macro
  753. nnoremap <leader>@ :<c-u><c-r><c-r>='let @'. v:register .' = '. string(getreg(v:register))<cr><c-f><left>
  754. " Quickly edit the Q macro
  755. nnoremap <leader>q :<c-u><c-r><c-r>='let @q = '. string(getreg('q'))<cr><c-f><left>
  756. " go back and delete last buffer (dangerous if the going back doesn't bring
  757. " you to another buffer
  758. nnoremap <M-C-O> <C-o>:bd! #<CR>
  759. " toggle number
  760. nnoremap <silent> -- :set number!<CR>
  761. " toggle cursorcolumn
  762. nnoremap <silent> scc :set cursorcolumn!<CR>
  763. " insert command at line
  764. inoremap <C-r>! <C-\><C-O>:let @r=system("")<left><left>
  765. " terminal escape
  766. " tnoremap <Esc><Esc> <C-\><C-N>
  767. " }}}
  768. "{{{ ***** COMMANDS ***** "
  769. " Terminal commands
  770. command! -nargs=0 VTerm vsplit term://bash
  771. command! -nargs=0 STerm split term://bash
  772. command! -nargs=0 VPyTerm vsplit term://python3
  773. command! -nargs=0 SPyTerm split term://python3
  774. " make todo list
  775. command! -nargs=* -complete=file Todos execute "Unite -keep-focus -auto-resize -no-quit -buffer-name=Todos vimgrep:*:TODO(" . expand("$USER") . ")"
  776. "Wrapper for make sequence
  777. "replaced by vim-dispatch plugin
  778. command! -nargs=* MyMake execute '!clear' | make! <args> | cw
  779. " Edit ~/.vim/vimrc in a new tab
  780. command! -nargs=0 EditVimrc tabedit ~/.vim/vimrc
  781. " Swap two lines
  782. command! -nargs=1 -range Swap call Swap(<f-args>)
  783. function! Swap(s1, s2, d1, d2)
  784. let cursor = line(".")
  785. echo "swap <" . a:s1 . "," . a:s2 . "> and <" . a:d1 . "," . a:d2 . ">"
  786. if a:s1 <= a:d1
  787. let l:source1 = a:s1
  788. let l:source2 = a:s2
  789. let l:dest1 = a:d1
  790. let l:dest2 = a:d2
  791. else
  792. let l:dest1 = a:s1
  793. let l:dest2 = a:s2
  794. let l:source1 = a:d1
  795. let l:source2 = a:d2
  796. endif
  797. let l:offset = l:source2 - l:source1
  798. execute l:source1 .",". lsource2 . "move " . l:dest2
  799. execute l:dest1 . "," . l:dest2 . "move " . l:source2
  800. execute l:source1 . ",". l:source2 . "normal =="
  801. execute l:dest1 . ",". l:dest2 . "normal =="
  802. execute "normal " . cursor . "G"
  803. endfunction
  804. function! CopyMode() range
  805. execute a:firstline . "," . a:lastline . "yank c"
  806. tabnew
  807. setlocal nonumber
  808. setlocal norelativenumber
  809. setlocal showbreak=
  810. map <buffer> <silent> <C-V> :bd!<CR>
  811. normal [p
  812. endfunction
  813. " Diff original file (from help)
  814. command! DiffOrig vert new | set bt=nofile | r ++edit # | 0d_
  815. \ | diffthis | wincmd p | diffthis
  816. " from https://amix.dk/vim/vimrc.html
  817. function! VisualSelection(direction) range
  818. let l:saved_reg = @"
  819. execute "normal! vgvy"
  820. let l:pattern = escape(@", '\\/.*$^~[]')
  821. let l:pattern = substitute(l:pattern, "\n", "", "")
  822. let l:pattern = '\<'.l:pattern.'\>'
  823. if a:direction == 'b'
  824. execute "normal ?" . l:pattern . "^M"
  825. " elseif a:direction == 'gv'
  826. " call CmdLine("vimgrep " . '/'. l:pattern . '/' . ' **/*.')
  827. " elseif a:direction == 'replace'
  828. " call CmdLine("%s" . '/'. l:pattern . '/')
  829. elseif a:direction == 'f'
  830. " execute "normal /" . l:pattern . "^M"
  831. execute "normal /" . l:pattern
  832. endif
  833. let @/ = l:pattern
  834. let @" = l:saved_reg
  835. endfunction
  836. " }}}
  837. "{{{ ***** MACHINE SPECIFIC CONFIG ***** "
  838. if filereadable($HOME . "/.vimrc_custom")
  839. source ~/.vimrc_custom
  840. command! -nargs=0 EditCustomVimrc tabedit ~/.vimrc_custom
  841. endif
  842. "}}}