Skip to content

Instantly share code, notes, and snippets.

@cb-bffmike
Created August 12, 2021 20:11
Show Gist options
  • Save cb-bffmike/85c4d3d0b26b86ec7ba9af0f2f9c7f05 to your computer and use it in GitHub Desktop.
Save cb-bffmike/85c4d3d0b26b86ec7ba9af0f2f9c7f05 to your computer and use it in GitHub Desktop.
" This vimrc attempts to be nvim/vim agnostic, but it's a better experience in nvim.
" git-plug plugin manager ______________________________________________________
"
if has('nvim') " we are nvim bl
call plug#begin(stdpath('data') . '/plugged')
if !exists('g:vscode')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" Plug 'pangloss/vim-javascript'
" Plug 'leafgarland/typescript-vim'
" Plug 'styled-components/vim-styled-components', { 'branch': 'main' }
" TS Syntax highlighting
Plug 'yuezk/vim-js'
Plug 'HerringtonDarkholme/yats.vim'
Plug 'MaxMEllon/vim-jsx-pretty'
" This ^^^ is included with vim-polyglot but maybe not the newest
" version. However polyglot would give you mayn other languages.
Plug 'jparise/vim-graphql'
Plug 'APZelos/blamer.nvim'
endif
else " we are plain old vim
" because plain old vim doesn't change the cursor
" shape for us in insert mode
let &t_SI.="\e[5 q" "SI = INSERT mode
let &t_SR.="\e[4 q" "SR = REPLACE mode
let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)
call plug#begin('~/.vim/plugged')
endif
" these syntax highlighters are also active for vim
" even though vim 8.2 has built-in support because
" the built-in support is crappy. When it's no longer
" crappy, this should be moved into the vim block above
" Plug 'leafgarland/typescript-vim'
" Plug 'ianks/vim-tsx'
" Plug 'peitalin/vim-jsx-typescript'
if !exists('g:vscode')
" Plug 'maxmellon/vim-jsx-pretty'
Plug 'itchyny/lightline.vim'
Plug 'peitalin/vim-jsx-typescript'
endif
Plug 'mhinz/vim-startify'
Plug 'ludovicchabant/vim-gutentags'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-vinegar'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-rhubarb'
Plug 'lilyball/vim-swift'
Plug 'bkad/CamelCaseMotion'
Plug 'junegunn/fzf.vim'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'justinmk/vim-sneak'
Plug 'jph00/swift-apple'
Plug 'mattn/emmet-vim'
Plug 'hallzy/lightline-onedark'
Plug 'alvan/vim-closetag'
Plug 'airblade/vim-gitgutter'
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
Plug 'jamestthompson3/nvim-remote-containers'
" post install (yarn install | npm install) then load plugin only for editing
" supported files
" Plug 'prettier/vim-prettier', {
" \ 'do': 'yarn install',
" \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'yaml', 'html'] }
call plug#end()
" Theme stuff __________________________________________________________________
"
"
" Use 24-bit (true-color) mode in Vim/Neovim when outside tmux.
" If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support
" (see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.)
if (empty($TMUX))
if (has("nvim"))
"For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >
let $NVIM_TUI_ENABLE_TRUE_COLOR=1
endif
"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >
"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >
" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >
if (has("termguicolors"))
" set t_8f=[38;2;%lu;%lu;%lum
" set t_8b=[48;2;%lu;%lu;%lum
set termguicolors
endif
endif
" *cterm-colors*
" NR-16 NR-8 COLOR NAME
" 0 0 Black
" 1 4 DarkBlue
" 2 2 DarkGreen
" 3 6 DarkCyan
" 4 1 DarkRed
" 5 5 DarkMagenta
" 6 3 Brown, DarkYellow
" 7 7 LightGray, LightGrey, Gray, Grey
" 8 0* DarkGray, DarkGrey
" 9 4* Blue, LightBlue
" 10 2* Green, LightGreen
" 11 6* Cyan, LightCyan
" 12 1* Red, LightRed
" 13 5* Magenta, LightMagenta
" 14 3* Yellow, LightYellow
" 15 7* White
colorscheme clarity
" highlight Pmenu ctermbg=DarkGray guibg=DarkGray ctermfg=White guifg=White
" highlight PmenuSel ctermbg=DarkCyan guibg=DarkCyan ctermfg=Black guifg=Black
" highlight PmenuThumb ctermbg=Yellow guibg=Yellow
" highlight PmenuSbar ctermbg=Black guibg=Black
highlight CocCodeLens guifg=#505050
" highlight Cursor guibg=DarkCyan
" highlight CocHighlightText guibg=#104040 ctermbg=222
set guicursor=n-v-c:hor50-Cursor/lCursor-blinkon5000-blinkoff50-blinkwait100,i-ci-cr:Cursor-ver20-blinkon2000-blinkoff50-blinkwait100
" Settings _____________________________________________________________________
"
set laststatus=2 " needed for lightline
set shell=zsh\ -i
set tabstop=2 softtabstop=0 expandtab shiftwidth=2 smarttab
set noshowmode " disables -- INSERT -- which is provided by lightline
set wrap
set linebreak
set list listchars=tab:»·,trail:·
set ls=2
set noequalalways
set shell=/bin/bash
" Config _______________________________________________________________________
"
autocmd BufEnter *.{js,jsx,ts,tsx} :syntax sync fromstart
autocmd BufLeave *.{js,jsx,ts,tsx} :syntax sync clear
let g:coc_global_extensions = ['coc-solargraph']
" let g:fzf_layout = { 'window': { 'width': 1, 'height': 0.5, 'yoffset': 1, 'border': 'top' } }
let g:fzf_layout = { 'window': 'tabnew' }
let g:fzf_preview_window = ['up:40%']
let g:fzf_colors =
\ { 'fg': ['fg', 'Normal'],
\ 'bg': ['bg', 'Normal'],
\ 'hl': ['fg', 'String'],
\ 'hl+': ['fg', 'Statement'],
\ 'fg+': ['fg', 'Directory', 'CursorColumn', 'Normal'],
\ 'bg+': ['bg', 'Directory', 'CursorColumn'],
\ 'info': ['fg', 'Keyword'],
\ 'border': ['fg', 'Ignore'],
\ 'prompt': ['fg', 'Statement'],
\ 'pointer': ['fg', 'Directory'],
\ 'marker': ['fg', 'Directory'],
\ 'spinner': ['fg', 'Label'],
\ 'preview-bg': ['bg', 'CursorColumn'],
\ 'header': ['fg', 'Comment'] }
let g:startify_change_to_dir = 0
let g:startify_change_to_vcs_root = 1
let g:startify_session_delete_buffers = 1
let g:startify_session_persistence = 1
let g:startify_enable_special = 1
" let g:closetag_filenames = '*.html,*.xhtml,*.phtml'
" let g:closetag_xhtml_filenames = '*.xhtml,*.jsx,*.tsx,*.ts'
" let g:closetag_regions = {
" \ 'typescript.tsx': 'jsxRegion,tsxRegion',
" \ 'javascript.jsx': 'jsxRegion',
" \ 'typescriptreact': 'jsxRegion,tsxRegion',
" \ 'javascriptreact': 'jsxRegion',
" \ }
" let g:closetag_shortcut = '>'
" let g:closetag_close_shortcut = '<leader>>'
" let g:closetag_filetypes = 'html,xhtml,phtml'
" let g:closetag_xhtml_filetypes = 'xhtml,jsx'
" " Change the color of current & background windows
" function! s:configure_winhighlight()
" let ft = &filetype
" let bt = &buftype
" " Check white/blacklist.
" if index(['dirvish'], ft) == -1
" \ && (index(['nofile', 'nowrite', 'acwrite', 'quickfix', 'help'], bt) != -1
" \ || index(['startify'], ft) != -1)
" set winhighlight=Normal:MyNormalWin,NormalNC:MyNormalWin
" " echom "normal" winnr() &winhighlight 'ft:'.&ft 'bt:'.&bt
" else
" set winhighlight=Normal:MyNormalWin,NormalNC:MyInactiveWin
" " echom "inactive" winnr() &winhighlight 'ft:'.&ft 'bt:'.&bt
" endif
" endfunction
" augroup inactive_win
" au!
" au ColorScheme * hi link MyInactiveWin ColorColumn | hi link MyNormalWin Normal
" au FileType,BufWinEnter * call s:configure_winhighlight()
" au FocusGained * hi link MyNormalWin Normal
" au FocusLost * hi link MyNormalWin MyInactiveWin
" augroup END
" Blamer
let g:blamer_enabled = 1
let g:blamer_show_in_visual_modes = 0
let g:blamer_prefix = ' ◼︎ '
" Neovide
let g:neovide_cursor_vfx_mode = "railgun"
let g:neovide_refresh_rate=120
let g:neovide_cursor_animation_length=0.13
set guifont=JetBrains\ Mono:h14
" Syntax highlighting group under the cursor
function!SynGroup()
let l:s = synID(line('.'), col('.'), 1)
echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun
" Rhubarb Gbrowse
let g:github_enterprise_urls = ['https://github.cbhq.net']
if !exists('g:vscode')
augroup numbertoggle
autocmd!
autocmd VimEnter,WinEnter,BufWinEnter * set number relativenumber
autocmd WinLeave * set norelativenumber nonumber
augroup END
endif
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline.
if !exists('g:vscode')
function! StatusDiagnostic() abort
let info = get(b:, 'coc_diagnostic_info', {})
if empty(info) | return '' | endif
let msgs = []
if get(info, 'error', 0)
call add(msgs, info['error'] . ' Errors')
endif
if get(info, 'warning', 0)
call add(msgs, info['warning'] . ' Warnings')
endif
return join(msgs, ' ')
endfunction
endif
let g:lightline = {
\ 'colorscheme': 'onedark',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'readonly', 'gitbranch', 'relativepath', 'coc', 'gutentags', 'modified' ] ]
\ },
\ 'component': {
\ },
\ 'component_function': {
\ 'gitbranch': 'FugitiveHead',
\ 'gutentags': 'gutentags#statusline',
\ 'coc': 'StatusDiagnostic'
\ },
\ }
augroup CursorLineOnlyInActiveWindow
autocmd!
autocmd VimEnter,WinEnter,BufWinEnter * setlocal cursorline cursorcolumn
autocmd WinLeave * setlocal nocursorline nocursorcolumn
augroup END
if has('linebreak')
set breakindent
let &showbreak = '⤷ '
set cpo+=n
end
" by default .ts file are not identified as typescript and .tsx files are not
" identified as typescript react file, so add following
" https://medium.com/@s1n7ax/neovim-for-typescript-react-development-fdc7082c8a78
au BufNewFile,BufRead *.ts setlocal filetype=typescript
au BufNewFile,BufRead *.tsx,*.jsx setlocal filetype=typescript.tsx
" prettier runs after existing insert
"
if !has('nvim') && !exists('g:vscode')
autocmd TextChanged,InsertLeave *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.yaml,*.html PrettierAsync
endif
" Disable Background Color Erase (BCE) so that color schemes
" work properly when Vim is used inside tmux and GNU screen.
if &term =~ '256color'
set t_ut=
endif
" move tags to a single directory
" let g:gutentags_trace = 1
let g:gutentags_cache_dir = expand('~/.cache/vim/ctags/')
let g:gutentags_add_default_project_roots = 0
let g:gutentags_project_root = ['package.json', '.git', '.hg', '.svn']
let g:gutentags_exclude_filetypes = ['gitcommit', 'gitconfig', 'gitrebase', 'gitsendemail', 'git']
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=yes', '--fields=+ailmnS']
let g:gutentags_ctags_exclude = [
\ '*.git', '*.svn', '*.hg',
\ 'cache', 'build', 'dist', 'bin', 'node_modules', 'bower_components',
\ '*-lock.json', '*.lock',
\ '*.min.*',
\ '*.bak',
\ '*.zip',
\ '*.pyc',
\ '*.class',
\ '*.sln',
\ '*.csproj', '*.csproj.user',
\ '*.tmp',
\ '*.cache',
\ '*.vscode',
\ '*.pdb',
\ '*.exe', '*.dll', '*.bin',
\ '*.mp3', '*.ogg', '*.flac',
\ '*.swp', '*.swo',
\ '.DS_Store', '*.plist',
\ '*.bmp', '*.gif', '*.ico', '*.jpg', '*.png', '*.svg',
\ '*.rar', '*.zip', '*.tar', '*.tar.gz', '*.tar.xz', '*.tar.bz2',
\ '*.pdf', '*.doc', '*.docx', '*.ppt', '*.pptx', '*.xls',
\]
" Watchbuild
" build and populate errors on change
autocmd User CocNvimInit call CocAction('runCommand', 'tsserver.watchBuild')
" Commands _____________________________________________________________________
"
command! Rc e $MYVIMRC
command! Sorc so $MYVIMRC
command! Conflicts Ag<<<<<<
" Vertical Split Buffer Function
function VerticalSplitBuffer(buffer)
execute "vert belowright sb" a:buffer
endfunction
" Vertical Split Buffer Mapping
command! -nargs=1 Vsb call VerticalSplitBuffer(<f-args>)
" Utility functions ____________________________________________________________
"
" fill to end of line using —
function! FillLine( str )
" set tw to the desired total length
let tw = 80
if tw==0 | let tw = 80 | endif
" strip trailing spaces first
.s/[[:space:]]*$//
" calculate total number of 'str's to insert
let reps = (tw - col("$")) / len(a:str)
" insert them, if there's room, removing trailing spaces (though forcing
" there to be one)
if reps > 0
.s/$/\=(' '.repeat(a:str, reps))/
endif
endfunction
" coc.nvim config
if has('nvim') && !exists('g:vscode')
" coc extensions
let g:coc_global_extensions = [
\ 'coc-tslint-plugin',
\ 'coc-tsserver',
\ 'coc-emmet',
\ 'coc-css',
\ 'coc-html',
\ 'coc-json',
\ 'coc-yank',
\ 'coc-eslint',
\ ]
" Set diffs to vertical
set diffopt=internal,filler,vertical
" TextEdit might fail if hidden is not set.
set hidden
" Some servers have issues with backup files, see #649.
set nobackup
set nowritebackup
" Give more space for displaying messages.
set cmdheight=2
" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300
" Don't pass messages to |ins-completion-menu|.
set shortmess+=c
" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
set signcolumn=yes
highlight CocErrorFloat ctermfg=red
highlight CocWarningFloat ctermfg=yellow
highlight CocInfoFloat ctermfg=white
highlight CocHintFloat ctermfg=white
" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()
" Use <cr> to confirm completion, `<C-g>u` means break undo chain at current
" position. Coc only does snippet and additional edit on confirm.
if has('patch8.1.1068')
" Use `complete_info` if your (Neo)Vim version supports it.
inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"
else
imap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
endif
" Use `[g` and `]g` to navigate diagnostics
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>
" scroll nvim popups
nnoremap <nowait><expr> <C-j> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-j>"
nnoremap <nowait><expr> <C-k> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-k>"
inoremap <nowait><expr> <C-j> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
inoremap <nowait><expr> <C-k> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')
" Symbol renaming.
" nmap <leader>rn <Plug>(coc-rename)
nmap <leader>rn :CocCommand document.renameCurrentWord<CR>
" Formatting selected code.
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)
augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder.
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
" Applying codeAction to the selected region.
" Example: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)
" Remap keys for applying codeAction to the current line.
nmap <space>ac <Plug>(coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap <space>qf <Plug>(coc-fix-current)
" Introduce function text object
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap if <Plug>(coc-funcobj-i)
omap af <Plug>(coc-funcobj-a)
" Use <TAB> for selections ranges.
" NOTE: Requires 'textDocument/selectionRange' support from the language server.
" coc-tsserver, coc-python are the examples of servers that support it.
" nmap <silent> <TAB> <Plug>(coc-range-select)
" xmap <silent> <TAB> <Plug>(coc-range-select)
" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')
" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call CocAction('fold', <f-args>)
" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')
command! -nargs=0 Prettier :call CocAction('runCommand', 'prettier.formatFile')
" Mappings using CoCList:
" Show all diagnostics.
nnoremap <silent> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions.
nnoremap <silent> <space>e :<C-u>CocList extensions<cr>
" Show commands.
nnoremap <silent> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document.
" nnoremap <silent> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols.
nnoremap <silent> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item.
" nnoremap <silent> <space>j :<C-u>CocNext<CR>
" Do default action for previous item.
" nnoremap <silent> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list.
" nnoremap <silent> <space>p :<C-u>CocListResume<CR>
endif
" Mappings _____________________________________________________________________
"
" map <C-n> :NERDTreeToggle<CR>
map <silent> <space>- :call FillLine('_')<CR>
map <silent> \h :call SynGroup()<CR>
map <silent> <space>o :Files<CR>
map <silent> <space>p :Format<CR>
map <silent> <space>b :bn<CR>
map <silent> <space>B :Buffers<CR>
map <silent> <space>f :BLines<CR>
map <silent> <space>F :Tags<CR>
map <silent> <space>i :CocList diagnostics<CR>
map <silent> <space>w :up<bar>bp<bar>sp<bar>bn<bar>bd<CR>
map <silent> <space>j :call CocAction('diagnosticNext')<CR>
map <silent> <space>k :call CocAction('diagnosticPrevious')<CR>
map <silent> <C-h> xh
map <silent> <space><CR> <Plug>(coc-fix-current)
map <silent> <space>\ <Plug>(coc-codeaction)
map <silent> <space>O :CocList mru<CR>
map <silent> ,w <Plug>CamelCaseMotion_w
map <silent> ,b <Plug>CamelCaseMotion_b
map <silent> ,e <Plug>CamelCaseMotion_e
map <silent> ,ge <Plug>CamelCaseMotion_ge
map <silent> <space>n :noh<CR>
map <silent> <space>/ :CocList outline<CR>
map <silent> ,t :tabnew<CR>
map <silent> ,n :tabnext<CR>
map <silent> ,p :tabprev<CR>
map <silent> ,w :tabclose<CR>
map <silent> <space>y :CocList yank<CR>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment