dotfiles/.config/nvim/init.vim

509 lines
18 KiB
VimL
Raw Normal View History

2019-03-20 13:27:54 +00:00
" vim: set foldmethod=marker foldlevel=0 nomodeline:
" ================================================================================
" .init.vim / .vimrc of Marty Oehme {{{
" ================================================================================
"
" - stolen from many different sources including
" Steve Losh
" Junegunn Choi
" Tim Pope
2019-03-20 17:37:04 +00:00
" this config does not set nocompatible - neovim does this automatically
" this config does not set filetype plugin - vim-sensible does this
2019-03-20 13:27:54 +00:00
" }}}
" PLUGIN INSTALLATION - handled by VIM-PLUG {{{
" ================================================================================
"
" automatically install vim-plug if it does not exist
" Note: this installs it in the neovim folder, not the vim folder
2019-05-15 08:28:12 +00:00
if empty(glob('~/.local/share/nvim/site/autoload/plug.vim'))
silent !curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
2019-05-15 08:28:12 +00:00
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC | q
endif
" automatically install any missing plugins
autocmd VimEnter *
\ if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
\| PlugInstall --sync | q
\| endif
2019-03-13 14:08:39 +00:00
" defines plugin directory
2019-03-04 10:47:17 +00:00
" Install plugins from vim with :PlugInstall
silent! if plug#begin('~/.local/share/nvim/plugged')
2019-03-04 10:47:17 +00:00
2019-03-13 14:08:39 +00:00
" Base
2019-03-20 15:12:13 +00:00
" a minimal definition of variables TODO still necessary for nvim?
2019-03-04 10:47:17 +00:00
Plug 'tpope/vim-sensible'
2019-03-20 15:12:13 +00:00
" add seamless movement between vim and tmux, switch windows with C-hjkl
Plug 'christoomey/vim-tmux-navigator'
" automatically switch between relative and absolute numbers as buffers move
" into / out of focus (requires number & relativenumber to be set)
Plug 'jeffkreeftmeijer/vim-numbertoggle'
2019-03-13 14:08:39 +00:00
2019-03-20 23:06:40 +00:00
" " Workflow
2019-03-20 17:46:02 +00:00
Plug 'tpope/vim-commentary' " easily toggle comments for lines, paragraphs etc with gc
Plug 'tommcdo/vim-exchange' " adds exchange operator with cx. common use: cxiw . on 2 words to switch
Plug 'tpope/vim-surround' " lets you change surrounding things with cs (or ds to del, ys to add)
2019-03-20 18:41:22 +00:00
Plug 'kana/vim-textobj-user' " dependency for most other textobj plugins
Plug 'reedes/vim-textobj-sentence' " extends the capabilities of sentence detection
" and allows you to jump to the *end* of this <g)> or last <g(> sentence.
2019-03-17 18:45:29 +00:00
2019-03-20 23:06:40 +00:00
" " Ecosystem
" " Plug 'tpope/vim-fugitive' - Will have to take a closer look some other time
2019-03-20 15:13:18 +00:00
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } " show a directory listing within vim
2019-03-20 23:06:40 +00:00
Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' } " show git status in nerdtree for files and dirs
Plug 'Yggdroot/LeaderF', { 'on': ['Leaderf', 'LeaderfFile', 'LeaderfBuffer'], 'do': './install.sh' } " fuzzy matcher, apparently faster than fzf, ctrlp, unit, denite
Plug 'dyng/ctrlsf.vim'
2019-03-13 14:08:39 +00:00
" Language Integration
2019-03-17 18:45:29 +00:00
Plug 'sheerun/vim-polyglot' " syntax plugins for almost every language
2019-03-09 20:27:14 +00:00
Plug 'stephpy/vim-yaml'
2019-03-20 23:06:40 +00:00
Plug 'mhartington/nvim-typescript', {'for': 'typescript','do': './install.sh'}
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
Plug 'deoplete-plugins/deoplete-go', { 'do': 'make'}
2019-03-17 18:45:29 +00:00
" HTML Workflow
2019-03-20 23:06:40 +00:00
Plug 'valloric/matchtagalways', { 'on': [] }
Plug 'alvan/vim-closetag', { 'on': [] }
Plug 'jiangmiao/auto-pairs', { 'on': [] } " Auto close brackets and ''
augroup load_html_utils
autocmd!
autocmd InsertEnter * call plug#load('matchtagalways', 'vim-closetag', 'auto-pairs')
\| autocmd! load_html_utils
augroup END
2019-03-17 18:45:29 +00:00
2019-03-20 18:41:22 +00:00
" Markdown & Prose Workflow
Plug 'reedes/vim-pencil', { 'for': ['markdown', 'txt'], 'on': 'Goyo' } " provide md convenience functions like hard/softwrap
Plug 'junegunn/goyo.vim', { 'for': ['markdown', 'txt'], 'on': 'Goyo' } " provide distraction free writing
Plug 'junegunn/limelight.vim', { 'for': ['markdown', 'txt'], 'on': 'Goyo' } " provide even distraction free-er writing (lowlight paragraphs)
Plug 'rhysd/vim-grammarous', { 'for': ['markdown', 'txt'], 'on': 'Goyo' } " integrate vim with languagetool for grammar checking (needs java8)
2019-03-20 17:37:04 +00:00
" Note-Taking Workflow
2019-05-20 16:18:48 +00:00
Plug 'lervag/wiki.vim'
2019-03-17 18:45:29 +00:00
" For async completion
2019-03-20 23:06:40 +00:00
Plug 'Shougo/deoplete.nvim', { 'on': [] } " automatic suggestions, can also perhaps be changed for newer plugs
Plug 'Shougo/echodoc.vim', { 'on': [] }
2019-03-20 23:06:40 +00:00
Plug 'w0rp/ale', { 'on': [] } " asynchronous linting - might be superseded by lsp or coc.nvim at some point
" lazy loading since they require a lot of startup time
augroup load_ide_features
autocmd!
autocmd InsertEnter * call plug#load('ale', 'deoplete.nvim', 'echodoc.vim')
2019-03-20 23:06:40 +00:00
\| autocmd! load_ide_features
autocmd InsertEnter * call deoplete#enable()
autocmd InsertEnter * call echodoc#enable()
2019-03-20 23:06:40 +00:00
augroup END
2019-03-04 10:47:17 +00:00
2019-03-13 14:08:39 +00:00
" Design
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'edkolev/tmuxline.vim'
2019-03-13 14:08:39 +00:00
" Colorschemes
2019-03-20 15:12:46 +00:00
Plug 'morhetz/gruvbox'
Plug 'rakr/vim-one'
2019-03-13 14:08:39 +00:00
2019-03-04 10:47:17 +00:00
call plug#end()
endif
2019-03-09 20:27:14 +00:00
2019-03-20 13:27:54 +00:00
" }}}
" PLUGIN CONFIGURATION {{{
" ================================================================================
2019-03-20 15:13:18 +00:00
" PLUGIN: NERDTree
" highlight the line the cursor is on
let NERDTreeHighlightCursorline = 1
" remove Press ? for help
let NERDTreeMinimalUI=1
" loads nerdtree plugin when starting vim with a directory
" this is necessary when we lazyload nerdtree with vimplug above
" since it would only get loaded with nttoggle otherwise, and run netrw
augroup nerd_loader
autocmd!
autocmd VimEnter * silent! autocmd! FileExplorer
autocmd BufEnter,BufNew *
\ if isdirectory(expand('<amatch>'))
\| call plug#load('nerdtree')
\| execute 'autocmd! nerd_loader'
\| endif
augroup END
2019-03-20 17:37:04 +00:00
" PLUGIN: markdown-group
" unify markdown extensions to all use markdown filetype
au! BufRead,BufNewFile *.markdown set filetype=markdown
au! BufRead,BufNewFile *.md set filetype=markdown
au! BufRead,BufNewFile *.mkd set filetype=markdown
" automatically enables markdown plugins for md & txt files
function! Prose()
call pencil#init()
" PLUGIN: vim-textobj-sentence
" enable extended sentence textobject use on md and plaintext files
call textobj#sentence#init()
2019-05-20 16:18:48 +00:00
" hide the markdown cruft
set conceallevel=3
endfunction
2019-03-20 17:37:04 +00:00
" enable syntax highlighting for codeblocks WITHIN markdown
let g:markdown_fenced_languages = ['html', 'python', 'bash=sh', 'javascipt', 'go']
" call the prose function defined above for any md files
autocmd FileType markdown,txt call Prose()
" or invoke it manually by writing :Prose
command! -nargs=0 Prose call Prose()
2019-03-20 18:41:22 +00:00
2019-05-20 16:18:48 +00:00
" PLUGIN: wiki.vim
if $WIKIROOT ==? ""
let g:wiki_root = '~/Nextcloud/Notes/'
else
let g:wiki_root = $WIKIROOT
endif
2019-05-20 16:18:48 +00:00
" filetypes to automatically enable the plugin for, seems to take file endings
" rather than vim ft
let g:wiki_filetypes = ['md', 'mkd', 'markdown', 'wiki']
let g:wiki_link_extension = '.md'
let g:wiki_link_target_type = 'md'
let g:wiki_mappings_use_defaults = 1
" overwrites some default mappings I don't use, or that interfere with my own
" mappings TODO: currently this just assigns bogus shortcuts, since the plugin grumbles
" when setting to an empty string
let g:wiki_mappings_global = {
\ '<plug>(wiki-journal)' : '<leader>===',
\ '<plug>(wiki-code-run)' : '<leader>====',
\ '<plug>(wiki-graph-in)' : '<leader>====',
\ '<plug>(wiki-graph-out)' : '<leader>=====',
\ '<plug>(wiki-link-toggle)' : '<leader>=======',
\ '<plug>(wiki-page-toc)' : '<leader>=========',
\ '<plug>(wiki-page-toc-local)' : '<leader>=============',
\ '<plug>(wiki-export)' : '<leader>==============',
\ '<plug>(wiki-list-uniq)' : '<leader>===============',
\ '<plug>(wiki-list-uniq-local)' : '<leader>================',
\ '<plug>(wiki-tag-list)' : '<leader>=================',
\ '<plug>(wiki-tag-reload)' : '<leader>==================',
\ '<plug>(wiki-tag-search)' : '<leader>=====================',
\ '<plug>(wiki-link-toggle-operator)' : '<leader>======================',
\}
2019-05-20 16:18:48 +00:00
2019-03-20 17:37:04 +00:00
" PLUGIN: vim-pencil
" set default wrap mode to hard - TODO test which mode works better for
" me, it seems hardmode has trouble with markdown lists (see issue #31)
let g:pencil#wrapModeDefault = 'soft' " default is 'hard'
2019-03-20 17:37:04 +00:00
" PLUGIN: goyo
" set up functions for entering/exiting distraction free mode, or leaving it
function! s:goyo_enter()
" remove the tmux status bar for actual distraction free environment
silent !tmux set status off
" maximize the tmux pane that vim is in if any (usually I have vim open as the only pane)
silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z
" disable line highlighting, we really don't need it for prose
set nocursorline
2019-03-20 17:37:04 +00:00
" enable limelight which highlights whatever paragraph you are in and lowlights the rest
Limelight
endfunction
function! s:goyo_leave()
silent !tmux set status on
silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z
set cursorline
2019-03-20 17:37:04 +00:00
Limelight!
endfunction
" actually call the functions on entering/leaving goyo
autocmd! User GoyoEnter nested call <SID>goyo_enter()
autocmd! User GoyoLeave nested call <SID>goyo_leave()
" PLUGIN: vim-go
" change the tabstops for go to use tabs and a width of 4
" this conforms with the gofmt expectations
au FileType go set noexpandtab
au FileType go set shiftwidth=4
au FileType go set softtabstop=4
au FileType go set tabstop=4
" enable all sorts of highlighting options for
" variables/functions/arguments...
let g:go_highlight_build_constraints = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_operators = 1
let g:go_highlight_structs = 1
let g:go_highlight_types = 1
" enable highlighting of other uses of the same variable
let g:go_auto_sameids = 1
" automatically import needed dependencies
" TODO do I need this? not doing it automatically does lead to more conscious
" decision making on imports
let g:go_fmt_command = "goimports"
" show type information for variables in the status line
let g:go_auto_type_info = 1
2019-03-20 15:13:18 +00:00
" PLUGIN: DEOPLETE
" enable deoplete at startup
2019-03-20 23:06:40 +00:00
let g:deoplete#enable_at_startup = 0
2019-03-20 15:13:18 +00:00
let g:deoplete#enable_ignore_case = 1
let g:deoplete#enable_smart_case = 1
let g:deoplete#enable_camel_case = 1
let g:deoplete#enable_refresh_always = 1
let g:deoplete#max_abbr_width = 0
let g:deoplete#max_menu_width = 0
let g:deoplete#omni#input_patterns = get(g:,'deoplete#omni#input_patterns',{})
" PLUGIN: ECHODOC
let g:echodoc#type="virtual"
set splitbelow
set completeopt+=menuone,noinsert,noselect
set completeopt-=preview
autocmd CompleteDone * pclose
2019-03-20 15:13:18 +00:00
" PLUGIN: ALE
" clearer Error and warning signs for the gutter
let g:ale_sign_error = ''
let g:ale_sign_warning = '⚠'
" Enable integration with airline.
let g:airline#extensions#ale#enabled = 1
2019-03-20 15:13:18 +00:00
let g:ale_fix_on_save = 1
let g:ale_fixers = {
\'javascipt': ['eslint', 'prettier'],
\'html': ['tidy','prettier'],
\'typescript': ['prettier','tslint'],
\'*': ['remove_trailing_lines', 'trim_whitespace'],
\'go': ['gofmt'],
\'sh': ['shfmt'],
\'zsh': ['shfmt'],
\}
2019-07-08 20:06:25 +00:00
2019-07-11 07:01:00 +00:00
let g:ale_linters = {
\ 'go': ['gopls'],
\ 'sh': ['language_server','shellcheck'],
\ 'zsh': ['language_server','shellcheck'],
2019-07-11 07:01:00 +00:00
\}
2019-03-20 15:13:18 +00:00
" PLUGIN: AIRLINE
" PLUGIN: TMUXLINE
2019-03-13 14:08:39 +00:00
let g:airline_powerline_fonts=1
let g:airline_theme='raven'
let g:gruvbox_italic=1
colorscheme gruvbox
" disable automatically refreshing the mux statusbar since it breaks tmux
" prefix highlighting. Instead, when changing vim statusbar just create
" snapshot with :TmuxlineSnapshot file and stick it into tmux config manually
let g:airline#extensions#tmuxline#enabled = 0
" custom preset with left-justified window list
let g:tmuxline_preset = {
\'a' : '#S',
\'b' : '#(whoami)',
\'c' : '#I:#P',
\'win' : '#I #W',
\'cwin' : [' ', '#I #W'],
\'x' : '#{prefix_highlight} %H:%M:%S',
\'y' : '%d-%b-%y',
\'z' : '#H',
\'options' : {}}
2019-03-09 20:27:14 +00:00
2019-03-15 15:26:57 +00:00
" automatically save the current buffer when navigating away from vim
let g:tmux_navigator_save_on_switch = 1
2019-03-20 13:27:54 +00:00
" }}}
" VIM SETTINGS {{{
" ================================================================================
"
2019-03-13 14:08:39 +00:00
" set truecolor (neovim)
set termguicolors
" sets tabs to be 2 characters, expanded into spaces, but still removable with
2019-03-09 20:27:14 +00:00
" one press of backspace.
" great explanation: http://vimcasts.org/transcripts/2/en/
2019-03-17 18:45:29 +00:00
set tabstop=2
set shiftwidth=2
set softtabstop=2
2019-03-09 20:27:14 +00:00
set expandtab
" set cursor line highlighting, esp useful when using with bracket
" highlighting and you don't know which side of the brace the cursor is on
set cursorline
2019-03-09 20:27:14 +00:00
" shows linenumbers relative to the one you are on, for easy movement and
" dNUMBERd deletions
set number relativenumber
2019-03-09 20:27:14 +00:00
" keeps an undofile next to files so that you can even undo if vim is closed
" in between
set undofile
" ignores case by default but will use case when search is specifically not
" all lowercased
set ignorecase
set smartcase
2019-03-13 14:08:39 +00:00
" whenever vim loses focus, save
au FocusLost * :wa
" disables showing us the current mode in the command line since airline takes
" care of it
set noshowmode
2019-03-17 18:45:29 +00:00
" highlight everything that goes over 80 columns
highlight ColorColumn ctermbg=magenta
call matchadd('ColorColumn', '\%81v', 100)
2019-03-20 13:27:54 +00:00
" }}}
" KEYBINDINGS {{{
" ================================================================================
2019-03-13 14:08:39 +00:00
"
" set our leader key to space since with hjkl, space is largely useless
let mapleader = "\<Space>"
" maps the leader for buffer local mappings (e.g. vim-waikiki for files under
" the root dir to the same key -- might lead to incompatibilities, will have
" to test)
let maplocalleader = "\<Space>"
2019-03-13 14:08:39 +00:00
" set jk to escape, in case capslock is not mapped to escape on the system
inoremap jk <ESC>
" remove search highlights by pressing space+/ - the key for searching the
" first place
nnoremap <leader>/ :noh<cr>
2019-03-09 20:27:14 +00:00
" split buffers vertically/horizontally with the leader \ or - (mirrors my
" tmux setup)
nnoremap <leader>- :sp<cr>
nnoremap <leader>\ :vsp<cr>
2019-03-09 20:27:14 +00:00
" move around between matching brackets with tab
nnoremap <tab> %
nnoremap <tab> %
2019-03-13 14:08:39 +00:00
" select the whole buffer with <leader>-a
nnoremap <leader>a ggVG
2019-03-13 14:08:39 +00:00
2019-03-20 13:30:36 +00:00
" quickly edit vimrc with leader+V
nnoremap <leader>V :vsp $MYVIMRC<cr>
2019-03-20 13:30:36 +00:00
" automatically source the vimrc file whenever it is saved (causes slowdown
" when done in MANY successions)
" au BufWritePost init.vim so ~/.config/nvim/init.vim
" source vimrc with keystroke combination
nnoremap <leader>VV :source $MYVIMRC<cr>
2019-03-13 14:08:39 +00:00
" since u undoes, would it not make sense that U redoes?
nnoremap U <C-r>
2019-05-20 20:21:53 +00:00
" when in insertion mode, C-u uppercases the current word, C-l lowercases it,
inoremap <C-u> <esc>gUiw`]a
inoremap <C-l> <esc>guiw`]a
2019-03-13 14:08:39 +00:00
" get rid of the help message popping up when I miss esc and hit F1
nnoremap <F1> <ESC>
inoremap <F1> <ESC>
vnoremap <F1> <ESC>
" remove all trailing whitespaces
2019-03-20 13:30:36 +00:00
" on pressing space+W
2019-03-13 14:08:39 +00:00
nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
2019-03-20 13:30:36 +00:00
" automatically on saving
" autocmd BufWritePre * :%s/\s\+$//e
" 'open new buffer' with leader-t (opens new buffer and switches to it)
2019-03-15 15:26:57 +00:00
" open actual new tab with leader-T
2019-03-17 18:45:29 +00:00
nnoremap <leader>t :vsp .<cr>
2019-03-15 15:26:57 +00:00
nnoremap <leader>T :tabedit .<cr>
2019-03-20 15:13:18 +00:00
" open/close NERDtree with leader-e
" whatever method tree has been opened by, leader-e closes it again
nnoremap <leader>e :NERDTreeToggle<CR>
2019-03-20 15:13:18 +00:00
" open root of current VCS project in tree
nnoremap <leader><C-e> :NERDTreeVCS<CR>
" open current nerdtree with current file highlighted
nnoremap <leader>E :NERDTreeFind<CR>
2019-03-20 13:27:54 +00:00
" vim-go mappings - will only activate in go files
" most of this credit to https://hackernoon.com/my-neovim-setup-for-go-7f7b6e805876
" switch between test file and function
au Filetype go nnoremap <leader>ga <Plug>(go-alternate-edit)
" switch between test file and function - in a horizontal/vertical split
au Filetype go nnoremap <leader>gah <Plug>(go-alternate-split)
au Filetype go nnoremap <leader>gav <Plug>(go-alternate-vertical)
" run a test (but run it as short version, in case tests are tagged
" accordingly)
au FileType go nnoremap <F10> :GoTest -short<cr>
" show/hide code coverage of go file
au FileType go nnoremap <F9> :GoCoverageToggle -short<cr>
" To get the documentation of whatever you are hovering over press K (to go
" back C-t) -- this is enabled by default and needs no bind
" go to the definition of whatever you hover over
au FileType go nnoremap <F12> <Plug>(go-def)
" Call leaderf with <leader-f> (necessary to enable leaderf lazyloading)
nnoremap <leader>F :LeaderfFile<cr>
nnoremap <leader>f :LeaderfBuffer<cr>
function! SearchWiki()
let l:curpath=getcwd()
:execute(":cd " . g:wiki_root)
let l:texttofind=input("Search in Notes: ")
:execute(":CtrlSF " . l:texttofind)
:CtrlSFFocus
:execute(":cd " . l:curpath)
endfunction
function! RgWiki()
let l:curpath=getcwd()
:execute(":cd " . g:wiki_root)
let l:texttofind=input("Search Notes: ")
if l:texttofind ==? ""
:execute(":Leaderf rg")
else
:execute(":Leaderf rg -e " . l:texttofind )
endif
:execute(":cd " . l:curpath)
endfunction
" search in wiki with ctrlsf, in fullscreen window
nnoremap <leader>wF :execute(":call SearchWiki()")<cr>
" fuzzy search wiki with leaderf
nnoremap <leader>wf :execute(":call RgWiki()")<cr>
" fuzzy search current working dir
nnoremap <C-F> :execute(":Leaderf rg")<cr>
vnoremap <C-F> <Plug>CtrlSFVwordPath
2019-03-20 17:37:04 +00:00
" Mostly dealing with Prose writing from here on out
" Format current Paragraph (esp useful in prose writing)
nnoremap <silent> <leader>q gqap
xnoremap <silent> <leader>q gq
nnoremap <silent> <leader>Q vapJgqap
" Enter distraction free prose mode with F11
noremap <F11> :Goyo<CR>
" surround stuff with quotes, from normal or visual mode
nnoremap <leader>" viw<esc>a"<esc>bi"<esc>lel
vnoremap <leader>" <esc>`<i"<esc>`>la"<esc>l
" stronger versions of left,right - move all the way
nnoremap H ^
nnoremap L $
" }}}
" ABBREVIATIONS {{{
" Typos
iabbrev adn and
iabbrev waht what
iabbrev tehn then
iabbrev whit with
iabbrev whith with
" Text expansion
iabbrev @@ marty.oehme@gmail.com
iabbrev ccopy Copyright 2019 Marty Oehme, all rights reserved.
"
2019-03-20 13:27:54 +00:00
" }}}
" END
" ================================================================================