dotfiles/nvim/init.vim
Sanchayan Maity 3bdc90b523 nvim: init.vim: Enable ghcid
When we enabled ghcid before it did not work as we did not
set the command which it should use for starting ghcid. Fixed
now and it is working awesome!!!
2019-11-04 10:12:38 +05:30

419 lines
14 KiB
VimL

" 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 <leader><leader>(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' }
" 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 'tpope/vim-repeat'
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'] }
Plug 'pelodelfuego/vim-swoop'
" Initialize plugin system
call plug#end()
syntax on
filetype plugin indent on
" Set up leaders
let mapleader="\<SPACE>"
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 <C-L> to clear the highlighting of :set hlsearch.
if maparg('<C-L>', 'n') ==# ''
nnoremap <silent> <C-L> :nohlsearch<CR><C-L>
endif
"nnoremap ; : " Use ; for commands.
"nnoremap Q @q " Use Q to execute default register.
" Plug shortcuts
nnoremap <Leader>pg :PlugUpgrade<CR>
nnoremap <Leader>pd :PlugUpdate<CR>
nnoremap <Leader>pc :PlugClean<CR>
" Open NerdTree
nnoremap <Leader>ee :NERDTree<CR>
" For fzf
nnoremap <Leader>vf :Files<CR>
nnoremap <Leader>vg :GFiles<CR>
nnoremap <Leader>vb :Buffers<CR>
nnoremap <Leader>vL :Lines<CR>
nnoremap <Leader>vl :BLines<CR>
nnoremap <Leader>vt :Tags<CR>
nnoremap <Leader>vc :Bcommits<CR>
nnoremap <Leader>va :Commits<CR>
" Use ripgrep to search for content in files
nnoremap <Leader>/ :Rg<CR>
" Save
nnoremap <Leader>w <Esc>:w<CR>
" Search and Replace
nnoremap <Leader>sr :%s//g<Left><Left>
" Quit
nnoremap <Leader>q <Esc>:q<CR>
" Search for the word under cursor
noremap <Leader>d :exe ':Rg ' . expand('<cword>')<CR>
" Open terminal
nnoremap <Leader>te :vsp<CR> :terminal<CR>
" Tab navigation shortcuts
nnoremap <Leader>tn :bn<CR>
nnoremap <Leader>tp :bp<CR>
" Reload opened vim config file
nnoremap <Leader>vr :so %<CR>
" For git
nnoremap <Leader>gm :GitMessenger<CR>
nnoremap <Leader>gl :Glog<CR>
nnoremap <Leader>gd :Gdiffsplit<CR>
nnoremap <Leader>gs :Gstatus<CR>
nnoremap <Leader>gc :Gcommit --signoff<CR>
nnoremap <Leader>gp :Git! push<CR>
nnoremap <Leader>gu :Git! push -u
nnoremap <Leader>gr :Git! remote -v<CR>
" For Cscope
nnoremap <Leader>cr :cs reset<CR>
" For Neomake
nnoremap <Leader>nm :Neomake<CR>
nnoremap <Leader>nr :NeomakeClean<CR>
nnoremap <Leader>ns :NeomakeSh
nnoremap <Leader>nj :NeomakeListJobs<CR>
nnoremap <Leader>nca :NeomakeCancelJobs<CR>
nnoremap <Leader>ncj :NeomakeCancelJob
" Quickfix
nnoremap <Leader>fn :cnext<CR>
nnoremap <Leader>fp :cprevious<CR>
nnoremap <Leader>fo :copen<CR>
nnoremap <Leader>fc :cclose<CR>
" Location
nnoremap <Leader>ffn :lnext<CR>
nnoremap <Leader>ffp :lprevious<CR>
nnoremap <Leader>ffo :lopen<CR>
nnoremap <Leader>ffc :lclose<CR>
" Key Bindings to help with terminal mode
:tnoremap <Esc> <C-\><C-n>
" Key bindings to move between window splits
nnoremap <A-h> <C-w>h
nnoremap <A-j> <C-w>j
nnoremap <A-k> <C-w>k
nnoremap <A-l> <C-w>l
" Disable Arrow Keys
inoremap <Up> <NOP>
inoremap <Down> <NOP>
inoremap <Left> <NOP>
inoremap <Right> <NOP>
noremap <Up> <NOP>
noremap <Down> <NOP>
noremap <Left> <NOP>
noremap <Right> <NOP>
augroup deopleteMaps
au!
" For deoplete Rust
au FileType rust nmap <buffer> <Leader>rd <plug>DeopleteRustGoToDefinitionDefault
au FileType rust nmap <buffer> <Leader>rc <plug>DeopleteRustShowDocumentation
au FileType rust nmap <buffer> <Leader>rv <plug>DeopleteRustGoToDefinitionVSplit
au FileType rust nmap <buffer> <Leader>rh <plug>DeopleteRustGoToDefinitionSplit
au FileType rust nmap <buffer> <Leader>rt <plug>DeopleteRustGoToDefinitionTab
augroup END
augroup rainbow_lisp
autocmd!
autocmd FileType lisp,clojure,scheme RainbowParentheses
augroup END
" Starts the REPL.
autocmd FileType scheme nnoremap <buffer> <Leader>rc :SchemeConnect<cr>
" Evaluates the outer most / top level form and jumps the cursor back to where it was.
autocmd FileType scheme nnoremap <buffer> <Leader>re :normal mscpaF<cr>`s
" Evaluates the entire file.
autocmd FileType scheme nnoremap <buffer> <Leader>rf :normal msggcpG<cr>`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'
" 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
" 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 <Leader>os :call Swoop()<CR>
vmap <Leader>os :call SwoopSelection()<CR>
nmap <Leader>om :call SwoopMulti()<CR>
vmap <Leader>om :call SwoopMultiSelection()<CR>
" 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 <silent> <Leader>ss :call Cscope('0', expand('<cword>'))<CR>
nnoremap <silent> <Leader>sg :call Cscope('1', expand('<cword>'))<CR>
nnoremap <silent> <Leader>sd :call Cscope('2', expand('<cword>'))<CR>
nnoremap <silent> <Leader>sc :call Cscope('3', expand('<cword>'))<CR>
nnoremap <silent> <Leader>st :call Cscope('4', expand('<cword>'))<CR>
nnoremap <silent> <Leader>se :call Cscope('6', expand('<cword>'))<CR>
nnoremap <silent> <Leader>sf :call Cscope('7', expand('<cword>'))<CR>
nnoremap <silent> <Leader>si :call Cscope('8', expand('<cword>'))<CR>
nnoremap <silent> <Leader>sa :call Cscope('9', expand('<cword>'))<CR>
nnoremap <silent> <Leader><Leader>ss :call CscopeQuery('0')<CR>
nnoremap <silent> <Leader><Leader>sg :call CscopeQuery('1')<CR>
nnoremap <silent> <Leader><Leader>sd :call CscopeQuery('2')<CR>
nnoremap <silent> <Leader><Leader>sc :call CscopeQuery('3')<CR>
nnoremap <silent> <Leader><Leader>st :call CscopeQuery('4')<CR>
nnoremap <silent> <Leader><Leader>se :call CscopeQuery('6')<CR>
nnoremap <silent> <Leader><Leader>sf :call CscopeQuery('7')<CR>
nnoremap <silent> <Leader><Leader>si :call CscopeQuery('8')<CR>
nnoremap <silent> <Leader><Leader>sa :call CscopeQuery('9')<CR>