" Modeline and Notes { " vim: set sw=4 ts=4 sts=4 et tw=78 foldmarker={,} foldlevel=0 foldmethod=marker spell: " " __ __ __ ___ " | \/ |_ _ \ \ / (_)_ __ ___ _ __ ___ " | |\/| | | | | \ \ / /| | '_ ` _ \| '__/ __| " | | | | |_| | \ V / | | | | | | | | | (__ " |_| |_|\__, | \_/ |_|_| |_| |_|_| \___| " |___/ " } " Installed Plugins { call plug#begin() " General { " Navigation { Plug 'unblevable/quick-scope' " } Plug 'bling/vim-bufferline' Plug 'easymotion/vim-easymotion' Plug 'farmergreg/vim-lastplace' Plug 'junegunn/fzf.vim' Plug 'mbbill/undotree' Plug 'mhinz/vim-signify' Plug 'myusuf3/numbers.vim' Plug 'preservim/nerdtree' Plug 'rhysd/conflict-marker.vim' Plug 'terryma/vim-multiple-cursors' Plug 'tpope/vim-abolish' Plug 'tpope/vim-surround' Plug 'vim-airline/vim-airline' " } " Programming { Plug 'airblade/vim-gitgutter' Plug 'alvan/vim-closetag' Plug 'dense-analysis/ale' Plug 'fatih/vim-go' Plug 'godlygeek/tabular' Plug 'neoclide/coc.nvim', {'branch': 'release'} Plug 'rrethy/vim-hexokinase', { 'do': 'make hexokinase' } Plug 'rust-lang/rust.vim' Plug 'sheerun/vim-polyglot' Plug 'tpope/vim-commentary' Plug 'tpope/vim-fugitive' Plug 'tpope/vim-unimpaired' Plug 'Xuyuanp/nerdtree-git-plugin' Plug 'Yggdroot/indentLine' " } " UI { Plug 'gruvbox-community/gruvbox' " This has to be loaded last to work Plug 'ryanoasis/vim-devicons' " } call plug#end() " } " General { colorscheme gruvbox " Set colour scheme set clipboard=unnamed,unnamedplus " Use + register for copy-paste set mouse=a " Automatically enable mouse usage set mousehide " Hide the mouse cursor while typing autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | lcd %:p:h | endif " Always switch to the current file directory set shortmess+=filmnrxoOtT " Abbrev. of messages (avoids 'hit enter') set virtualedit=onemore " Allow for cursor beyond last character set hidden " Allow buffer switching without saving set iskeyword-=. " '.' is an end of word designator set iskeyword-=# " '#' is an end of word designator set iskeyword-=- " '-' is an end of word designator set cmdheight=2 " Better display for messages " } " Vim UI { set cursorline " show cursor line highlight clear SignColumn " SignColumn should match background highlight clear LineNr " Current line number row will have same background color in relative mode set ignorecase " Ignore case on search set smartcase " Don't ignore upper case characters on search set scrolljump=5 " Lines to scroll when cursor leaves screen set scrolloff=3 " Minimum lines to keep above and below cursor set foldenable " Auto fold code set list " Display whitespace " } " Formatting { set shiftwidth=4 " Use indents of 4 spaces set expandtab " Tabs are spaces, not tabs set tabstop=4 " An indentation every four columns set softtabstop=4 " Let backspace delete indent set nojoinspaces " Prevents inserting two spaces after punctuation on a join (J) 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 pastetoggle= " pastetoggle (sane indentation on pastes) " } " Key Mappings { " Switch between different windows by their direction no j| "switching to below window no k| "switching to above window no l| "switching to right window no h| "switching to left window " More convenient leaders let mapleader = "," let maplocalleader = '_' " Visual shifting (does not exit Visual mode) vnoremap < >gv " LanguageClient-neovim nnoremap :call LanguageClient_contextMenu() map lk :call LanguageClient#textDocument_hover() map lg :call LanguageClient#textDocument_definition() map lr :call LanguageClient#textDocument_rename() map lf :call LanguageClient#textDocument_formatting() map lb :call LanguageClient#textDocument_references() map la :call LanguageClient#textDocument_codeAction() map ls :call LanguageClient#textDocument_documentSymbol() " For when you forget to sudo.. Really Write the file. cmap w!! w !sudo tee % >/dev/null " } " Plugin Configuration { " NerdTree { " Start nerdtree automatically when no files are specified autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif " Don't open nerdtree when opening session file autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") && v:this_session == "" | NERDTree | endif " Start nerdtree automatically when opening up a directory autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif " Close vim if only windo left is nerdtree autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif " Toggle nerdtree map :NERDTreeToggle " } " Airline { " Enable powerline fonts let g:airline_powerline_fonts=1 " } " hexokinase { set termguicolors " } " coc { vmap f (coc-format-selected) nmap f (coc-format-selected) " Run jest for current project command! -nargs=0 Jest :call CocAction('runCommand', 'jest.projectTest') " Run jest for current file command! -nargs=0 JestCurrent :call CocAction('runCommand', 'jest.fileTest', ['%']) " Run jest for current test nnoremap te :call CocAction('runCommand', 'jest.singleTest') " Init jest in current cwd, require global jest command exists command! JestInit :call CocAction('runCommand', 'jest.init') " use and to navigate completion list inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " } " ale { " Shortcuts jump between linting errors map [c (ale_previous_wrap) nmap ]c (ale_next_wrap) let g:ale_sign_error = '❌' let g:ale_sign_warning = '⚠️' " Fix files let g:ale_fixers = {'*': ['remove_trailing_lines', 'trim_whitespace'], 'vue': ['importjs', 'prettier', 'eslint'], 'javascript': ['importjs', 'prettier', 'eslint'], 'sh': ['shfmt'], 'json': ['prettier'], 'go': ['gofmt', 'goimports'], 'markdown': ['prettier', 'remark-lint', 'textlint'], 'rust': ['rustfmt'], 'php': ['php_cs_fixer']} " Fix files automatically on save let g:ale_fix_on_save = 1 " } " easymotion { let g:EasyMotion_do_mapping = 0 " Disable default mappings " Jump to anywhere you want with minimal keystrokes, with just one key binding. " `s{char}{label}` nmap s (easymotion-overwin-f) " or " `s{char}{char}{label}` " Need one more keystroke, but on average, it may be more comfortable. nmap s (easymotion-overwin-f2) " Turn on case-insensitive feature let g:EasyMotion_smartcase = 1 " JK motions: Line motions map j (easymotion-j) map k (easymotion-k) " } " fzf { nnoremap :Files nnoremap f :Rg nnoremap f :Rg nnoremap / :BLines nnoremap ' :Marks nnoremap g :Commits nnoremap H :Helptags nnoremap hh :History nnoremap h: :History: nnoremap h/ :History/ " } " closetag { let g:closetag_filetypes = 'html,xhtml,phtml,vue' " } " unimpaired { " Move single lines nmap [e nmap ]e " Move multiple selected lines vmap [egv vmap ]egv " } " }