set shell=/usr/bin/bash let $SHELL="/usr/bin/bash" " ----------------------------------------------------------------------------- " PLUGINS " ----------------------------------------------------------------------------- if ! filereadable(expand('~/.config/nvim/autoload/plug.vim')) echo "Downloading junegunn/vim-plug to manage plugins..." silent !mkdir -p ~/.config/nvim/autoload/ silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim endif let g:coc_global_extensions=[ \ 'coc-pyright', \ 'coc-git', \ 'coc-tsserver', \ 'coc-diagnostic', \ 'coc-yaml', \ 'coc-explorer', \ ] call plug#begin('~/.config/nvim/plugged') " tools Plug 'neoclide/coc.nvim', {'branch': 'release'} Plug 'junegunn/fzf', {'dir': '~/.fzf', 'do': './install --all'} Plug 'junegunn/fzf.vim' Plug 'antoinemadec/coc-fzf', {'branch': 'master'} Plug 'sheerun/vim-polyglot' " language syntax Plug 'tpope/vim-abolish' " better search replace " git Plug 'tpope/vim-fugitive' " markdown Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() } } Plug 'plasticboy/vim-markdown' " markdown helper. Plug 'godlygeek/tabular' " helpers Plug 'tpope/vim-repeat' Plug 'tpope/vim-commentary' " commenting tool Plug 'tpope/vim-surround' " parentheses helper Plug 'mbbill/undotree' " Persistent undo Plug 'farmergreg/vim-lastplace' " When reopen a buffer, puts the cursor where it was last time Plug 'haya14busa/vim-asterisk' " better asterisk motions Plug 'tpope/vim-unimpaired' Plug 'tpope/vim-sensible' Plug 'dkarter/bullets.vim' " python Plug 'tmhedberg/SimpylFold' " tmux Plug 'christoomey/vim-tmux-navigator' " integrate movement in tmux and vim " aesthetics Plug 'chriskempson/base16-vim' " base16 themes Plug 'chrisbra/Colorizer' " show color codes Plug 'junegunn/rainbow_parentheses.vim' " colorize parentheses Plug 'junegunn/goyo.vim' " themes Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'junegunn/seoul256.vim' Plug 'sainnhe/gruvbox-material' Plug 'skbolton/embark' call plug#end() " ----------------------------------------------------------------------------- " SETTINGS " ----------------------------------------------------------------------------- " colors if filereadable(expand("~/.vimrc_background")) let base16colorspace=256 source ~/.vimrc_background endif if $TERM =~ '^\(rxvt\)\(-.*\)\?$' set notermguicolors else set termguicolors endif " Transparent Background (For i3 and compton) highlight Normal guibg=NONE ctermbg=NONE highlight LineNr guibg=NONE ctermbg=NONE " seoul256 theme config (dark 233-239, light 252-256) let g:seoul256_background=233 colo seoul256 " colo base16-tomorrow-night " colo gruvbox-material " statusline set cmdheight=2 let g:airline_powerline_fonts=1 "let g:airline_theme='molokai' "let g:airline_theme='qwq' "let g:airline_theme='badwolf' "let g:airline_theme='silver' "let g:airline_theme='raven' let g:airline_theme='base16_gruvbox_dark_hard' let g:airline#extensions#tabline#enabled=1 let g:airline#extensions#tabline#show_splits=0 let g:airline#extensions#tabline#show_tabs=0 let g:airline#extensions#tabline#show_buffers=1 let g:airline#extensions#tabline#switch_buffers_and_tabs=0 let g:airline#extensions#tabline#formatter = 'unique_tail_improved' " temporary files and undo set directory=/tmp//,. set backupdir=/tmp//,. set undodir=~/.vim/undo/ set noswapfile set nowritebackup set undofile " Persistent undo set undolevels=500 " Maximum number of changes that can be undone set undoreload=5000 " Maximum number lines to save for undo on a buffer reload " search set ignorecase " Case insensitive search set smartcase " ... but case sensitive when uc present " cursor set scrolljump=1 " Line to scroll when cursor leaves screen " buffers set splitright " Puts new vsplit windows to the right of the current set splitbelow " Puts new split windows to the bottom of the current set hidden " Allow buffer switching without saving " buffer set nowrap " Do not wrap long lines set cursorline " Highlight current line set number " Line numbers on " parentheses set showmatch " Show matching brackets/parentthesis set matchtime=5 " Show matching time " files and encodings set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set fileformats=unix,dos,mac " indentation set smartindent " folds set foldmethod=indent set foldlevel=2 set foldnestmax=10 set nofoldenable let g:SimpylFold_docstring_preview = 1 let g:SimpylFold_fold_docstring = 1 " zm/M zr/R increase/increase foldlevel (max) " zo/O zc/C open / close fold (max) " za zA switch fold (small/full) " zi toggle folds " zi zj move to next / prev fold " tabs set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab " other set lazyredraw set updatetime=300 set timeoutlen=500 set conceallevel=2 let g:BASH_Ctrl_j='off' " avoid 'C-j' being overridden to newline let g:BASH_Ctrl_l='off' " avoid 'C-l' being overridden to newline highlight clear SignColumn " SignColumn should match background set shortmess=atOI " No help Uganda information, and overwrite read messages to avoid PRESS ENTER prompts set listchars=tab:→\ ,trail:·,extends:↷,precedes:↶,nbsp:+ " eol:↵ set fillchars=vert:│,stl:\ ,stlnc:\ set clipboard+=unnamedplus set list " ----------------------------------------------------------------------------- " KEYBINDS " ----------------------------------------------------------------------------- " ***************************** " MAPPING let mapleader="\" set pastetoggle= nmap r :so ~/.config/nvim/init.vim nmap e :tabe ~/OneDrive/dotfiles/nvim/init.vim nmap l :tabe ~/OneDrive/Notes/libs.md nmap u :tabe ~/OneDrive/Notes/urls.md nmap c :tabe ~/OneDrive/Notes/cheatsheet.md nmap t :tabe ~/OneDrive/Notes/todos.md nmap n :Explore ~/OneDrive/Notes nmap d :Explore ~/OneDrive/dotfiles nmap w :cd %:p:h " vim-surround: visual 'SA' to wrap in A. Surround 'csAB' to change from A to B, 'dsA' to remove A. Word 'ysiwA' to wrap with A " ***************************** " REMAPPING set langmap=å(,¨),Å{,^},Ø\\;,ø:,æ^,+$ nnoremap æ " vnoremap æ " nnoremap Æ @ vnoremap Æ @ nnoremap ÆÆ @@ vnoremap ÆÆ @@ vnoremap v nmap :noh " ***************************** " UNMAPPING nnoremap q: nnoremap Q " ***************************** " TERMINAL tmap tmap nmap :terminal " ***************************** " SEARCH set wildignorecase set wildignore+=*swp,*.class,*.pyc,*.png,*.jpg,*.gif,*.zip set wildignore+=*/tmp/*,*.o,*.obj,*.so " Unix set wildignore+=*\\tmp\\*,*.exe " Windows function! EnterSubdir() call feedkeys("\", 't') return '' endfunction cnoremap cnoremap cnoremap cnoremap EnterSubdir() map * (asterisk-z*) map g* (asterisk-gz*) map g# (asterisk-z#) map gz# (asterisk-gz#) let g:asterisk#keeppos=1 " ***************************** " CURSOR " stay visual when indenting vnoremap >gv vnoremap (coc-diagnostic-prev) nmap (coc-diagnostic-next) " GoTo code navigation nmap (coc-git-prevchunk) nmap (coc-git-nextchunk) nmap gd (coc-definition) nmap gr (coc-references) " nmap gy (coc-type-definition) " nmap gi (coc-implementation) " nmap gD (coc-declaration) " ***************************** " WINDOWS / BUFFERS let g:tmux_navigator_no_mappings=1 nmap :TmuxNavigateLeft:call CleanEmptyBuffers() nmap :TmuxNavigateDown:call CleanEmptyBuffers() nmap :TmuxNavigateUp:call CleanEmptyBuffers() nmap :TmuxNavigateRight:call CleanEmptyBuffers() " make splits and tabs nnoremap :vnew nnoremap :new nnoremap :tabe % nnoremap :tabnew " buffers and tabs nmap :bprev:call CleanEmptyBuffers() nmap :bnext:call CleanEmptyBuffers() nmap :tabprev nmap :tabnext " resize windows with hjkl nnoremap < nnoremap - nnoremap + nnoremap > " quickfix window nmap :cp nmap :cn " remove buffer nmap :enew:bd# nmap :enew:bd!# " close window nmap :q " goyo let g:goyo_linenr=1 let g:goyo_width="140" let g:goyo_height="100%" nmap :Goyo " ***************************** " GIT nmap (coc-git-chunkinfo) nmap :CocCommand git.chunkStage vmap :CocCommand git.chunkStage nmap :CocCommand git.chunkUndo vmap :CocCommand git.chunkUndo " ***************************** " EXPLORERS " coc-explorer map :CocCommand explorer " vim-fugitive " g? for fugitive help. :Gdiff, :Gblame, :Gstats '=' expand, '-' add/reset changes, :Gcommit % to commit current file with messag map :vertical Git:vertical resize 60 map :UndotreeToggle:UndotreeFocus " ***************************** " POPUPS " Grep function function! RipgrepFzf(query, fullscreen) let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case -- %s || true' let initial_command = printf(command_fmt, shellescape(a:query)) let reload_command = printf(command_fmt, '{q}') let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]} call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen) endfunction command! -nargs=* -bang RG call RipgrepFzf(, 0) "command! -bang -nargs=* Ag call fzf#vim#ag(, {'options': '--delimiter : --nth 4..'}, 0) let g:fzf_preview_command='bat --color=always --plain {-1}' " Installed bat let g:fzf_preview_grep_cmd='rg --smart-case --line-number --no-heading --color=never' " shortcuts nmap :Colors nmap :CocFzfList nmap (coc-rename) nmap (coc-refactor) xmap (coc-format-selected) nmap (coc-format-selected) nmap :CocDiagnostics nmap :Commits nmap :BCommits nmap :Buffers nmap :RG nmap :GFiles? nmap :History nmap :Files nmap :GFiles nmap :Filetypes " ***************************** " COC CONFIGS " coc menus let g:coc_node_path='/usr/bin/node' function! s:check_back_space() abort let col=col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction imap \ pumvisible() ? "\" : \ check_back_space() ? "\" : \ coc#refresh() imap pumvisible() ? "\" : "\" imap coc#refresh() " Use K to show documentation in preview window. nnoremap K :call show_documentation() function! s:show_documentation() if (index(['vim','help'], &filetype) >= 0) execute 'h '.expand('') elseif (coc#rpc#ready()) call CocActionAsync('doHover') else execute '!' . &keywordprg . " " . expand('') endif endfunction " coc hint scrolling nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" " ***************************** " MARKDOWN " vim-markdown let g:vim_markdown_new_list_item_indent=0 let g:vim_markdown_auto_insert_bullets=0 let g:vim_markdown_conceal=1 let g:vim_markdown_conceal_code_blocks=1 let g:vim_markdown_math=1 let g:vim_markdown_folding_disabled=0 " markdown preview let g:mkdp_auto_start=0 " auto start on moving into let g:mkdp_auto_close=0 " auto close on moving away let g:mkdp_open_to_the_world=0 " available to others let g:mkdp_open_ip='' " use custom IP to open preview page let g:mkdp_preview_options={ \ 'disable_sync_scroll': 0, \ 'sync_scroll_type': 'middle', \ 'hide_yaml_meta': 1 \ } " disable_sync_scroll: if disable sync scroll, default 0 " sync_scroll_type: 'middle', 'top' or 'relative' " hide_yaml_meta: if hide yaml metadata, default is 1 " ***************************** " autocmd function! CleanEmptyBuffers() let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")') if !empty(buffers) exe 'bw ' . join(buffers, ' ') endif endfunction augroup myAu " A unique name for the group. DO NOT use the same name twice! autocmd! autocmd FileType python set tabstop=4 softtabstop=4 shiftwidth=4 autocmd FileType markdown,yaml set tabstop=2 softtabstop=2 shiftwidth=2 autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o " Disables automatic commenting on newline autocmd FileType * RainbowParentheses() autocmd BufEnter * if &filetype == "" | setlocal ft=none | endif " default new file is none autocmd BufWritePre * %s/\s\+$//e " Automatically deletes all trailing whitespace on save. autocmd BufReadPost quickfix nmap " quickfix autocmd CompleteDone * if pumvisible() == 0 | pclose | endif " bugfix autocmd BufNewFile,BufRead *.cfg set syntax=cfg augroup end " CTRL-A CTRL-Q to select all and build quickfix list function! s:build_quickfix_list(lines) call setqflist(map(copy(a:lines), '{ "filename": v:val }')) copen cc endfunction let g:fzf_action = { \ 'ctrl-q': function('s:build_quickfix_list'), \ 'ctrl-t': 'tab split', \ 'ctrl-s': 'split', \ 'ctrl-v': 'vsplit' } let $FZF_DEFAULT_OPTS = '--bind ctrl-a:select-all'