" 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 " this config does not set nocompatible - neovim does this automatically " this config does not set filetype plugin - vim-sensible does this " }}} " 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 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 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 " defines plugin directory " Install plugins from vim with :PlugInstall silent! if plug#begin('~/.local/share/nvim/plugged') " Base " a minimal definition of variables TODO still necessary for nvim? Plug 'tpope/vim-sensible' " 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' " Plug 'liuchengxu/vim-which-key', { 'on': ['WhichKey', 'WhichKey!'] } -> " instructions: http://liuchengxu.org/vim-which-key/, needs setup tp become " useful. TODO enable when setup is more settled down " sneak around your files using Plug 'justinmk/vim-sneak' " highlight all occurences of the current word under the cursor (after 250ms " delay) Plug 'RRethy/vim-illuminate' " " editing Workflow 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) " " Ecosystem " " Plug 'tpope/vim-fugitive' - Will have to take a closer look some other time Plug 'scrooloose/nerdtree', { 'on': ['NERDTreeToggle', 'NERDTreeFind'] } " show a directory listing within vim Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': ['NERDTreeToggle', 'NERDTreeFind'] } " show git status in nerdtree for files and dirs " Fuzzy matching Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' } Plug 'junegunn/fzf.vim' Plug 'alok/notational-fzf-vim' Plug 'dyng/ctrlsf.vim' " Language Integration Plug 'sheerun/vim-polyglot' " syntax plugins for almost every language Plug 'stephpy/vim-yaml' Plug 'mhartington/nvim-typescript', {'for': 'typescript','do': './install.sh'} Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } Plug 'deoplete-plugins/deoplete-go', { 'do': 'make'} Plug 'aliou/bats.vim' " HTML Workflow 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 " Prose Workflow 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 or last sentence. 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) " RMarkdown & LaTeX workflow Plug 'vim-pandoc/vim-pandoc-syntax' Plug 'vim-pandoc/vim-pandoc' " Plug 'vim-pandoc/vim-rmarkdown' " Note-Taking Workflow Plug 'lervag/wiki.vim' " For async completion Plug 'Shougo/deoplete.nvim', { 'on': [] } " automatic suggestions, can also perhaps be changed for newer plugs Plug 'Shougo/echodoc.vim', { 'on': [] } 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') \| autocmd! load_ide_features autocmd InsertEnter * call deoplete#enable() autocmd InsertEnter * call echodoc#enable() " Add pandoc citations to deoplete automatic completions autocmd InsertEnter * call deoplete#custom#var('omni', 'input_patterns', { \ 'pandoc': '@' \}) augroup END " Design Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'edkolev/tmuxline.vim' " Colorschemes Plug 'rafi/awesome-vim-colorschemes' Plug 'reedes/vim-colors-pencil' Plug 'rakr/vim-togglebg' call plug#end() endif " }}} " PLUGIN CONFIGURATION {{{ " ================================================================================ let g:sneak#s_next = 1 let g:sneak#use_ic_scs = 1 " 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('')) \| call plug#load('nerdtree') \| execute 'autocmd! nerd_loader' \| endif augroup END " " 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 plug#load('vim-pencil') call pencil#init() " PLUGIN: vim-textobj-sentence " enable extended sentence textobject use on md and plaintext files call textobj#sentence#init() " hide the markdown cruft setlocal conceallevel=2 setlocal foldlevel=2 endfunction " 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 au FileType pandoc,markdown call Prose() " or invoke it manually by writing :Prose command! -nargs=0 Prose call Prose() " PLUGIN: vim-pandoc " handle markdown files with pandoc (and pandoc syntax!) let g:pandoc#modules#disabled = ["folding"] let g:pandoc#filetypes#pandoc_markdown = 1 " disable all default keymaps let g:pandoc#keyboard#use_default_mappings=0 let g:pandoc#hypertext#use_default_mappings=0 " if there's a pdf and an html or similar, open the pdf let g:pandoc#command#prefer_pdf=1 " look for bibtex files w/ same name as edited one, then .bib in current dir, yaml frontmatter, and finally the globally set bibs file let g:pandoc#biblio#sources="bcyg" " the globally set bibs file let g:pandoc#biblio#bibs=[expand("~/Nextcloud/Library/academia/academia.bib")] let g:pandoc#biblio#use_bibtool=1 let g:pandoc#biblio#use_preview=1 let g:pandoc#completion#bib#mode='citeproc' let g:pandoc#folding#fold_yaml=1 let g:pandoc#folding#fastfolds=1 " let g:pandoc#folding#level=2 let g:pandoc#spell#default_langs=["en_us", "de_de"] let g:pandoc#hypertext#ausosave_on_edit_open_link=1 let g:pandoc#hypertext#create_if_no_alternates_exists=1 let g:pandoc#syntax#conceal#use = 1 let g:pandoc#syntax#conceal#urls = 1 " PLUGIN: wiki.vim if $WIKIROOT ==? "" let g:wiki_root = '~/Nextcloud/Notes/' else let g:wiki_root = $WIKIROOT endif " 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 " 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' " 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 " 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 Limelight! endfunction " actually call the functions on entering/leaving goyo autocmd! User GoyoEnter nested call goyo_enter() autocmd! User GoyoLeave nested call goyo_leave() " FZF Fuzzy Finding " set some fzf defaults let g:fzf_layout = { 'up': '~40%' } let g:fzf_command_prefix = 'Fzf' let g:fzf_colors = \ { 'fg': ['fg', 'Normal'], \ 'bg': ['bg', 'Normal'], \ 'hl': ['fg', 'Comment'], \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], \ 'hl+': ['fg', 'Statement'], \ 'info': ['fg', 'PreProc'], \ 'border': ['fg', 'Ignore'], \ 'prompt': ['fg', 'Conditional'], \ 'pointer': ['fg', 'Exception'], \ 'marker': ['fg', 'Keyword'], \ 'spinner': ['fg', 'Label'], \ 'header': ['fg', 'Comment'] } let g:fzf_action = { \ 'ctrl-t': 'tab split', \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit' } " set up fzf-bibtex let g:fzf_bibtex_cache = '~/.cache/' let g:fzf_bibtex_sources = g:pandoc#biblio#bibs " prepare bibtex_ls function to look for bib files in cwd/parent/subdirs, " attach the standard bibtex source file " return the command with standard cache directory filled function! s:bibtex_ls(...) let bibfiles = ( \ globpath('.', '*.bib', v:true, v:true) + \ globpath('..', '*.bib', v:true, v:true) + \ globpath('*/', '*.bib', v:true, v:true) \ ) let bibfiles = join(bibfiles, ' ') let source_cmd = 'bibtex-ls -cache ' . g:fzf_bibtex_cache . ' ' .bibfiles . ' ' . join(g:fzf_bibtex_sources) return source_cmd endfunction " insert citation from normal mode at cursor (with brackets) function! s:bibtex_cite_sink(lines) let r=system("bibtex-cite ", a:lines) execute ':normal! i[' . r . ']' endfunction command! -bang -nargs=* CiteRef call fzf#run(fzf#wrap({ \ 'source': bibtex_ls(), \ 'sink*': function('bibtex_cite_sink'), \ 'up': '25%', \ 'options': '--ansi --multi --prompt "Cite> "' \ })) " insert citation from insert mode at cursor (no brackets inserted) function! s:bibtex_cite_sink_insert(lines) let r=system("bibtex-cite ", a:lines) execute ':normal! i' . r call feedkeys('a', 'n') endfunction " insert markdown formatted reference function! s:bibtex_markdown_sink(lines) let r=system("bibtex-markdown -cache " . g:fzf_bibtex_cache . ' ' . join(g:fzf_bibtex_sources), a:lines) echo join(a:lines, '; ') execute ':normal! i' . r endfunction command! -bang -nargs=* CiteMarkdown call fzf#run(fzf#wrap({ \ 'source': bibtex_ls(), \ 'sink*': function('bibtex_markdown_sink'), \ 'up': '25%', \ 'options': '--ansi --multi --prompt "Markdown> "' \ })) " 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 " PLUGIN: DEOPLETE " enable deoplete at startup let g:deoplete#enable_at_startup = 0 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 " 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 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'], \} let g:ale_linters = { \ 'go': ['gopls'], \ 'sh': ['language_server','shellcheck'], \ 'zsh': ['language_server','shellcheck'], \} " PLUGIN: AIRLINE " PLUGIN: TMUXLINE let g:airline_powerline_fonts=1 " let g:airline_theme='raven' " Enable italics for colorschemes that support them let g:gruvbox_italic=1 let g:one_allow_italics=1 let g:pencil_terminal_italics=1 colorscheme one " 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 = 1 " 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' : '#{?client_prefix,#[fg=colour232]#[bg=brightblue],} %H:%M:%S', \'y' : '%d-%b-%y', \'z' : '#H', \'options' : {}} " automatically save the current buffer when navigating away from vim let g:tmux_navigator_save_on_switch = 1 " }}} " VIM SETTINGS {{{ " ================================================================================ " " set truecolor (neovim) set termguicolors " sets tabs to be 2 characters, expanded into spaces, but still removable with " one press of backspace. " great explanation: http://vimcasts.org/transcripts/2/en/ set tabstop=2 set shiftwidth=2 set softtabstop=2 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 " shows linenumbers relative to the one you are on, for easy movement and " dNUMBERd deletions set number relativenumber " 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 " 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 " highlight everything that goes over 80 columns highlight ColorColumn ctermbg=magenta call matchadd('ColorColumn', '\%81v', 100) " Special setting for editing gopass files - make sure nothing leaks outside " the directories it is supposed to au BufNewFile,BufRead /dev/shm/gopass.* setlocal noswapfile nobackup noundofile 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 " Configure notational-fzf-vim let g:nv_search_paths = [ g:wiki_root ] let g:nv_wrap_preview_text=1 " }}} " KEYBINDINGS {{{ " ================================================================================ " " Show all mapped keys in a list - from https://stackoverflow.com/questions/13990136/display-a-ordered-vim-keyboard-mapping function! s:ShowMaps() let old_reg = getreg("a") " save the current content of register a let old_reg_type = getregtype("a") " save the type of the register as well try redir @a " redirect output to register a " Get the list of all key mappings silently, satisfy "Press ENTER to continue" silent map | call feedkeys("\") redir END " end output redirection vnew " new buffer in vertical window put a " put content of register " Sort on 4th character column which is the key(s) %!sort -k1.4,1.4 finally " Execute even if exception is raised call setreg("a", old_reg, old_reg_type) " restore register a endtry endfunction " use :ShowMaps to call the function com! ShowMaps call s:ShowMaps() " Enable :ShowMaps to call the function " Begin mapping definitions runtime! **/maps.vim " }}} " ABBREVIATIONS {{{ " Typos iabbrev adn and iabbrev waht what iabbrev tehn then iabbrev whit with iabbrev whith with " Text expansion iabbrev mo@ marty.oehme@gmail.com iabbrev mo.me@ iabbrev mcc@ Copyright 2019 Marty Oehme, all rights reserved. " " }}} " END " ================================================================================