Created
February 5, 2020 11:17
-
-
Save jackkinsella/aa7374a6832cca8a09eadc3434a33c24 to your computer and use it in GitHub Desktop.
Revisions
-
jackkinsella created this gist
Feb 5, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,606 @@ " Location for installing plugins call plug#begin('~/.vim/plugged') " Other plugins are specified with user/repo on Github or x.vim on vimscripts " Git integration (status bar and commands like Gblame) Plug 'tpope/vim-fugitive' " Add info to sidebar about git Plug 'airblade/vim-gitgutter' " Add file-management commands like :Delete, :Move, and :Rename Plug 'tpope/vim-eunuch' " Automatically adds 'ends' after ifs etc. in Ruby/Vimscript/Lua/Bourne Shell Plug 'tpope/vim-endwise' " Add parenthesis after autocompleted function Plug 'shougo/neopairs.vim' " Autocomplete from HTML snippets of a certain language Plug 'shougo/context_filetype.vim' " Provides a status line that provides handy info " From other plugins at the bottom of the screen Plug 'bling/vim-airline' " Snippets engine - requires actual snippets in a separate plugin Plug 'SirVer/ultisnips' " Visually displays indent levels as lines Plug 'nathanaelkane/vim-indent-guides' " Visually displays which XML/HTML/JSX tag is paired with current one Plug 'Valloric/MatchTagAlways' " Search with ripgrep (it is search tool agnostic) Plug 'mileszs/ack.vim' " View project tree Plug 'scrooloose/nerdtree' " Comment out code with ease in any language Plug 'scrooloose/nerdcommenter' " Lint / Check for syntax errors Plug 'w0rp/ale' " Highlights while editing and removes whitespace on save Plug 'ntpeters/vim-better-whitespace' " Split single line args to many Plug 'AndrewRadev/splitjoin.vim' " Color scheme Plug 'drewtempelmeyer/palenight.vim' " Change/delete surrounding quotes/brackets/tags Plug 'tpope/vim-surround' " Add extra text objects, e.g. for function arguments Plug 'wellle/targets.vim' " Run test under cursor Plug 'janko-m/vim-test' " Repeat command works with external plugins Plug 'tpope/vim-repeat' " Assisted closing of HTML etc. tags Plug 'alvan/vim-closetag' " Automatically close strings and brackets and braces etc. Plug 'jiangmiao/auto-pairs' " CSS3 Syntax Plug 'hail2u/vim-css3-syntax' " See CSS colours within Vim Plug 'ap/vim-css-color' " Needed solely to get textobj-function-syntax working Plug 'kana/vim-textobj-function' Plug 'haya14busa/vim-textobj-function-syntax' " Needed only for vim-textobj-rubyblock dependency Plug 'kana/vim-textobj-user' " Call external programs to format code Plug 'Chiel92/vim-autoformat' " Fuzzy search Plug 'junegunn/fzf.vim' " Handy bracket mappings ]q, ]<space>, etc. Plug 'tpope/vim-unimpaired' " Syntax highlighting for postgres Plug 'lifepillar/pgsql.vim' " Convert to snake, camel, dash, or dot case Plug 'tpope/vim-abolish' " Support editorconfig files (e.g. in PHP) Plug 'editorconfig/editorconfig-vim' " Async-vim is only here because it is required by vim-lsp Plug 'prabirshrestha/async.vim' " Languages server protocol connection Plug 'prabirshrestha/vim-lsp' " Language specific Plug 'pangloss/vim-javascript' " Provides JSX indentation Plug 'maxmellon/vim-jsx-pretty' Plug 'elzr/vim-json' Plug 'leafgarland/typescript-vim' Plug 'vim-ruby/vim-ruby' " Adds Ruby block objects Plug 'nelstrom/vim-textobj-rubyblock' Plug 'tpope/vim-rails' Plug 'tpope/vim-bundler' " Text objects for python Plug 'jeetsukumaran/vim-pythonsense' " Modern PHP syntax highlighting Plug 'StanAngeloff/php.vim' " Blade PHP templates Plug 'jwalton512/vim-blade' " Autocomplete functionality Plug 'prabirshrestha/asyncomplete.vim' " Autocomplete source - the buffer Plug 'prabirshrestha/asyncomplete-buffer.vim' " Autocomplete source - files Plug 'prabirshrestha/asyncomplete-file.vim' " Autocomplete source - language server protocol Plug 'prabirshrestha/asyncomplete-lsp.vim' " Autocomplete source - Ultisnips Plug 'prabirshrestha/asyncomplete-ultisnips.vim' " Autocomplete source - ctags Plug 'prabirshrestha/asyncomplete-tags.vim' " List ends here. Plugins become visible to Vim after this call. call plug#end() let mapleader="," " vim-lsp setup function! s:on_lsp_buffer_enabled() abort setlocal omnifunc=lsp#complete setlocal signcolumn=yes echom "loaded" " Find definition of word under cursor nnoremap <buffer> <leader>ld :LspDefinition<CR> " Find callers of word under cursor nnoremap <buffer> <leader>lr :LspReferences<CR> " Rename symbol throughout project nnoremap <buffer> <leader>lR :LspRename<CR> " Show docs (e.g. from libraries) nnoremap <buffer> <leader>lK :LspHover<CR> " Format document layout nnoremap <buffer> <leader>lf :LspDocumentFormat<CR> endfunction augroup lsp_install au! " call s:on_lsp_buffer_enabled only for languages that has the server registered. autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled() augroup END " Ultisnips must come before autocomplete declaration, possibly " Because of clash with trigger keys. " " Snippets keyboard shortcuts that don't clash let g:UltiSnipsExpandTrigger="<c-q>" let g:UltiSnipsJumpForwardTrigger="<c-f>" let g:UltiSnipsJumpBackwardTrigger="<c-b>" " Weirdly needed to work with Neovim let g:UltiSnipsSnippetDirectories = [$HOME.'/.vim/UltiSnips'] " How UltiSnips splits window when editting snippets let g:UltiSnipsEditSplit="vertical" " Address (likely temporary bug) whereby LSP completions with asyncomplete " Ate two characters following insertion let g:lsp_text_edit_enabled = 0 " Ruby lsp " Prerequisites: " > gem install solargraph " TODO: Get eruby filetype working. Not enough to add to whitelist, seemingly. au User lsp_setup call lsp#register_server({ \ 'name': 'solargraph', \ 'cmd': {server_info->[&shell, &shellcmdflag, 'bundle exec solargraph stdio']}, \ 'initialization_options': {"diagnostics": "true"}, \ 'whitelist': ['ruby'], \ }) " Prerequisites " > go get github.com/mattn/efm-langserver " ERB, YAML and Markdown augroup LspEFM au! autocmd User lsp_setup call lsp#register_server({ \ 'name': 'efm-langserver', \ 'cmd': {server_info->[&shell, &shellcmdflag, '~/go/bin/efm-langserver -c ~/.config/efm-langserver/config.yaml']}, \ 'whitelist': ['vim', 'eruby', 'markdown', 'yaml', 'html', 'sql'], \ }) augroup END " JavaScript and Typescript LSP " Prerequisites: " $ npm install -g typescript typescript-language-server if executable('typescript-language-server') au User lsp_setup call lsp#register_server({ \ 'name': 'javascript support using typescript-language-server', \ 'cmd': { server_info->[&shell, &shellcmdflag, 'typescript-language-server --stdio']}, \ 'root_uri': { server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_directory(lsp#utils#get_buffer_path(), '.git/..'))}, \ 'whitelist': ['javascript', 'javascript.jsx', 'javascriptreact'] \ }) else echom "ERROR: JavaScript language server not found" endif " Python LSP " Prerequisites: " $ pip3 install python-language-server if executable('pyls') au User lsp_setup call lsp#register_server({ \ 'name': 'pyls', \ 'cmd': {server_info->['pyls']}, \ 'whitelist': ['python'], \ }) else echom "ERROR: Python language server not found" endif " PHP LSP " Prerequisites: $ npm install -g [email protected] " (The latest version had no autocomplete) if executable('intelephense') au User lsp_setup call lsp#register_server({ \ 'name': 'intelephense', \ 'cmd': {server_info->['intelephense', '--stdio']}, \ 'initialization_options': {"storagePath": "/tmp/intelephense"}, \ 'whitelist': ['php'], \ }) else echom "Error: PHP language server not found" endif " C LSP " Prerequisites: $ brew install llvm augroup lsp_clangd autocmd! autocmd User lsp_setup call lsp#register_server({ \ 'name': 'clangd', \ 'cmd': {server_info->[&shell, './clangd']}, \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'], \ }) augroup end " Using asyncomplete-buffer.vim call asyncomplete#register_source(asyncomplete#sources#buffer#get_source_options({ \ 'name': 'buffer', \ 'whitelist': ['*'], \ 'completor': function('asyncomplete#sources#buffer#completor'), \ 'config': { \ 'max_buffer_size': 5000000, \ }, \ })) " Using asyncomplete-file. au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({ \ 'name': 'file', \ 'whitelist': ['*'], \ 'priority': 10, \ 'completor': function('asyncomplete#sources#file#completor') \ })) " Using Ultisnips call asyncomplete#register_source(asyncomplete#sources#ultisnips#get_source_options({ \ 'name': 'ultisnips', \ 'whitelist': ['*'], \ 'completor': function('asyncomplete#sources#ultisnips#completor'), \ })) " Using Ctags au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#tags#get_source_options({ \ 'name': 'tags', \ 'whitelist': ['c', 'ruby'], \ 'completor': function('asyncomplete#sources#tags#completor'), \ 'config': { \ 'max_file_size': 50000000, \ }, \ })) " Uncomment the following to debug `lsp` and autocomplete " " Log vim lsp actions let g:lsp_log_verbose = 1 let g:lsp_log_file = expand('/tmp/vim-lsp.log') " Log autocomplete actions "let g:asyncomplete_log_file = expand('/tmp/asyncomplete.log') " This works similarly to ALE. I am not sure whether " I want to fully delegate this task to ALE. let g:lsp_diagnostics_enabled = 0 " Tab to autocomplete with Asyncomplete inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>" inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>" inoremap <expr> <C-e> pumvisible() ? asyncomplete#cancel_popup() : "\<C-e>" " Ack-vim " Use rg (ripgrep) let g:ackprg = 'rg --vimgrep' " Setup keyboard shortcut. noremap <Leader>a :Ack! <left> " Ack but literal match instead of regex " Indent Guides - enable plugin let g:indent_guides_enable_on_vim_startup = 1 " Vim-jsx: Enable JSX indentation in normal JS files let g:jsx_ext_required = 0 " MatchTagAlways - enable for JSX let g:mta_filetypes = { \ 'html' : 1, \ 'xhtml' : 1, \ 'xml' : 1, \ 'jinja' : 1, \ 'jsx' : 1, \ 'javascript' : 1 \} " MatchTagAlways - Jump to matched tag nnoremap <leader>% :MtaJumpToOtherTag<cr> " Execute file (assumes a guiding shebang is present ) nnoremap <leader>2 :w<CR>:! ./%<cr> autocmd FileType c nnoremap <leader>2 :w \| :! make %:r && ./%:r <CR> " Python autocmd FileType python call SetPythonOptions() function! SetPythonOptions() " Execute " Wrap in logging nmap <leader>p yssfprint<cr> endfunction " Closetag - expand to extra files let g:closetag_filenames = '*.html,*.erb, *.xhtml,*.xml,*.js,*.jsx,*.html.erb,*.md,*.blade.php' let b:closetag_emptyTags= '^\(area\|base\|br\|col\|command\|embed\|hr\|img\|input\|keygen\|link\|meta\|param\|source\|track\|wbr\)$' " Skip closing a tag let g:closetag_close_shortcut = '<leader>>' " Integrate fzf via Homebrew set rtp+=/usr/local/opt/fzf " Integrate fzf via install on servers set rtp+=~/.fzf " Shortcuts for using fzf in vim nnoremap <leader>f :Files<cr> nnoremap <leader>g :GFiles<cr> nnoremap <leader>t :Tags<cr> " Focus on a particular window noremap <leader>w :Windows<cr> nnoremap <leader>b :Buffers<cr> nnoremap <leader>h :History<cr> nnoremap <leader>r :Rg<cr> " RG for word under cursor nnoremap <silent> <Leader>ur :Rg <C-R><C-W><CR> nnoremap <leader>v :Commands<cr> " Shortcuts for opening up results in splits let g:fzf_action = { \ 'ctrl-s': 'split', \ 'ctrl-v': 'vsplit' } " Needed for vim-textobj-rubyblock runtime macros/matchit.vim " Surround-vim addition to delete a function nmap <silent> dsf ds)db " Vim-better-whitespace always automatically remove let g:strip_whitespace_on_save=1 " Do not confirm let g:strip_whitespace_confirm=0 " Consider entities containing hyphens to be words. Originally css/scss only "set iskeyword+=- set iskeyword+=$ " Auto-pairs plugin let g:AutoPairsShortcutToggle = '<leader>p' " Handle nested pairs better let g:AutoPairsMultilineClose = 0 " Harmonize splitjoin with Rubocop's minimization of braces in method signatures let g:splitjoin_ruby_curly_braces = 0 let g:splitjoin_ruby_hanging_args = 0 let g:ale_completion_enabled = 0 let g:ale_fix_on_save = 1 " Handle when we have installed local binaries with composer let g:ale_php_phpstan_executable = "./vendor/bin/phpstan" let g:ale_linters = { \ 'python': ['flake8', 'pyls'], \ 'php': ['php', 'php_cs_fixer', 'phpstan', 'intelephense'], \ 'ruby': ['solargraph', 'ruby'], \ 'yaml': ['yamllint'], \ 'json': ['jsonlint'] \ } let g:ale_fixers = { \ 'scss': ['stylelint'], \ 'javascript': ['eslint'], \ 'python': ['autopep8', 'isort'], \ 'ruby': ['rubocop'] \ } " Le for Lint Error nmap <silent> <leader>le :ALENext<cr> " The commands built-into ALE for turning it off still let switchers be active. function! JACKtoggleALE() if (g:ale_fix_on_save == 1) let g:ale_fix_on_save=0 :ALEDisable :echo "Linting disabled" else let g:ale_fix_on_save=1 :ALEEnable :echo "Linting enabled" endif endfunction command! LintOff call JACKtoggleALE() command! LintOn call JACKtoggleALE() " Set filetype correctly for JSON-based lint config files au BufNewFile,BufRead .eslintrc set filetype=json au BufNewFile,BufRead .stylelintrc set filetype=json " Airline - connect to ALE let g:airline#extensions#ale#enabled = 1 let g:airline#extensions#tabline#enabled = 1 " Tell Vim JavaScript that you use Flow (gives syntax highlighting) let g:javascript_plugin_flow = 1 " Shortcuts for vim-test " Run test under cursor nmap <silent> <space>tu :w \| :TestNearest<CR> " Run current file (otherwise last file) nmap <silent> <space>tf :TestFile<CR> " Visit last test you ran nmap <silent> <space>tl :TestLast<CR> let g:test#preserve_screen = 1 let test#ruby#rspec#executable = 'bin/rspec' " Allow neovim Ruby provider to be RVM system ruby instead " Of per project "let g:ruby_host_prog = 'rvm system do neovim-ruby-host' " " Enable folding by default let ruby_fold = 1 " Set what you want to be folded let ruby_foldable_groups = 'def' "Switch to alternate JS files let g:rails_projections = { \ "app/webpacker/javascript/__tests__/*.spec.js": { "alternate": "app/webpacker/javascript/{}.js" }, \ "app/webpacker/javascript/*.js": { "alternate": "app/webpacker/javascript/__tests__/{}.spec.js" } \ } " Tell pgsql.vim to treat all sql files as postgres let g:sql_type_default = 'pgsql' " Assumes sqlformat is installed autocmd BufWritePost *.sql :% !sqlformat --reindent --keywords upper --identifiers lower --wrap_after 80 - " Hide buffers instead of closing them set hidden set history=5000 " Use many muchos levels of undo set undolevels=1000 " Write even though you did not sudo to begin with: w!! cmap w!! w !sudo tee % >/dev/null " Truecolor in the terminal set termguicolors " Configuration to work with palenight.vim color scheme set background=dark colorscheme palenight let g:airline_theme = "palenight" " Italics enabled let g:palenight_terminal_italics=1 syntax on " Override background color to be as dark as the terminal highlight Normal guibg=Black " Highlight non-ascii characters them in an obvious color syntax match nonascii "[^\x00-\x7F]" highlight nonascii guibg=Green ctermbg=2 " Enable line numbering set number set relativenumber " Turn click-me warnings about swapfiles into discreet little messages set shortmess+=A " Enable backup set backup set backupdir=~/.local/share/nvim/backup " Undo even after leaving vim set undofile set hlsearch " Removes highlighting from last search nmap <silent> <leader>/ :nohlsearch<CR> " Display long lines as just one line (you have to scroll horizontally) set nowrap " Tabsize set tabstop=2 " Reindent operations (<< and >>) set shiftwidth=2 set expandtab " Display spaces and tabs and oddities (like non-breaking white-space) set list set smartindent set autoindent set textwidth=80 " Connect tags file " Look in current dir first, then up to containing_dir set tags+=./tags;,tags; " On writing a file of the following types au BufWritePost &.c,*.rb,*.js,*.php,*.py silent! ctags & " Search as characters are entered set incsearch " Ignore case when searching set ignorecase " Shortcut for opening/closing quickfix nnoremap <leader>q :ccl<cr> " Ignore hated files generally at vim level (Some autocomplete engines picks up " on and add their own ignored files to the mix) set wildignore+=*.swp,*.bak,*.pyc,*.class,*/tmp/* map <leader>n :NERDTreeToggle<CR> " Automatically reload .vimrc file on save augroup myvimrc au! au BufWritePost .vimrc so ~/.vimrc augroup END set spelllang=en_us set spellfile=$HOME/.vim/spell/en.utf-8.add " Automatic spell check in all files set nospell autocmd filetype markdown,txt set spell spelllang=en_us " Show code blocks with syntax highlighting. This is a VIM built-in. let g:markdown_fenced_languages = ['html', 'python', 'bash=sh', 'c', 'ruby', 'javascript', 'php'] " Fix bug where MacVim screen goes blank when " Returning to vim from another program :au FocusGained * :redraw! set clipboard=unnamedplus " This unsets the 'last search pattern'. Register by hitting return nnoremap <CR> :noh<CR><CR> " Live view of substitutions when you type %s/foo/bar :set inccommand=nosplit " Mostly for solving git merge conflicts :set diffopt=vertical imap jj <ESC> autocmd filetype json,blade,eruby setlocal nofoldenable " Set folder color to white highlight Folded guifg=white " Delete buffer and move to the next one without closing split nmap <leader>d :bp\|bd #<cr> nmap <leader>z :cd %:p:h<cr>\| :NERDTreeCWD<cr> " Save my fingers when saving nmap <space>w :w<cr> " Copy current path into the paste buffer nmap <space>fp :let @+=expand("%:p")<cr> " Automatically reload file when underlying files change (e.g. git) set autoread " By default, swap out all instances in a line during substitutions set gdefault " Remove excess # when joining two lines of comments set formatoptions+=j " Keep same flags when repeating a substitution nnoremap & :&&<CR> xnoremap & :&&<CR> " Swap the word the cursor is on with the next word (which can be on a " newline, and punctuation is 'skipped'): nmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<CR> " Use <Leader>Esc to leave terminal mode tnoremap <Leader><Esc> <C-\><C-n> tnoremap <Leader>jj <C-\><C-n> " Shortcuts for frequently accessed files command! Vimrc e ~/.vimrc command! Zshrc e ~/.zshrc command! Diary e ~/code/code-diary/todo.md command! Gitconfig e ~/.gitconfig command! DotsREADME e ~/README-for-dotfiles.md command! Pokemon e ~/Documents/fresh-pokemon.md " Project based TODO list command! TODO e ./kinsella-todo.md