" This file is inspired by spf13's vimrc " My settings {{{ filetype on " required! filetype plugin indent on " Automatically detect file types. " set selection=exclusive " Do not inlcude char under cursor while doing visual selection set nu " Line numbers on set expandtab " Tabs are spaces, not tabs set shiftwidth=0 " Use indents of 4 spaces set softtabstop=0 " Let backspace delete indent set tabstop=2 " An indentation every four columns set path=., set autoindent " Indent at the same level of the previous line set backspace=indent,eol,start " Backspace for dummies set clipboard=unnamedplus set cursorline " Highlight current line set foldlevel=99 set foldmethod=indent set hidden " Allow buffer switching without saving set history=1000 " Store a ton of history (default is 20) set hlsearch " Highlight search terms set ignorecase " Case insensitive search set linespace=0 " No extra spaces between rows set list set listchars=tab:›\ ,trail:•,extends:#,nbsp:. " Highlight problematic whitespace set mouse=a set nocompatible " be iMproved set noincsearch set noswapfile set scrolljump=1 " Lines to scroll when cursor leaves screen set scrolloff=0 " Minimum lines to keep above and below cursor set showmatch " Show matching brackets/parenthesis set showmode " Display the current mode set smartcase " Case sensitive when uc present set spell " Spell checking on set title set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too set wildmenu " Show list instead of just completing set wildmode=list:longest,full " Command completion, list matches, then longest common part, then all. set winminheight=0 " Windows can be 0 line high set wrap syntax on let javaScript_fold=0 " JavaScript let perl_fold=1 " Perl let r_syntax_folding=1 " R let ruby_fold=1 " Ruby let sh_fold_enabled=1 " sh let vimsyn_folding='af' " Vim script let $FZF_DEFAULT_COMMAND='ag -ig ""' let g:gruvbox_contrast_dark = 'dark' let g:netrw_browse_split = 2 au BufEnter *.js.ejs set ft=javascript.ejs au BufEnter *.cir set ft=spice au BufEnter *.dart set ft=dart au BufEnter *.sshconf set ft=sshconfig " Disable python linting autocmd VimEnter *.py SyntasticToggleMode " Syntax based folding found be slow. In most of the cases, we will do indenting according to syntax. autocmd FileType java set foldmethod=indent autocmd FileType html set foldmethod=indent autocmd FileType javascript set foldmethod=indent autocmd FileType xml set foldmethod=indent " % key will be mapped by MatchTag plugin to match HTML tags. " It is not need on php file " autocmd FileType php unmap % " }}} " for JavaScript {{{ " add '@' symbol as a valid char for js filename ( eg: '@mymodule/xyz' ) autocmd FileType javascript set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,@-@ autocmd FileType typescript set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=,@-@ " if we press 'gf' under require('abc/xyz'), then also sarch for ./abs/xyz.js function! LoadMainNodeModule(fname) return systemlist("node -p 'require.resolve(\"" . a:fname . "\")'")[0] endfunction autocmd FileType javascript set includeexpr=LoadMainNodeModule(v:fname) autocmd FileType typescript set includeexpr=LoadMainNodeModule(v:fname) autocmd FileType vue set includeexpr=LoadMainNodeModule(v:fname) " autocmd FileType vue set ft=vue.html " }}} " Load tempate autocmd BufNewFile *.vue if &modifiable | execute('0r ~/.config/nvim/templates/template.vue') | endif autocmd BufNewFile *.test.js if &modifiable | execute('0r ~/.config/nvim/templates/template.test.js')| endif autocmd BufNewFile *.js if &modifiable | execute('Header') | endif " for java {{{ autocmd BufRead *.java set include=^#\s*import autocmd BufRead *.java set includeexpr=substitute(v:fname,'\\.','/','g') autocmd BufRead *.java set suffixesadd=.java,.xml autocmd BufRead *.ect set suffixesadd=.ect ft=html.ect " For Nunjucks templates autocmd BufRead *.njk set ft=jinja autocmd BufEnter *.gradle set ft=groovy " }}} " Disable setting jsx syntax for *.js files let g:jsx_pragma_required=1 " Session List {{{ set sessionoptions=blank,buffers,curdir,tabpages,winsize,resize,winpos " }}} autocmd FileType go nmap p :GoFmt let g:syntastic_go_checkers = ['gofmt'] " for JavaScript syntax checking {{{ let g:syntastic_always_populate_loc_list = 1 let g:syntastic_javascript_checkers = ['eslint'] let g:syntastic_javascript_checkers = ['eslint'] " }}} " set lazyredraw " let g:sparkupNextMapping = '' let g:user_emmet_mode='inv' "enable all functions, which is equal to let g:user_emmet_install_global = 0 autocmd FileType html,css,vue,jsx,php EmmetInstall imap (emmet-expand-abbr) " let g:user_emmet_leader_key='' " Ctrl-p will open fuzzy file search using fzf plugin. These are the shortcuts available in fzf window let g:fzf_action = { \ 'ctrl-t': 'tab split', \ 'ctrl-x': 'split', \ 'ctrl-v': 'vsplit' } let nvim_conf_root = expand(':p:h') . '/' " Enable jsdoc comments Highlight for javascript let g:javascript_plugin_jsdoc = 1 let g:MacroManagerDir = g:nvim_conf_root . 'macros' let g:tcomment_maps = 0 vmap c :TComment vmap cs :TCommentBlock nmap c :TComment nmap cs :TCommentBlock call plug#begin( ) " Bsic set of plugins { Plug 'jamessan/vim-gnupg' Plug 'SirVer/ultisnips' Plug 'honza/vim-snippets' " Plug 'rstacruz/sparkup' " HTML zen-coding helper Plug 'mattn/emmet-vim' Plug 'tomtom/tcomment_vim' " Code commenting uncommenting Plug 'tpope/vim-surround' " quickly Insert/remove/change quote/brackes any vim selection. Plug 'harish2704/harish2704-vim' " My utilities to move widows around tabs Plug 'junegunn/fzf' Plug 'junegunn/fzf.vim' " Ctrl-p Quick file search Plug 'wsdjeg/vim-fetch' Plug 'mbbill/undotree' " Visualize undo history " Plug 'bogado/file-line' " Open file:linenumber " } " " Extra utilities { Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " Autocompletion Plug 'vim-scripts/sessionman.vim' " Session manager. Manage projects Plug 'scrooloose/syntastic' " Syntax checking pluin Plug 'vim-scripts/DoxygenToolkit.vim' " Quickly create Doxygent style comments Plug 'godlygeek/tabular' " Tabularize Text Plug 'tpope/vim-fugitive' " For Git repo management. Plug 'spf13/vim-autoclose' " Autoclose brackets/quotes etc Plug 'chrisbra/NrrwRgn' " Edit a portion file as different buffer Plug 'prettier/vim-prettier', { 'do': 'yarn install', 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'yaml', 'html'] } " Plug 'easymotion/vim-easymotion' " } " " Langualge plugins{ if has('nvim') Plug 'iamcco/markdown-preview.nvim', { 'for': 'markdown', 'do': 'cd app & yarn install' } Plug 'mhartington/nvim-typescript' , { 'for': [ 'javascript.ts'] } else Plug 'roxma/vim-hug-neovim-rpc' Plug 'roxma/nvim-yarp' endif Plug 'rust-lang/rust.vim', { 'for': 'rust'} Plug 'pangloss/vim-javascript', " { 'for': 'javascript'} Plug 'mxw/vim-jsx' , { 'for': [ 'jsx'] } Plug 'leafOfTree/vim-vue-plugin' , { 'for': ['vue']} Plug 'AndrewRadev/vim-eco', { 'for': [ 'ect', 'eco' ] } Plug 'Glench/Vim-Jinja2-Syntax', { 'for': [ 'html', 'jinja', 'njk' ] } Plug 'kchmck/vim-coffee-script', { 'for': 'coffee' } Plug 'digitaltoad/vim-jade', { 'for': 'jade' } Plug 'mustache/vim-mustache-handlebars', { 'for': 'handlebars' } Plug 'briancollins/vim-jst', { 'for': 'jst' } Plug 'evanleck/vim-svelte', { 'for': 'svelte' } Plug 'tikhomirov/vim-glsl', { 'for': 'glsl' } Plug 'ollykel/v-vim', { 'for': 'vlang' } Plug 'editorconfig/editorconfig-vim' Plug 'dart-lang/dart-vim-plugin', { 'for': 'dart' } Plug 'thosakwe/vim-flutter', { 'for': 'dart' } Plug 'fatih/vim-go', { 'for': 'go', 'do': ':GoUpdateBinaries' } Plug 'pantharshit00/vim-prisma', { 'for': 'prisma' } " } " Other rarely used / untested plugins{ " Plug 'kshenoy/vim-signature' " Show markers in the margin " Plug 'chrisbra/Colorizer' " A plugin to color colornames and codes " Plug 'sjl/gundo.vim' " Visualize undo tree " Plug 'brooth/far.vim' " Interactive Fine & replace on multiple files " Plug 'Lokaltog/vim-easymotion' " Quick cursor movement to any where in the screen " Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeFind' } " File tree " Plug 'git://github.com/maxbrunsfeld/vim-yankstack.git' " Clipboard histroy management. " Plug 'Yggdroot/indentLine' " Plug 'majutsushi/tagbar' " Plug 'Shougo/vimproc.vim' " Plug 'vim-scripts/matchit.zip' " Plug 'tomasr/molokai' " A beautiful colorscheme " Plug 'morhetz/gruvbox' " Plug 'tyru/open-browser.vim' " Plug 'Valloric/MatchTagAlways' " Plug 'bogado/file-line' " Plug 'dohsimpson/vim-macroeditor' " Edit macros in split window " Plug 'low-ghost/vim-macro-manager' " Manage / save Macros " Plug 'HerringtonDarkholme/yats.vim' " Typescript language plugin " Plug 'Shougo/context_filetype.vim' " } call plug#end() " enable deoplete at start up let g:deoplete#enable_at_startup = 1 " Open edit snippets in vertial tab let g:UltiSnipsEditSplit="vertical" let g:UltiSnipsJumpForwardTrigger="" let g:UltiSnipsJumpBackwardTrigger="" " Ctrl-p opens fuzzy file search nmap :Files " Ctrl-b opens current buffers list nmap :Buffers colorscheme molokai " Neovim specific settings " Switch tabs using Alt-1..9 map ± 1gt map ² 2gt map ³ 3gt map ´ 4gt map µ 5gt map ¶ 6gt map · 7gt map ¸ 8gt " Ctrl-l -> Go to end of line imap " Replace grep with silver-searcher " silver-searcher or 'ag' command is much faster than grep command. So use ag command instead of grep command for 'vimgrep' set grepprg=ag\ --nogroup\ --nocolor " set grepprg=grep\ -n\ $*\ /dev/null " Ctrl-Enter on normal mode -> Jump to definition using Tern " autocmd BufEnter *.js nmap :TernDefSplit " Ctrl-/ on normal mode -> Grep word under cursor ( Recursive ) nmap  :Gr nmap :Gr " Open the version of current file using fugitive, where is the string in clipboard. " Eg: copy sha id of git commit to clip board. then press '\go' which open old " version of current file in vsplit using fugitive nmap go :Gvsplit +:% " Open error list. By default, Syntax checking plugin ( syntastic ) will emit errors to vim's error list nmap co :copen nmap cc :cclose nmap lo :lopen nmap lc :lclose " When opening any items in location list, Try current window, othertabs, then new tab set switchbuf=useopen,usetab,newtab " Ctrl-Shift-T -> Open new tab nmap :tabedit " Ctrl-S to save file {{{ nmap :w vmap gv imap " }}} " '\\es' or 'es' Open vimrc in a new tab if has('nvim') execute( 'nmap es :tabedit '. g:nvim_conf_root .'init.vim ' ) else execute( 'nmap es :tabedit '. $MYVIMRC .' ' ) endif " '\\en' 'en' Open current file's snippets file in a new tab nmap en :execute 'OpenSnippets' " for moving tab {{{ " Ctrl-Shift + Page-Up/Down to rearrange tab nmap :execute 'tabmove ' . (tabpagenr()-2 ) nmap :execute 'tabmove ' . ( tabpagenr()+1 ) nmap :execute 'tabmove ' . (tabpagenr()-2 ) nmap :execute 'tabmove ' . ( tabpagenr()+1 ) " Ctrl-Shift + j/k to move current window in to nearby tab {{{ nmap :execute 'Mt' . (tabpagenr() -1) nmap :execute 'Mt' . (tabpagenr() +1) nmap :execute 'Mt' . (tabpagenr() -1) nmap :execute 'Mt' . (tabpagenr() +1) " }}} " \tr Reset shiftwidth to default value 2 nmap tr :set tabstop=2 " \tt Toggle tab and spaces nmap tt :let &expandtab=!&expandtab " \tj Incraese additional two spaces width for tab nmap tj :let &tabstop=&tabstop-2\|echo 'tabstop=' &tabstop " \tj Decreases two spaces width for tab nmap tk :let &tabstop=&tabstop+2\|echo 'tabstop=' &tabstop " }}} " Session handling {{{ " List saved sessions nmap sl :SessionList " Save and close current session nmap sc :SessionClose " }}} " Ctrl-Enter in insert mode will append ';' to the line and insert a new line imap A; " Ctrl-Enter in normal mode will jump to tag definition using cscope " nmap :vert scs f g " Ctrl-? in normal mode will jump to tag references using cscope " nmap :vert scs f t " Alt + Arrows to Moving cursor to different windows {{{ nmap k nmap j nmap l nmap h " }}} " For terminal mod {{{ tmap tmap tmap k tmap j tmap l tmap h " }}} " For Terminal mode Alt + [1-8] to Switch tabs {{{ tmap 1gt tmap 2gt tmap 3gt tmap 4gt tmap 5gt tmap 6gt tmap 7gt tmap 8gt " }}} " For terminal mod {{{ tmap tmap " }}} "for easy quote/unquote {{{ " \\ + a[add] / d[delete] + q[single quote] / Q [Double quote] " \\dQ remove double quote nmap dQ ds" " \\dQ add double quote nmap aQ ysiw" " \\dQ remove single quote nmap dq ds' " \\dQ remove double quote nmap aq ysiw' " In insert mode, will quote current word imap maysiw"`aa " In insert mode, will quote current word with double quotes imap maysiw'`ai " }}} " format JSON {{{ nmap jt :%!python -m json.tool:set filetype=json " }}} " Alt + [1-8] to Switch tabs {{{ map 1gt map 2gt map 3gt map 4gt map 5gt map 6gt map 7gt map 8gt " }}} " NerdTree {{{ nmap ac ToggleAutoCloseMappings map :NERDTreeToggle:NERDTreeMirror map e :NERDTreeFind nmap nt :NERDTreeFind " }}} " For Open a terminal in current directory nmap t :!xdg-terminal& " Open git-gui in current pwd nmap g :!git gui & " -> Reload current file nmap :e! " Alt-q Delete current buffer ( Close file ) nmap :bd " force Close buffer nmap :bd! " Select a word and press Ctrl-h to replace all its occurance, even if the word is having special chars vmap "fy:%s#f# " Copy current word to 'f' register, search for that word vmap "fy/f " set guicursor=n-c:block,i-ci-ve:ver40,r-cr-v:hor20,o:hor50,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor,sm:block-blinkwait175-blinkoff150-blinkon175 set termguicolors " command! -register CopyMatches call CopyMatches() command! -register -range=% Unretab ,call Unretab() " My custom commands {{{ imap ; imap , imap " Grep for a word and open the result in errorlist command! -nargs=+ Gr :silent execute 'grep! -nr "" | copen' " Raw version of Gr command. command! -nargs=* Grc grep -nr " Add file header to current buffer. Depends on https://github.com/harish2704/file-header command! Header :execute '0r!file-header %' " Open Terminal in split window command! Termw :execute '!konsole -e bash-session &' command! Term :execute 'sp | term' " Cd to current file's directory command! Cwd :execute 'cd %:p:h' " Cd to current file's directory, but limit to current tab command! Tcd :execute ':tcd %:p:h' " Reload current buffer command! Reload :execute "bufdo execute 'checktime . bufnr('%')'" " Delete current file and close buffer command! Rm :execute '!rm %' | bd " Copy current file path to unnamedplus register command! CopyFilename :let @+=@% " Open vscode in on current line command! Code :execute "!code ./ -g %:". ( line('.')+1 ) " }}} function! CopyMatches(reg) let hits = [] %s//\=len(add(hits, submatch(0))) ? submatch(0) : ''/gne let reg = empty(a:reg) ? '+' : a:reg execute 'let @'.reg.' = join(hits, "\n") . "\n"' endfunction function! Unretab() range execute a:firstline . "," . a:lastline . 's/ \{1,' . &tabstop . '}/\t/g' endfunction