" Specify a directory for plugins (for Neovim: ~/.local/share/nvim/plugged) call plug#begin('~/.config/nvim/plugged') " Automatically match brackets as you type Plug 'Raimondi/delimitMate' " 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' " 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' Plug 'sk1418/QFGrep' " 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 'neovimhaskell/haskell-vim', { 'for': [ 'haskell', 'cabal' ] } Plug 'parsonsmatt/intero-neovim' Plug 'neomake/neomake' " 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' } " 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 'editorconfig/editorconfig-vim' Plug 'tpope/vim-eunuch' Plug 'jeetsukumaran/vim-buffergator' Plug 'vim-utils/vim-man' Plug 'unblevable/quick-scope' Plug 'igankevich/mesonic' Plug 'rhysd/vim-clang-format', { 'for': [ 'c', 'cpp'] } " 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 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 n :NERDTree " Open fuzzy file search nnoremap f :Files nnoremap gf :GFiles " Use ripgrep to search for content in files nnoremap / :Rg " Save nnoremap w :w " Search and Replace nmap s :%s//g " Quit nnoremap q :q " Search for the word under cursor noremap d :exe ':Rg ' . expand('') " Open terminal nnoremap te :vsp :terminal " Reload opened vim config file nnoremap vc :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 Cscope nnoremap cu :!cscope -Rbq nnoremap cr :cs reset " 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 h nnoremap j nnoremap k nnoremap l " Disable Arrow Keys inoremap inoremap inoremap inoremap noremap noremap noremap noremap augroup interoMaps au! " Maps for intero. Restrict to Haskell buffers so the bindings don't collide. " Background process and window management au FileType haskell nnoremap is :InteroStart au FileType haskell nnoremap ir :InteroRestart au FileType haskell nnoremap ik :InteroKill " Open intero/GHCi split horizontally au FileType haskell nnoremap io :InteroOpen " Open intero/GHCi split vertically au FileType haskell nnoremap iov :InteroOpenH au FileType haskell nnoremap ih :InteroHide " Reloading (pick one) " Automatically reload on save " au BufWritePost *.hs InteroReload " Manually save and reload au FileType haskell nnoremap wr :w \| :InteroReload " Load individual modules au FileType haskell nnoremap il :InteroLoadCurrentModule au FileType haskell nnoremap if :InteroLoadCurrentFile " Type-related information " Heads up! These next two differ from the rest. au FileType haskell map it InteroGenericType au FileType haskell map T InteroType au FileType haskell nnoremap iit :InteroTypeInsert " Navigation au FileType haskell nnoremap id :InteroGoToDef " Managing targets " Prompts you to enter targets (no silent): au FileType haskell nnoremap ist :InteroSetTargets augroup END 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 " Intero starts automatically. Set this if you'd like to prevent that. let g:intero_start_immediately = 0 " Enable type information on hover (when holding cursor at point for ~1 second). let g:intero_type_on_hover = 1 " Change the intero window size; default is 10. let g:intero_window_size = 75 " Sets the intero window to split vertically; default is horizontal let g:intero_vertical_split = 1 " Use GHCi backend let g:intero_backend = { \ 'command' : 'stack ghci', \ } " 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 vim-gitgutter do its thing on large files let g:gitgutter_max_signs=10000 " 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 " 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 CScope and Quickfix " https://medium.com/@lakshmankumar12/quickfix-and-location-list-in-vim-ca0292ac894d " https://medium.com/@lakshmankumar12/vim-and-cscope-5f4558c8a8b8 function! LoadCscopeToQuickFix(currword, oper) execute "normal mZ" execute "set csqf=" . a:oper . "-" execute "lcs find " a:oper . " " . a:currword execute "lopen" execute "wincmd p" execute "normal `Z" execute "set csqf=" endfunction nnoremap css :call LoadCscopeToQuickFix(expand(""),"s") nnoremap csg :call LoadCscopeToQuickFix(expand(""),"g") nnoremap csc :call LoadCscopeToQuickFix(expand(""),"c")