Marty Oehme
4cd3feda3a
It works with fzf, and will use smartcase for its search. Since the setup is not using skim anymore, the official plugin will do.
704 lines
25 KiB
VimL
704 lines
25 KiB
VimL
" 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'
|
||
|
||
" " 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' } " show a directory listing within vim
|
||
Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' } " 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 <g)> or last <g(> 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 'morhetz/gruvbox'
|
||
Plug 'rakr/vim-one'
|
||
Plug 'reedes/vim-colors-pencil'
|
||
|
||
call plug#end()
|
||
endif
|
||
|
||
" }}}
|
||
" PLUGIN CONFIGURATION {{{
|
||
" ================================================================================
|
||
|
||
" 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
|
||
|
||
" " 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 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=["~/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
|
||
"
|
||
" follow and open links with pandoc
|
||
" open a file with either local means, or let the system decide
|
||
nnoremap <silent> gX :<C-u>call pandoc#hypertext#OpenSystem()<cr>
|
||
nnoremap <silent> gx :<C-u>call pandoc#hypertext#OpenLocal()<cr>
|
||
" open a link in the editor (this buffer, or split)
|
||
nnoremap <silent> gf :<C-u>call pandoc#hypertext#OpenLink( g:pandoc#hypertext#edit_open_cmd )<cr>
|
||
nnoremap <silent> <CR> :<C-u>call pandoc#hypertext#OpenLink( g:pandoc#hypertext#edit_open_cmd )<cr>
|
||
nnoremap <silent> gF :<C-u>call pandoc#hypertext#OpenLink( g:pandoc#hypertext#split_open_cmd )<cr>
|
||
nnoremap <silent> gF :<C-u>call pandoc#hypertext#OpenLink( g:pandoc#hypertext#split_open_cmd )<cr>
|
||
" go back a link
|
||
nnoremap <silent> gb :<C-u>call pandoc#hypertext#BackFromLink()<cr>
|
||
nnoremap <silent> <BS> :<C-u>call pandoc#hypertext#BackFromLink()<cr>
|
||
|
||
" 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
|
||
" 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>======================',
|
||
\}
|
||
|
||
|
||
" 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 <SID>goyo_enter()
|
||
autocmd! User GoyoLeave nested call <SID>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': <sid>bibtex_ls(<q-args>),
|
||
\ 'sink*': function('<sid>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': <sid>bibtex_ls(),
|
||
\ 'sink*': function('<sid>bibtex_markdown_sink'),
|
||
\ 'up': '25%',
|
||
\ 'options': '--ansi --multi --prompt "Markdown> "'
|
||
\ }))
|
||
" map @@ to automatically insert citation reference at cursor
|
||
inoremap <silent> @@ <c-g>u<c-o>:call fzf#run(fzf#wrap({
|
||
\ 'source': <sid>bibtex_ls(),
|
||
\ 'sink*': function('<sid>bibtex_cite_sink_insert'),
|
||
\ 'up': '25%',
|
||
\ 'options': '--ansi --multi --prompt "Cite> "'}))<CR>
|
||
" map <leader>cc to insert a complete citation at cursor
|
||
nnoremap <silent> <leader>cc :CiteRef<cr>
|
||
" map <leader>cm to insert markdown prettified citation
|
||
nnoremap <silent> <leader>cm :CiteMarkdown<cr>
|
||
|
||
" 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 = 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' : {}}
|
||
|
||
" 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
|
||
|
||
" }}}
|
||
" 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("\<CR>")
|
||
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
|
||
|
||
" 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>"
|
||
" 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>
|
||
|
||
" split buffers vertically/horizontally with the leader \ or - (mirrors my
|
||
" tmux setup)
|
||
nnoremap <leader>- :sp<cr>
|
||
nnoremap <leader>\ :vsp<cr>
|
||
|
||
" move around between matching brackets with tab
|
||
nnoremap <tab> %
|
||
nnoremap <tab> %
|
||
|
||
" Spell check set to <leader>O, 'o' for 'orthography':
|
||
noremap <leader>O :setlocal spell! spelllang=en_us<CR>
|
||
noremap <leader>OE :setlocal spell! spelllang=en_us<CR>
|
||
noremap <leader>OG :setlocal spell! spelllang=de_de<CR>
|
||
noremap <leader>o z=
|
||
|
||
" select the whole buffer with <leader>-a
|
||
nnoremap <leader>a ggVG
|
||
|
||
" quickly edit vimrc with leader+V
|
||
nnoremap <leader>V :vsp $MYVIMRC<cr>
|
||
" 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>
|
||
|
||
" since u undoes, would it not make sense that U redoes?
|
||
nnoremap U <C-r>
|
||
|
||
" 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
|
||
|
||
" get rid of the help message popping up when I miss esc and hit F1
|
||
nnoremap <F1> <ESC>
|
||
inoremap <F1> <ESC>
|
||
vnoremap <F1> <ESC>
|
||
|
||
" yank filename to f buffer
|
||
nnoremap yf :let @f = expand("%")<cr>
|
||
|
||
" remove all trailing whitespaces
|
||
" on pressing space+W
|
||
nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
|
||
" automatically on saving
|
||
" autocmd BufWritePre * :%s/\s\+$//e
|
||
|
||
" 'open new buffer' with leader-t (opens new buffer and switches to it)
|
||
" open actual new tab with leader-T
|
||
nnoremap <leader>t :vsp .<cr>
|
||
nnoremap <leader>T :tabedit .<cr>
|
||
|
||
" open/close NERDtree with leader-e
|
||
" whatever method tree has been opened by, leader-e closes it again
|
||
nnoremap <leader>e :NERDTreeToggle<CR>
|
||
" 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>
|
||
|
||
" 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)
|
||
|
||
" Configure notational-fzf-vim
|
||
let g:nv_search_paths = [ g:wiki_root ]
|
||
let g:nv_wrap_preview_text=1
|
||
" Dictionary with string keys and values. Must be in the form 'ctrl-KEY':
|
||
" 'command' or 'alt-KEY' : 'command'. See examples below.
|
||
let g:nv_fzf_binds = [
|
||
\ 'alt-a:select-all',
|
||
\ 'alt-q:deselect-all',
|
||
\ 'alt-p:toggle-preview',
|
||
\ 'alt-u:page-up',
|
||
\ 'alt-d:page-down',
|
||
\ 'ctrl-w:backward-kill-word',
|
||
\ ]
|
||
|
||
|
||
" Markdown & Pandoc compilation group
|
||
" the commented out command can be used if vim-rmarkdown plugin is not
|
||
" installed (it is a bit more brittle)
|
||
" autocmd FileType rmd noremap <F10> :!echo<space>"require(rmarkdown);<space>render('<c-r>%')"<space>\|<space>R<space>--vanilla<enter>
|
||
" Compile with rmarkdown
|
||
" autocmd FileType markdown,rmarkdown noremap <leader>c :RMarkdown pdf<cr>
|
||
" autocmd FileType markdown,rmarkdown noremap <leader>C :RMarkdown! pdf<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
|
||
|
||
" search in wiki with ctrlsf, in fullscreen window
|
||
nnoremap <leader>wf :execute(":call SearchWiki()")<cr>
|
||
|
||
" FUZZY FINDING
|
||
" FZF buffers and files in current workdir
|
||
noremap <leader>s :FzfBuffers<cr>
|
||
" FZF most recently used / MRU, bound to S since it is essentially a larger
|
||
" go-back intention than just buffers
|
||
noremap <leader>S :FzfHistory<cr>
|
||
noremap <leader>f :FzfFiles<cr>
|
||
|
||
" FZF general full-text search in cwd with rg
|
||
noremap <C-F> :FzfRg<cr>
|
||
" FZF note full-text search with notational-velocity like functions (in wiki
|
||
" directory)
|
||
noremap <leader>n :NV<cr>
|
||
noremap <leader>N :NV!<cr>
|
||
|
||
" FZF git diff
|
||
noremap <leader>gd :FzfGFiles?<cr>
|
||
|
||
" 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 @e@ marty.oehme@gmail.com
|
||
iabbrev ccopy Copyright 2019 Marty Oehme, all rights reserved.
|
||
|
||
"
|
||
" }}}
|
||
" END
|
||
" ================================================================================
|