" Specify a directory for plugins (for Neovim: ~/.local/share/nvim/plugged) call plug#begin('~/.config/nvim/plugged') " Automatically match structures as you type Plug 'tpope/vim-endwise' " Tab completion Plug 'ervandew/supertab' " EasyMotion - Allows (b|e) to jump to (b)eginning or (end) " of words. Plug 'easymotion/vim-easymotion' " Fuzzy file search "Plug '~/.fzf' Plug 'junegunn/fzf.vim' " Remove extraneous whitespace when edit mode is exited Plug 'thirtythreeforty/lessspace.vim' " Status bar mods Plug 'bling/vim-airline' Plug 'airblade/vim-gitgutter' " Manage Project sessions Plug 'tpope/vim-obsession' Plug 'dhruvasagar/vim-prosession' " Explore filesystem Plug 'scrooloose/nerdtree' " Commenter Plug 'scrooloose/nerdcommenter' " Theme Plug 'sickill/vim-monokai' " Autoload and read from dish if file changes Plug 'tmux-plugins/vim-tmux-focus-events' Plug 'wellle/tmux-complete.vim' " For LaTeX support Plug 'lervag/vimtex' " For git support Plug 'tpope/vim-fugitive' Plug 'junegunn/gv.vim' Plug 'rhysd/git-messenger.vim' Plug 'sodapopcan/vim-twiggy' Plug 'christoomey/vim-conflicted' Plug 'rbong/vim-flog' " For tmux yank Plug 'vim-utils/vim-husk' " Tags Plug 'steffanc/cscopemaps.vim' Plug 'ludovicchabant/vim-gutentags' " GDB Plug 'sakhnik/nvim-gdb', { 'do': ':UpdateRemotePlugins' } " Lisp Plug 'guns/vim-sexp' Plug 'tpope/vim-sexp-mappings-for-regular-people' Plug 'junegunn/rainbow_parentheses.vim' Plug 'Olical/vim-scheme', { 'for': 'scheme', 'on': 'SchemeConnect' } " Haskell Plug 'ekmett/haskell-vim', { 'for': [ 'haskell', 'cabal' ] } Plug 'neomake/neomake' Plug 'ndmitchell/ghcid', { 'rtp': 'plugins/nvim' } Plug 'Twinside/vim-hoogle' Plug 'hspec/hspec.vim' " For Nix Plug 'LnL7/vim-nix', { 'for': 'nix' } " For autocompletion Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " Autocomplete for Python Plug 'zchee/deoplete-jedi' " Autocomplete for Rust Plug 'sebastianmarkow/deoplete-rust' Plug 'cespare/vim-toml', { 'for': 'rust' } Plug 'rust-lang/rust.vim', { 'for': 'rust' } Plug 'mhinz/vim-crates' " Erlang Support Plug 'vim-erlang/vim-erlang-tags' Plug 'vim-erlang/vim-erlang-runtime' Plug 'vim-erlang/vim-erlang-omnicomplete' Plug 'vim-erlang/vim-erlang-compiler' " Miscellaneous Plug 'tpope/vim-surround' Plug 'tpope/vim-repeat' Plug 'editorconfig/editorconfig-vim' Plug 'tpope/vim-eunuch' Plug 'vim-utils/vim-man' Plug 'unblevable/quick-scope' Plug 'igankevich/mesonic' Plug 'rhysd/vim-clang-format', { 'for': [ 'c', 'cpp'] } Plug 'pelodelfuego/vim-swoop' Plug 'adelarsq/vim-matchit' " Initialize plugin system call plug#end() syntax on filetype plugin indent on " Set up leaders let mapleader="\" set colorcolumn=80 " Highlight 80th column set laststatus=2 " Always show status bar set updatetime=500 " Let plugins show effects after 500ms set mouse-=a " Disable mouse click to go to position set encoding=utf-8 set exrc " Allow loading local .nvimrc files set secure " Disallow use of autocmd, shell and write in local rc set showcmd " Show (partial) command in status line. set showmatch " Show matching brackets. set showmode " Show current mode. set ruler " Show the line and column numbers of the cursor. set number " Show the line numbers on the left side. set formatoptions+=o " Continue comment marker in new lines. set textwidth=0 " Hard-wrap long lines as you type them. set softtabstop=4 " Finetunes the amount of white space to be added. set tabstop=4 " Render TABs using this many spaces. set shiftwidth=4 " Indentation amount for < and > commands. set smarttab " Indent with tabs, align with spaces. set expandtab " When on, uses space instead of tabs. set noerrorbells " No beeps. set modeline " Enable modeline. set linespace=0 " Set line-spacing to minimum. set nojoinspaces " Prevents inserting two spaces after punctuation on a join (J) set splitbelow " Horizontal split below current. set splitright " Vertical split to right of current. if !&scrolloff set scrolloff=3 " Show next 3 lines while scrolling. endif if !&sidescrolloff set sidescrolloff=5 " Show next 5 columns while side-scrolling. endif set nostartofline " Do not jump to first character with page commands. set ignorecase " Make searching case insensitive set smartcase " ... unless the query has capital letters. set gdefault " Use 'g' flag by default with :s/foo/bar/. set magic " Use 'magic' patterns (extended regular expressions). set autoread " Autoload file if it changes on disk set termguicolors " Enable colors for terminal set fileformat=unix set clipboard^=unnamed,unnamedplus set completeopt=menuone,preview,noinsert set rtp+=/usr/bin/fzf " Theme syntax enable colorscheme monokai " Use to clear the highlighting of :set hlsearch. if maparg('', 'n') ==# '' nnoremap :nohlsearch endif "nnoremap ; : " Use ; for commands. "nnoremap Q @q " Use Q to execute default register. " Plug shortcuts nnoremap pg :PlugUpgrade nnoremap pd :PlugUpdate nnoremap pc :PlugClean " Open NerdTree nnoremap ee :NERDTree " For fzf nnoremap vf :Files nnoremap vg :GFiles nnoremap vb :Buffers nnoremap vL :Lines nnoremap vl :BLines nnoremap vt :Tags nnoremap vc :Bcommits nnoremap va :Commits " Use ripgrep to search for content in files nnoremap / :Rg nnoremap b :ls:b " Save nnoremap w :w " Search and Replace nnoremap sr :%s//g " Quit nnoremap x :x nnoremap q :q nnoremap qa :qa " Search for the word under cursor noremap d :exe ':Rg ' . expand('') " Open terminal nnoremap te :vsp :terminal " Tab navigation shortcuts nnoremap tn :bn nnoremap tp :bp " Reload opened vim config file nnoremap vr :so % " For git nnoremap gm :GitMessenger nnoremap gl :Glog nnoremap gd :Gdiffsplit nnoremap gs :Gstatus nnoremap gc :Gcommit --signoff nnoremap gp :Git! push nnoremap gu :Git! push -u nnoremap gr :Git! remote -v " For gitgutter nnoremap ghn :GitGutterNextHunk nnoremap ghp :GitGutterPrevHunk nnoremap ghs :GitGutterStageHunk nnoremap ghu :GitGutterUndoHunk nnoremap ghr :GitGutterPreviewHunk nnoremap gqf :GitGutterQuickFix nnoremap ggf :GitGutterFold " For Cscope nnoremap cr :cs reset " For Neomake nnoremap nm :Neomake nnoremap nc :NeomakeClean nnoremap ns :NeomakeSh nnoremap njl :NeomakeListJobs nnoremap nja :NeomakeCancelJobs nnoremap njc :NeomakeCancelJob " Haskell specific " For ghcid nnoremap hg :Ghcid nnoremap hk :GhcidKill " For Hoogle nnoremap hc :HoogleClose nnoremap ho :exe ':Hoogle ' . expand('') nnoremap hi :exe ':HoogleInfo ' . expand('') " Quickfix nnoremap fn :cnext nnoremap fp :cprevious nnoremap fo :copen nnoremap fc :cclose " Location nnoremap ffn :lnext nnoremap ffp :lprevious nnoremap ffo :lopen nnoremap ffc :lclose " Key Bindings to help with terminal mode :tnoremap " Key bindings to move between window splits nnoremap gh h nnoremap gj j nnoremap gk k nnoremap gl l " Disable Arrow Keys inoremap inoremap inoremap inoremap noremap noremap noremap noremap augroup deopleteMaps au! " For deoplete Rust au FileType rust nmap rd DeopleteRustGoToDefinitionDefault au FileType rust nmap rc DeopleteRustShowDocumentation au FileType rust nmap rv DeopleteRustGoToDefinitionVSplit au FileType rust nmap rh DeopleteRustGoToDefinitionSplit au FileType rust nmap rt DeopleteRustGoToDefinitionTab augroup END augroup rainbow_lisp autocmd! autocmd FileType lisp,clojure,scheme RainbowParentheses augroup END " Starts the REPL. autocmd FileType scheme nnoremap rc :SchemeConnect " Evaluates the outer most / top level form and jumps the cursor back to where it was. autocmd FileType scheme nnoremap re :normal mscpaF`s " Evaluates the entire file. autocmd FileType scheme nnoremap rf :normal msggcpG`s let g:haskell_enable_quantification = 1 " to enable highlighting of `forall` let g:haskell_enable_recursivedo = 1 " to enable highlighting of `mdo` and `rec` let g:haskell_enable_arrowsyntax = 1 " to enable highlighting of `proc` let g:haskell_enable_pattern_synonyms = 1 " to enable highlighting of `pattern` let g:haskell_enable_typeroles = 1 " to enable highlighting of type roles let g:haskell_enable_static_pointers = 1 " to enable highlighting of `static` let g:haskell_backpack = 1 " to enable highlighting of backpack keywords let g:haskell_classic_highlighting = 0 let g:haskell_indent_if = 3 let g:haskell_indent_case = 2 let g:haskell_indent_let = 4 let g:haskell_indent_where = 6 let g:haskell_indent_before_where = 2 let g:haskell_indent_after_bare_where = 2 let g:haskell_indent_do = 3 let g:haskell_indent_in = 1 let g:haskell_indent_guard = 2 let g:haskell_indent_case_alternative = 1 let g:cabal_indent_section = 2 let g:ghcid_command = 'stack exec -- ghcid' let g:hoogle_search_bin = 'stack exec -- hoogle' " Use deoplete let g:deoplete#enable_at_startup = 1 " Disable autocomplete by default " let b:deoplete_disable_auto_complete = 1 " let g:deoplete_disable_auto_complete = 1 " Let sources be empty by default let g:deoplete#sources = {} " Disable the candidates in Comment/String syntaxes. call deoplete#custom#source('_', \ 'disabled_syntaxes', ['Comment', 'String']) call deoplete#custom#option('sources', { \ '_' : ['buffer', 'tag'], \ 'rust': ['racer'], \}) let g:deoplete#sources#rust#disable_keymap = 1 let g:deoplete#sources#rust#racer_binary=expand('$HOME/.cargo/bin/racer') let g:deoplete#sources#rust#rust_source_path=expand('$HOME/GitSources/rust/src') " Use airline let g:airline#extensions#tabline#enabled = 2 let g:airline#extensions#tabline#fnamemod = ':t' let g:airline#extensions#tabline#left_sep = ' ' let g:airline#extensions#tabline#left_alt_sep = '|' let g:airline#extensions#tabline#right_sep = ' ' let g:airline#extensions#tabline#right_alt_sep = '|' let g:airline_left_sep = ' ' let g:airline_left_alt_sep = '|' let g:airline_right_sep = ' ' let g:airline_right_alt_sep = '|' let g:airline#extensions#tabline#buffer_nr_show = 1 " Let vim-gitgutter do its thing on large files let g:gitgutter_max_signs=1000 " Neomake " compile when I open a file, change text, leave insert mode, etc ... call neomake#configure#automake({ \ 'TextChanged': {}, \ 'InsertLeave': {}, \ 'BufWritePost': {}, \ }) " When compilation is done, open the Location list or quickfix list " Value of 2 preserves cursor position let g:neomake_open_list = 2 " gutentags configuration " https://www.reddit.com/r/vim/comments/d77t6j/guide_how_to_setup_ctags_with_gutentags_properly/ let g:gutentags_add_default_project_roots = 0 let g:gutentags_project_root = ['.git'] let g:gutentags_cache_dir = expand('$HOME/.vim/tags/') let g:gutentags_generate_on_new = 1 let g:gutentags_generate_on_missing = 1 let g:gutentags_generate_on_write = 1 let g:gutentags_generate_on_empty_buffer = 0 let g:gutentags_ctags_extra_args = [ \ '--tag-relative=no', \ '--fields=+ailmnS', \ '--recurse', \ '--if0=yes' \ ] " Automatically detect style file and apply style to formatting let g:clang_format#detect_style_file = 1 " Additional trigger not required with deoplete let g:tmuxcomplete#trigger = '' " Default indentations autocmd BufRead,BufNewFile */gst-*/*.[ch] set et sw=2 autocmd BufRead,BufNewFile */gstreamer-*/*.[ch] set et sw=2 autocmd BufRead,BufNewFile */pulseaudio/*.[ch] set et sw=4 tw=128 " Spell Checking autocmd BufRead,BufNewFile *.md,*.txt setlocal spell spelllang=en_uk " For swoop let g:swoopUseDefaultKeyMap = 0 let g:swoopPatternSpaceInsertsWildcard = 0 let g:swoopAutoInsertMode = 0 let g:swoopWindowsVerticalLayout = 1 nmap os :call Swoop() vmap os :call SwoopSelection() nmap om :call SwoopMulti() vmap om :call SwoopMultiSelection() " CScope & fzf integration " Taken from https://gist.github.com/amitab/cd051f1ea23c588109c6cfcb7d1d5776 " However, the above gist has completely wrong mappings function! Cscope(option, query) let color = '{ x = $1; $1 = ""; z = $3; $3 = ""; printf "\033[34m%s\033[0m:\033[31m%s\033[0m\011\033[37m%s\033[0m\n", x,z,$0; }' let opts = { \ 'source': "cscope -dL" . a:option . " " . a:query . " | awk '" . color . "'", \ 'options': ['--ansi', '--prompt', '> ', \ '--multi', '--bind', 'alt-a:select-all,alt-d:deselect-all', \ '--color', 'bw'], \ 'down': '40%' \ } function! opts.sink(lines) let data = split(a:lines) let file = split(data[0], ":") execute 'e ' . '+' . file[1] . ' ' . file[0] endfunction call fzf#run(opts) endfunction function! CscopeQuery(option) call inputsave() if a:option == '9' let query = input('Assignments to: ') elseif a:option == '3' let query = input('Functions calling: ') elseif a:option == '2' let query = input('Functions called by: ') elseif a:option == '6' let query = input('Egrep: ') elseif a:option == '7' let query = input('File: ') elseif a:option == '1' let query = input('Definition: ') elseif a:option == '8' let query = input('Files #including: ') elseif a:option == '0' let query = input('C Symbol: ') elseif a:option == '4' let query = input('Text: ') else echo "Invalid option!" return endif call inputrestore() if query != "" call Cscope(a:option, query) else echom "Cancelled Search!" endif endfunction nnoremap ss :call Cscope('0', expand('')) nnoremap sg :call Cscope('1', expand('')) nnoremap sd :call Cscope('2', expand('')) nnoremap sc :call Cscope('3', expand('')) nnoremap st :call Cscope('4', expand('')) nnoremap se :call Cscope('6', expand('')) nnoremap sf :call Cscope('7', expand('')) nnoremap si :call Cscope('8', expand('')) nnoremap sa :call Cscope('9', expand('')) nnoremap ss :call CscopeQuery('0') nnoremap sg :call CscopeQuery('1') nnoremap sd :call CscopeQuery('2') nnoremap sc :call CscopeQuery('3') nnoremap st :call CscopeQuery('4') nnoremap se :call CscopeQuery('6') nnoremap sf :call CscopeQuery('7') nnoremap si :call CscopeQuery('8') nnoremap sa :call CscopeQuery('9')