My VIM settings (.vimrc)
" ============================================================================= | |
" Miller Medeiros .vimrc file | |
" ----------------------------------------------------------------------------- | |
" heavily inspired by: @factorylabs, @scrooloose, @nvie, @gf3, @bit-theory. | |
" ============================================================================= | |
" ----------------------------------------------------------------------------- | |
" BEHAVIOR | |
" ----------------------------------------------------------------------------- | |
set nocompatible " Disable vi compatibility | |
filetype on " filetype must be 'on' before setting it 'off' | |
" otherwise it exits with a bad status and breaks | |
" git commit. | |
filetype off " force reloading *after* pathogen loaded | |
" set the runtime path to include Vundle and initialize | |
set rtp+=~/.vim/bundle/Vundle.vim | |
call vundle#begin() | |
" let Vundle manage Vundle, required | |
Plugin 'VundleVim/Vundle.vim' | |
Plugin 'wincent/Command-T' | |
Plugin 'vim-scripts/IndentAnything' | |
Plugin 'vim-scripts/IndexedSearch' | |
Plugin 'vim-scripts/LustyJuggler' | |
Plugin 'gregsexton/MatchTag' | |
Plugin 'vim-scripts/YankRing.vim' | |
Plugin 'mileszs/ack.vim' | |
Plugin 'vim-scripts/bufkill.vim' | |
Plugin 'editorconfig/editorconfig-vim' | |
Plugin 'sjl/gundo.vim' | |
Plugin 'sjl/clam.vim' | |
Plugin 'othree/html5.vim' | |
Plugin 'scrooloose/nerdcommenter' | |
Plugin 'scrooloose/nerdtree' | |
Plugin 'junkblocker/patchreview-vim' | |
Plugin 'ervandew/supertab' | |
Plugin 'scrooloose/syntastic' | |
Plugin 'godlygeek/tabular' | |
Plugin 'Lokaltog/vim-easymotion' | |
Plugin 'tpope/vim-repeat' | |
Plugin 'tpope/vim-abolish' | |
Plugin 'tpope/vim-fugitive' | |
Plugin 'tpope/vim-markdown' | |
Plugin 'tpope/vim-speeddating' | |
Plugin 'tpope/vim-surround' | |
Plugin 'tpope/vim-unimpaired' | |
Plugin 'mhinz/vim-signify' | |
Plugin 'int3/vim-extradite' | |
" css | |
Plugin 'ap/vim-css-color' | |
Plugin 'hail2u/vim-css3-syntax' | |
" js | |
Plugin 'pangloss/vim-javascript' | |
Plugin 'elzr/vim-json' | |
Plugin 'mxw/vim-jsx' | |
Plugin 'millermedeiros/vim-esformatter' | |
" Bundle 'marijnh/tern_for_vim' | |
" snipmate | |
Plugin 'MarcWeber/vim-addon-mw-utils' | |
Plugin 'tomtom/tlib_vim' | |
Plugin 'garbas/vim-snipmate' | |
Plugin 'honza/vim-snippets' | |
Plugin 'millermedeiros/vim-statline' | |
" Plugin 'bling/vim-airline' | |
" colorschemes | |
Plugin 'tomasr/molokai' | |
" required for vundle | |
call vundle#end() | |
syntax on | |
filetype plugin indent on " enable detection, plugins and indent | |
" Local dirs (centralize everything) | |
set backupdir=~/.vim/backups | |
set directory=~/.vim/swaps | |
" Change mapleader (easier to type), at the top since its used everywhere | |
let mapleader="," | |
let maplocalleader=";" | |
set spelllang=en_us " spell checking | |
set encoding=utf-8 nobomb " BOM often causes trouble, UTF-8 is awsum. | |
" --- performance / buffer --- | |
set hidden " can put buffer to the background without writing | |
" to disk, will remember history/marks. | |
set lazyredraw " don't update the display while executing macros | |
set ttyfast " Send more characters at a given time. | |
" --- history / file handling --- | |
set history=999 " Increase history (default = 20) | |
set undolevels=999 " Moar undo (default=100) | |
set autoread " reload files if changed externally | |
" --- backup and swap files --- | |
" I save all the time, those are annoying and unnecessary... | |
set nobackup | |
set nowritebackup | |
set noswapfile | |
" --- search / regexp --- | |
set gdefault " RegExp global by default | |
set magic " Enable extended regexes. | |
set hlsearch " highlight searches | |
set incsearch " show the `best match so far' astyped | |
set ignorecase smartcase " make searches case-insensitive, unless they | |
" contain upper-case letters | |
" --- keys --- | |
set backspace=indent,eol,start " allow backspacing over everything. | |
set esckeys " Allow cursor keys in insert mode. | |
set nostartofline " Make j/k respect the columns | |
" set virtualedit=all " allow the cursor to go in to 'invalid' places | |
set timeoutlen=500 " how long it wait for mapped commands | |
set ttimeoutlen=100 " faster timeout for escape key and others | |
" Use a bar-shaped cursor for insert mode, even through tmux. | |
if exists('$TMUX') | |
let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\" | |
let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\" | |
else | |
let &t_SI = "\<Esc>]50;CursorShape=1\x7" | |
let &t_EI = "\<Esc>]50;CursorShape=0\x7" | |
endif | |
" ----------------------------------------------------------------------------- | |
" UI | |
" ----------------------------------------------------------------------------- | |
set t_Co=256 " 256 colors terminal | |
let g:molokai_original=0 | |
colorscheme molokai | |
" make 'var' keyword easier to spot | |
hi link javascriptType Keyword | |
" default ColorColumn is too distractive | |
hi clear ColorColumn | |
hi link ColorColumn FoldColumn | |
" defaul line number is too distractive | |
hi clear LineNr | |
hi link LineNr Comment | |
hi link OverLength Error | |
" --- UI settings --- | |
if has('gui_running') | |
"set guifont=Menlo:h13 | |
set gfn:Monaco:h14 | |
set transp=0 | |
" toolbar and scrollbars | |
set guioptions-=T " remove toolbar | |
set guioptions-=L " left scroll bar | |
set guioptions-=r " right scroll bar | |
set guioptions-=b " bottom scroll bar | |
set guioptions-=h " only calculate bottom scroll size of current line | |
set shortmess=atI " Don't show the intro message at start and | |
" truncate msgs (avoid press ENTER msgs). | |
endif | |
set cursorline " Highlight current line | |
set laststatus=2 " Always show status line | |
set number " Enable line numbers. | |
set numberwidth=5 " width of numbers line (default on gvim is 4) | |
set report=0 " Show all changes. | |
set showmode " Show the current mode. | |
set showcmd " show partial command on last line of screen. | |
set showmatch " show matching parenthesis | |
set splitbelow splitright " how to split new windows. | |
set title " Show the filename in the window title bar. | |
set scrolloff=5 " Start scrolling n lines before horizontal | |
" border of window. | |
set sidescrolloff=7 " Start scrolling n chars before end of screen. | |
set sidescroll=1 " The minimal number of columns to scroll | |
" horizontally. | |
" add useful stuff to title bar (file name, flags, cwd) | |
" based on @factorylabs | |
if has('title') && (has('gui_running') || &title) | |
set titlestring= | |
set titlestring+=%f | |
set titlestring+=%h%m%r%w | |
set titlestring+=\ -\ %{v:progname} | |
set titlestring+=\ -\ %{substitute(getcwd(),\ $HOME,\ '~',\ '')} | |
endif | |
" use relative line number by default | |
if exists('+relativenumber') | |
set relativenumber | |
endif | |
" --- command completion --- | |
set wildmenu " Hitting TAB in command mode will | |
set wildchar=<TAB> " show possible completions. | |
set wildmode=list:longest | |
set wildignore+=*.DS_STORE,*.db,node_modules/**,*.jpg,*.png,*.gif | |
" --- diff --- | |
set diffopt=filler " Add vertical spaces to keep right | |
" and left aligned. | |
set diffopt+=iwhite " Ignore whitespace changes. | |
" --- folding--- | |
set foldmethod=manual " manual fold | |
set foldnestmax=3 " deepest fold is 3 levels | |
set nofoldenable " don't fold by default | |
" --- list chars --- | |
" list spaces and tabs to avoid trailing spaces and mixed indentation | |
" see key mapping at the end of file to toggle `list` | |
set listchars=tab:▹\ ,trail:·,nbsp:⚋ | |
set fillchars=fold:- | |
set list | |
" --- remove sounds effects --- | |
set noerrorbells | |
set visualbell | |
" ----------------------------------------------------------------------------- | |
" INDENTATION AND TEXT-WRAP | |
" ----------------------------------------------------------------------------- | |
set expandtab " Expand tabs to spaces | |
set autoindent smartindent " auto/smart indent | |
set copyindent " copy previous indentation on auto indent | |
set softtabstop=2 " Tab key results in # spaces | |
set tabstop=2 " Tab is # spaces | |
set shiftwidth=2 " The # of spaces for indenting. | |
set smarttab " At start of line, <Tab> inserts shift width | |
" spaces, <Bs> deletes shift width spaces. | |
set wrap " wrap lines | |
set textwidth=80 | |
"set colorcolumn=+1 " Show large lines | |
set formatoptions=qrn1 " automatic formating. | |
set formatoptions-=o " don't start new lines w/ comment leader on | |
" pressing 'o' | |
set nomodeline " don't use modeline (security) | |
set pastetoggle=<leader>p " paste mode: avoid auto indent, treat chars | |
" as literal. | |
" ----------------------------------------------------------------------------- | |
" PLUGINS | |
" ----------------------------------------------------------------------------- | |
" --- NERDTree ---- | |
let NERDTreeIgnore=['.DS_Store'] | |
let NERDTreeShowBookmarks=0 "show bookmarks on startup | |
let NERDTreeHighlightCursorline=1 "Highlight the selected entry in the tree | |
let NERDTreeShowLineNumbers=0 | |
let NERDTreeMinimalUI=1 | |
noremap <leader>nt :NERDTreeToggle<CR> | |
" --- NERDCommenter --- | |
let NERDSpaceDelims=1 " space around delimiters | |
let NERDRemoveExtraSpaces=1 | |
let g:NERDCustomDelimiters = { | |
\ 'scss': { 'left': '//' } | |
\ } | |
" --- Syntastic : Linting / Error check --- | |
let g:syntastic_auto_loc_list=2 | |
let g:syntastic_check_on_open=1 | |
" close/open location list (errors) | |
noremap <silent><leader>lc :lcl<CR> | |
noremap <silent><leader>lo :Errors<CR> :lw<CR> | |
noremap <silent><leader>ln :lnext<CR> | |
noremap <silent><leader>lp :lprev<CR> | |
" --- autocomplete / supertab / jscomplete --- | |
set infercase | |
set completeopt=longest,menuone | |
set omnifunc=syntaxcomplete#Complete | |
set completefunc=syntaxcomplete#Complete | |
set complete=.,w,b,u,U,t,i,d | |
" see [autocommands] at the end for more autocomplete settings | |
" nodejs-complete / jscomplete | |
let g:node_usejscomplete = 1 | |
let g:jscomplete_use = ['dom', 'moz'] | |
let g:SuperTabMappingForward = '<c-space>' | |
let g:SuperTabMappingBackward = '<s-c-Space>' | |
let g:SuperTabLongestEnhanced = 1 | |
let g:SuperTabDefaultCompletionType = "<c-p>" | |
" --- snipmate --- | |
let g:snips_author = 'Miller Medeiros' | |
" --- EasyMotion --- | |
let g:EasyMotion_leader_key = '<Leader>m' | |
" lets make <leader>F and <leader>f use easymotion by default | |
let g:EasyMotion_mapping_f = '<leader>f' | |
let g:EasyMotion_mapping_F = '<leader>F' | |
" --- Strip trailing whitespace --- | |
function! StripWhitespace () | |
let save_cursor = getpos(".") | |
let old_query = getreg('/') | |
:%s/\s\+$//e | |
call setpos('.', save_cursor) | |
call setreg('/', old_query) | |
endfunction | |
" Trailing white space (strip spaces) | |
noremap <leader>ss :call StripWhitespace()<CR> | |
" --- matchit --- | |
runtime macros/matchit.vim " enable matchit (better '%' key mapping) | |
" --- vim-css-color --- | |
let g:cssColorVimDoNotMessMyUpdatetime = 1 | |
" --- vim-signify --- | |
let g:signify_update_on_focusgained = 1 | |
" --- Command-T --- | |
let g:CommandTMaxFiles=2000 | |
let g:CommandTMaxHeight=12 | |
noremap <silent> <leader>tt :CommandT<CR> | |
noremap <silent> <leader>bt :CommandTBuffer<CR> | |
noremap <silent> <leader>tf :CommandTFlush<CR> | |
" --- LustyJuggler --- | |
let g:LustyJugglerSuppressRubyWarning = 1 " avoid error if running on terminal | |
" --- statline --- | |
" errors color | |
hi User3 guifg=#FFFFFF guibg=#FF0000 gui=bold ctermfg=15 ctermbg=1 cterm=bold | |
let g:statline_fugitive = 1 | |
let g:statline_filename_relative = 1 | |
let g:statline_mixed_indent_string = '[mix]' | |
" --- gundo --- | |
nnoremap <leader>gu :GundoToggle<CR> | |
let g:gundo_right = 1 | |
let g:gundo_preview_bottom = 1 | |
" --- toggle indentation mode --- | |
function! ToggleExpandTab() | |
if &et | |
set noet softtabstop=0 | |
else | |
execute "set et softtabstop=". &tabstop | |
endif | |
endfunction | |
noremap <silent> <leader>et :call ToggleExpandTab()<CR> | |
" --- Show syntax highlighting groups for word under cursor --- | |
" http://vimcasts.org/episodes/creating-colorschemes-for-vim/ | |
nnoremap <leader>sh :call <SID>SynStack()<CR> | |
function! <SID>SynStack() | |
if !exists("*synstack") | |
return | |
endif | |
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') | |
endfunc | |
" faster wehn opening files with large lines | |
set synmaxcol=300 | |
" --- Highlight word under cursor --- | |
" hi W1 guibg=#aeee00 guifg=#000000 ctermbg=154 ctermfg=16 | |
" nnoremap <silent> <leader>h1 :execute 'match W1 /\<<c-r><c-w>\>/'<cr> | |
" --- Tabular.vim --- | |
noremap <silent> <leader>t: :Tabularize /:<CR> | |
noremap <silent> <leader>t= :Tabularize /=<CR> | |
noremap <silent> <leader>t, :Tabularize /,<CR> | |
noremap <silent> <leader>t{ :Tabularize /{<CR> | |
noremap <silent> <leader>t" :Tabularize /"<CR> | |
noremap <silent> <leader>t' :Tabularize /'<CR> | |
noremap <silent> <leader>t[ :Tabularize /[<CR> | |
noremap <silent> <leader>t/ :Tabularize ///<CR> | |
noremap <silent> <leader>t\| :Tabularize /\|<CR> | |
" --- include content of static files --- | |
" borrowed from: http://vim.1045645.n5.nabble.com/vim-counterpart-for-persistent-includes-td4276915.html | |
function! IncludeStatic() | |
:g/<!-- #include "[^"]*" -->\_.\{-}<!-- end include -->/let fname = matchstr(getline('.'),'<!-- #include "\zs[^"]*\ze" -->')|exec '+,/<!-- end include -->/-!cat '.fnameescape(fname) | |
endfunction | |
noremap <silent> <leader>ic :call IncludeStatic()<CR> | |
" --- convert selected text from markdown to HTML --- | |
vnoremap <silent> <leader>md :! mdown<CR> | |
function! SanitizeMdown() | |
%s/<\/\?p>// | |
%s/<br \?\/\?>/ / | |
%s/<pre><code>/<pre class="brush:js">\r/ | |
%s/<\/code><\/pre>/<\/pre>/ | |
endfunc | |
noremap <silent> <leader>mds :call SanitizeMdown()<CR> | |
" --- format JavaScript source code using esformatter -- | |
nnoremap <silent> <leader>es :Esformatter<CR> | |
vnoremap <silent> <leader>es :EsformatterVisual<CR> | |
" --- toggle autocomplete behavior and word delimiters --- | |
function! KeywordsAll() | |
setl iskeyword=@,48-57,192-255,\@,\$,%,-,_ | |
endfunc | |
function! KeywordsBasic() | |
setl iskeyword=@,48-57,192-255 | |
endfunc | |
" --- visual block move --- | |
" http://www.youtube.com/watch?v=aHm36-na4-4#t=35m10 | |
let g:DVB_TrimWS = 1 | |
vmap <expr> <S-LEFT> DVB_Drag('left') | |
vmap <expr> <S-RIGHT> DVB_Drag('right') | |
vmap <expr> <S-DOWN> DVB_Drag('down') | |
vmap <expr> <S-UP> DVB_Drag('up') | |
vmap <expr> D DVB_Duplicate() | |
" --- transform lists --- | |
" http://www.youtube.com/watch?v=aHm36-na4-4#t=17m30 | |
nmap <leader>ls :call ListTrans_toggle_format()<CR> | |
vmap <leader>ls :call ListTrans_toggle_format('visual')<CR> | |
" ----------------------------------------------------------------------------- | |
" KEY MAPPINGS | |
" ----------------------------------------------------------------------------- | |
" mapleader set at the top of the file to avoid conflicts | |
" --- FIX/IMPROVE DEFAULT BEHAVIOR --- | |
" faster commands | |
" nnoremap <space> : | |
" sudo write | |
" command! W w !sudo tee % > /dev/null | |
" Swap v and CTRL-V, because Block mode is more useful that Visual mode | |
" nnoremap v <C-V> | |
" nnoremap <C-V> v | |
" vnoremap v <C-V> | |
" vnoremap <C-V> v | |
" avoid mistyping commands | |
command! W w | |
command! Wq wq | |
command! Bd bd | |
" Split line (sister to [J]oin lines) | |
" The normal use of S is covered by cc, so don't worry about shadowing | |
nnoremap S i<cr><esc><right> | |
" movement by screen line instead of file line (for text wrap) | |
nnoremap j gj | |
nnoremap <down> gj | |
nnoremap k gk | |
nnoremap <up> gk | |
" next tab | |
nnoremap <C-Tab> :tabn<CR> | |
" automatic esc, really uncommon to type jj,jk | |
inoremap jj <ESC> | |
inoremap jk <Esc> | |
" Faster scrolling | |
nnoremap <C-e> 3<C-e> | |
nnoremap <C-y> 3<C-y> | |
" Bubble single lines, similar to Eclipse (requires unimpaired.vim) | |
nmap <C-Up> [e | |
nmap <C-Down> ]e | |
" Bubble multiple lines, similar to Eclipse (requires unimpaired.vim) | |
vmap <C-Up> [egv | |
vmap <C-Down> ]egv | |
" Duplicate lines, similar to Eclipse | |
noremap <C-S-Up> YP | |
noremap <C-S-Down> YP | |
" 'fix' search regexp to be compatible with Perl format | |
" nmap / /\v | |
" vmap / /\v | |
" Use the damn hjkl keys | |
" noremap <up> <nop> | |
" noremap <down> <nop> | |
" noremap <left> <nop> | |
" noremap <right> <nop> | |
" improve the 'search word under cursor' behavior | |
nnoremap * :silent call KeywordsAll()<CR> * | |
nnoremap # :silent call KeywordsAll()<CR> # | |
" --- COMMON STUFF / HELPERS --- | |
" Toggle show tabs and trailing spaces | |
nnoremap <leader>c :set nolist!<CR> | |
" Clear the search highlight | |
nnoremap <silent> \ :silent nohlsearch<CR> | |
" text wrap: Hard wrap paragraph text (similar to TextMate Ctrl+Q) | |
nnoremap <leader>tw gqip | |
nnoremap <leader>nw :set nowrap<CR> | |
" Open file (useful for HTML) | |
noremap <silent> <leader>o :!open %<CR> | |
" Reformat code | |
nnoremap <leader>rf gg=G | |
" I use retab too much and it's hard to type | |
nnoremap <leader>rt :retab!<CR> | |
" Pull word under cursor into LHS of a substitute (find and replace) | |
nnoremap <leader>rr :silent call KeywordsAll()<CR> :%s#\<<C-r>=expand("<cword>")<CR>\># | |
" Insert/append a single character | |
" noremap ,, i_<esc>r | |
" noremap ;; a_<esc>r | |
" Visually select the text that was last edited/pasted | |
nnoremap <leader>v `[v`] | |
" fast Ack | |
nnoremap <leader>a :tab split<CR>:Ack<Space> | |
nnoremap <leader>aw :silent call KeywordsAll()<CR> :tab split<CR>:Ack<cword><CR> :silent call KeywordsBasic()<CR> | |
" Toggle spelling hints | |
nnoremap <silent> <leader>ts :set spell!<CR> | |
" Move between splits (windows) | |
noremap <C-h> <C-w>h | |
noremap <C-j> <C-w>j | |
noremap <C-k> <C-w>k | |
noremap <C-l> <C-w>l | |
" Move windows around (only works on same row) | |
noremap <C-S-Right> <C-w>r | |
noremap <C-S-Left> <C-w>R | |
" Open current buffer in a new split | |
noremap <leader>s :vsplit<cr> | |
noremap <leader>i :split<cr> | |
" close window | |
noremap <leader>q :clo<CR> | |
" delete buffer but keep window open (requires bufkill.vim) | |
map <leader>bd :BD<CR> | |
" smarter next/prev buffer (requires bufkill.vim) | |
map <leader>bn :BF<CR> | |
map <leader>bp :BB<CR> | |
" resize splits (http://vim.wikia.com/wiki/Resize_splits_more_quickly) | |
nnoremap <silent> <Leader>+ :exe "resize " . (winheight(0) * 3/2)<CR> | |
nnoremap <silent> <Leader>- :exe "resize " . (winheight(0) * 2/3)<CR> | |
" add spaces inside current parenthesis | |
map <leader>( vi(xi P | |
" ----------------------------------------------------------------------------- | |
" FILE HANDLING | |
" ----------------------------------------------------------------------------- | |
" [autocommands] borrowed from @bit-theory vimfiles and edited | |
augroup mm_buf_cmds | |
" clear commands before resetting | |
autocmd! | |
" when vimrc is edited, reload it | |
autocmd bufwritepost .gvimrc source % | |
autocmd bufwritepost .vimrc source % | |
" Only show cursorline in the current window and in normal mode | |
au WinLeave,InsertEnter * set nocul | |
au WinEnter,InsertLeave * set cul | |
" filetype | |
autocmd BufNewFile,BufRead *.json setf json | |
autocmd BufNewFile,BufRead *.hx setf haxe | |
autocmd FileType mustache runtime! ftplugin/html/sparkup.vim | |
" Enable omnicomplete for supported filetypes | |
autocmd FileType css,scss setlocal omnifunc=csscomplete#CompleteCSS | |
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags | |
" autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS | |
" jscomplete is a separate plugin | |
autocmd FileType javascript setlocal omnifunc=jscomplete#CompleteJS | |
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete | |
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags | |
" make `gf` search for .js files | |
autocmd FileType javascript setlocal suffixesadd=.js | |
autocmd FileType javascript setlocal path+=js,scripts | |
" make sure `complete` works as expected for CSS class names without | |
" messing with motions (eg. '.foo-bar__baz') and we make sure all | |
" delimiters (_,-,$,%,.) are treated as word separators outside insert mode | |
autocmd InsertEnter,BufLeave * :silent call KeywordsAll() | |
autocmd InsertLeave,BufEnter * :silent call KeywordsBasic() | |
" yes, we need to duplicate it on VimEnter for some weird reason | |
autocmd VimEnter * nnoremap * :silent call KeywordsAll()<CR> * | |
autocmd VimEnter * nnoremap # :silent call KeywordsAll()<CR> # | |
" Toggle relative/absolute line numbers during edit | |
" if exists('+relativenumber') | |
" autocmd InsertEnter * setl nu | |
" autocmd InsertLeave,BufEnter * setl rnu | |
" endif | |
" highlight char at column 81 (textwidth + 1) | |
autocmd BufEnter * match OverLength /\%81v/ | |
" Color Column (only on insert) | |
if exists("&colorcolumn") | |
autocmd InsertEnter * set colorcolumn=80 | |
autocmd InsertLeave * set colorcolumn="" | |
endif | |
augroup END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment