" vim:fdm=marker let s:darwin = has('mac') set nocompatible " otherwise NERDTree shows strange character instead of arrows set encoding=utf-8 " Plugin: vim-plug {{{ "https://github.com/junegunn/vim-plug/wiki/faq#automatic-installation if empty(glob('~/.vim/autoload/plug.vim')) silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim autocmd VimEnter * PlugInstall endif " vim-plug, install under ~/.vim/plugged call plug#begin('~/.vim/plugged') " Plugins {{{ " General {{{ Plug 'AndrewRadev/splitjoin.vim' Plug 'ConradIrwin/vim-bracketed-paste' Plug 'Lokaltog/vim-easymotion' Plug 'Raimondi/delimitMate' Plug 'Valloric/MatchTagAlways' Plug 'Valloric/YouCompleteMe', { 'do': './install.py --clang-completer --tern-completer' } Plug 'Yggdroot/indentLine' Plug 'airblade/vim-gitgutter' Plug 'airblade/vim-rooter' Plug 'bling/vim-airline' Plug 'editorconfig/editorconfig-vim' Plug 'haya14busa/incsearch.vim' Plug 'haya14busa/vim-asterisk' Plug 'honza/dockerfile.vim' Plug 'janko-m/vim-test' Plug 'jpalardy/vim-slime' Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' } Plug 'junegunn/fzf.vim' Plug 'junegunn/vim-peekaboo' Plug 'junegunn/vim-easy-align', { 'on': ['(EasyAlign)', 'EasyAlign'] } Plug 'junegunn/vim-emoji' Plug 'kannokanno/previm' Plug 'keith/investigate.vim' Plug 'kien/rainbow_parentheses.vim' Plug 'kshenoy/vim-signature' Plug 'majutsushi/tagbar' Plug 'mhinz/vim-grepper' Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } Plug 'scrooloose/syntastic' Plug 'sjl/gundo.vim' Plug 'szw/vim-g' Plug 'terryma/vim-expand-region' Plug 'terryma/vim-multiple-cursors' Plug 'tommcdo/vim-exchange' Plug 'tomtom/tcomment_vim' Plug 'tpope/vim-abolish' Plug 'tpope/vim-characterize' Plug 'tpope/vim-dispatch' Plug 'tpope/vim-obsession' Plug 'tpope/vim-projectionist' Plug 'tpope/vim-repeat' Plug 'tpope/vim-rsi' Plug 'tpope/vim-sensible' Plug 'tpope/vim-surround' Plug 'tpope/vim-unimpaired' Plug 'tyru/open-browser.vim' Plug 'unblevable/quick-scope' " }}} " colorscheme {{{ Plug 'NLKNguyen/papercolor-theme' Plug 'altercation/vim-colors-solarized' Plug 'chriskempson/tomorrow-theme', { 'rtp': 'vim' } Plug 'gilgigilgil/anderson.vim' Plug 'godlygeek/csapprox' Plug 'google/vim-colorscheme-primary' Plug 'itchyny/landscape.vim' Plug 'jnurmine/Zenburn' Plug 'jonathanfilip/vim-lucius' Plug 'jpo/vim-railscasts-theme' Plug 'jscappini/material.vim' Plug 'junegunn/seoul256.vim' Plug 'morhetz/gruvbox' Plug 'nanotech/jellybeans.vim' Plug 'romainl/Apprentice' Plug 'tomasr/molokai' Plug 'w0ng/vim-hybrid' Plug 'zenorocha/dracula-theme', { 'rtp': 'vim' } " }}} " Git {{{ Plug 'low-ghost/nerdtree-fugitive' Plug 'tpope/vim-fugitive' Plug 'tpope/vim-git' Plug 'Xuyuanp/nerdtree-git-plugin' " }}} " Front-End {{{ Plug 'ap/vim-css-color', { 'for': ['css', 'scss'] } Plug 'cakebaker/scss-syntax.vim' Plug 'digitaltoad/vim-pug', { 'for': 'pug' } Plug 'hail2u/vim-css3-syntax' Plug 'heavenshell/vim-jsdoc', { 'for': 'javascript' } Plug 'kewah/vim-stylefmt', { 'for': ['css', 'scss'] } Plug 'pangloss/vim-javascript', { 'for': 'javascript' } Plug 'mxw/vim-jsx', { 'for': 'javascript' } Plug 'kchmck/vim-coffee-script', { 'for': 'coffee' } Plug 'maksimr/vim-jsbeautify', { 'for': ['html', 'json'] } Plug 'marijnh/tern_for_vim', { 'do': 'npm i' } Plug 'mattn/emmet-vim' Plug 'millermedeiros/vim-esformatter', { 'for': 'javascript' } Plug 'mvolkmann/vim-js-arrow-function', { 'for': 'javascript' } Plug 'moll/vim-node' Plug 'mtscout6/syntastic-local-eslint.vim', { 'for': 'javascript' } Plug 'othree/html5.vim' " }}} " snippets {{{ Plug 'SirVer/ultisnips' Plug 'honza/vim-snippets' " }}} " tmux {{{ Plug 'christoomey/vim-tmux-navigator' Plug 'edkolev/tmuxline.vim' Plug 'wellle/tmux-complete.vim' " }}} " clojure & clojurescript {{{ Plug 'guns/vim-sexp', { 'for': 'clojure' } Plug 'tpope/vim-fireplace', { 'for': 'clojure' } Plug 'tpope/vim-sexp-mappings-for-regular-people', { 'for': 'clojure' } Plug 'venantius/vim-cljfmt', { 'for': 'clojure' } " }}} " Elixir {{{ Plug 'elixir-lang/vim-elixir', { 'for': ['elixir', 'eelixir'] } " }}} " Elm {{{ Plug 'ElmCast/elm-vim', { 'for': ['elm'] } " }}} " }}} call plug#end() " }}} " Allow hidden buffers, don't limit to 1 file per window/split set hidden " enable hybrid line number mode set relativenumber set number " more intuitive split set splitbelow set splitright " turn off backup for now set nobackup set noswapfile " change the terminal's title set title " highlight current line set cursorline if (exists('+colorcolumn')) set colorcolumn=80 endif " enable mouse in all modes if has('mouse') set mouse=a endif " flashing instead of beeping set visualbell " toggle paste mode set pastetoggle= let mapleader = "\" " Indentation {{{ " use soft tab set expandtab " number of visual spaces per TAB set tabstop=2 " number of space to use for autoindenting set shiftwidth=2 " }}} " Mappings {{{ cmap w!! w !sudo tee > /dev/null % " Move visual block vnoremap J :m '>+1gv=gv vnoremap K :m '<-2gv=gv " jk is escape inoremap jk " move vertically by visual line nnoremap j gj nnoremap k gk " swap the jump keys nnoremap ' ` nnoremap ` ' " Part of the Right Hand system, http://reefpoints.dockyard.com/2013/09/11/vim-staying-on-home-row-via-map.html " in INSERT mode, save & back to INSERT mode inoremap ;j :update " in NORMAL mode, save & back to NORMAL mode nnoremap ;j :update " Quickly edit/reload the vimrc file nnoremap ev :e $MYVIMRC nnoremap sv :so $MYVIMRC nnoremap ft :set ft= nnoremap w :w " Resize window noremap + noremap - noremap 3< noremap 3> " http://vim-jp.org/blog/2015/06/30/visual-ctrl-a-ctrl-x.html " not work on Neovim yet vnoremap gv vnoremap gv vnoremap Y "*y " Yank from the cursor to the end of the line, to be consistent with C and D. nnoremap Y "*y$ " Visual shifting (does not exit Visual mode) vnoremap > >gv vnoremap < >gv vmap " 2) exchange 'M' for: nmap M ':%s/' . @/ . '//g' if s:darwin " try to open the current file in default application nnoremap o :silent !open '%' endif " }}} " Search {{{ set hlsearch set ignorecase set smartcase " Plugin: incsearch {{{2 map / (incsearch-forward) map ? (incsearch-backward) map g/ (incsearch-stay) " turns 'hlsearch' off automatically after searching-related motions let g:incsearch#auto_nohlsearch = 1 map n (incsearch-nohl-n) map N (incsearch-nohl-N) map * (incsearch-nohl-*) map # (incsearch-nohl-#) map g* (incsearch-nohl-g*) map g# (incsearch-nohl-g#) " }}}2 " Plugin: vim-asterisk {{{2 map * (asterisk-*) map # (asterisk-#) map g* (asterisk-g*) map g# (asterisk-g#) map z* (asterisk-z*) map gz* (asterisk-gz*) map z# (asterisk-z#) map gz# (asterisk-gz#) " }}}2 " }}} " Plugin: EasyMotion {{{ " Bi-directional 2-character search " `s{char}{char}{label}` nmap s (easymotion-s2) " Turn on case sensitive feature let g:EasyMotion_smartcase = 1 " JK motions: Line motions map j (easymotion-j) map k (easymotion-k) " }}} " Plugin: editorconfig {{{ let g:EditorConfig_exclude_patterns = ['fugitive://.*', 'scp://.*'] " }}} " Plugin: fzf {{{ nnoremap :FZF --cycle " }}} " Plugin: fzf.vim {{{ nnoremap b :Buffers nnoremap C :Colors nnoremap f :Files " }}} " Plugin: gundo.vim {{{ nnoremap :GundoToggle " }}} " Plugin: indentLine {{{ let g:indentLine_conceallevel=0 " }}} " Plugin: investigate.vim {{{ if s:darwin let g:investigate_use_dash=1 endif " }}} " Plugin: nerdtree {{{ augroup nerdtree autocmd! let g:NERDTreeHijackNetrw = 0 map n :NERDTreeToggle :NERDTreeMirror " open a NERDTree automatically when vim starts up if no files were specified "autocmd StdinReadPre * let s:std_in=1 "autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif " close vim if the only window left open is a NERDTree autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif augroup END " }}} " Plugin: open-browser.vim {{{ let g:netrw_nogx = 1 " disable netrw's gx mapping. nmap gx (openbrowser-smart-search) vmap gx (openbrowser-smart-search) " }}} " Plugin: previm {{{ nnoremap pv :PrevimOpen " }}} " Plugin: quick-scope {{{ let g:qs_highlight_on_keys = ['f', 'F', 't', 'T'] " }}} " Plugin: rainbow_parentheses.vim {{{ augroup rainbow_parentheses.vim autocmd! autocmd VimEnter * RainbowParenthesesActivate autocmd BufEnter * RainbowParenthesesLoadRound autocmd BufEnter * RainbowParenthesesLoadSquare autocmd BufEnter * RainbowParenthesesLoadBraces augroup END " }}} " Plugin: scss-syntax.vim {{{ augroup scss-syntax.vim autocmd! autocmd FileType scss setlocal iskeyword+=- augroup END " }}} " Plugin: syntastic {{{ set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 0 " :h syntastic-fish let g:syntastic_shell = '/bin/zsh' let g:syntastic_aggregate_errors = 0 let g:syntastic_javascript_checkers = ['eslint'] nnoremap sc :SyntasticCheck " }}} " Plugin: tagbar {{{ nmap :TagbarToggle let g:tagbar_type_coffee = { \ 'ctagstype' : 'coffee', \ 'kinds' : [ \ 'c:classes', \ 'm:methods', \ 'f:functions', \ 'v:variables', \ 'f:fields', \ ] \ } let g:tagbar_type_markdown = { \ 'ctagstype' : 'markdown', \ 'kinds' : [ \ 'h:Heading_L1', \ 'i:Heading_L2', \ 'k:Heading_L3' \ ] \ } " }}} " Plugin: tern_for_vim {{{ let maplocalleader="," let g:tern_map_keys=1 let g:tern_show_argument_hints='on_hold' " }}} " Plugin: tmuxline.vim {{{ let g:tmuxline_theme = 'airline' let g:tmuxline_powerline_separators = 0 " }}} " Plugin: UltiSnips {{{ " to avoid conflict with YouCompleteMe set rtp+=~/dotfiles/vim/ let g:UltiSnipsEditSplit="vertical" let g:UltiSnipsExpandTrigger="" let g:UltiSnipsSnippetsDir="~/dotfiles/vim/snips/" let g:UltiSnipsSnippetDirectories=["UltiSnips", "snips"] " }}} " Plugin: vim-airline {{{ " make symbols look okay let g:airline_powerline_fonts = 1 " }}} " Plugin: vim-coffee-script {{{ augroup vim-coffeescript-script autocmd! autocmd FileType coffee setl foldmethod=indent nofoldenable let coffee_compile_vert = 1 let coffee_watch_vert = 1 autocmd FileType coffee noremap c :CoffeeCompile autocmd FileType coffee noremap r :CoffeeRun autocmd FileType coffee noremap w :CoffeeWatch augroup END " }}} " Plugin: vim-css3-syntax {{{ augroup vim-css3-syntax autocmd! " Plugin: vim-css3-syntax autocmd FileType css setlocal iskeyword+=- augroup END " }}} " Plugin: vim-stylefmt {{{ " require `npm i -g stylefmt` nnoremap cs :Stylefmt vnoremap cs :StylefmtVisual " }}} " Plugin: vim-dispatch {{{ autocmd FileType html let b:dispatch = '!open %:p' nnoremap :Dispatch " }}} " Plugin: vim-easy-align {{{ " Start interactive EasyAlign in visual mode (e.g. vipga) xmap ge (EasyAlign) " Start interactive EasyAlign for a motion/text object (e.g. gaip) nmap ge (EasyAlign) " }}} " Plugin: vim-emoji {{{ " trigger by CTRL-X CTRL-U in INSERT mode with terminal vim " Using Emojis as Git Gutter symbols, work only with terminal vim(?) silent! if emoji#available() let g:gitgutter_sign_added = emoji#for('small_blue_diamond') let g:gitgutter_sign_modified = emoji#for('small_orange_diamond') let g:gitgutter_sign_removed = emoji#for('small_red_triangle') let g:gitgutter_sign_modified_removed = emoji#for('collision') endif " Plugin: vim-esformatter {{{ nnoremap es :Esformatter vnoremap es :EsformatterVisual " }}} " Plugin: vim-expand-region {{{ vmap v (expand_region_expand) vmap (expand_region_shrink) " }}} " Plugin: vim-fugitive {{{ nmap gb :Gblame nmap gs :Gstatus " }}} " Plugin: vim-g {{{ let g:vim_g_command = "Go" let g:vim_g_f_command = "Gf" " }}} " Plugin: vim-grepper {{{ nnoremap ag :Grepper -tool ag -highlight nnoremap * :Grepper -tool ag -cword -noprompt nmap gs (GrepperOperator) xmap gs (GrepperOperator) " }}} " Plugin: vim-javascript {{{ let g:javascript_conceal_function = "ƒ" let g:javascript_conceal_null = "ø" let g:javascript_conceal_this = "@" let g:javascript_conceal_return = "⇚" let g:javascript_conceal_undefined = "¿" let g:javascript_conceal_NaN = "ℕ" let g:javascript_conceal_prototype = "¶" let g:javascript_conceal_static = "•" let g:javascript_conceal_super = "Ω" " }}} " Plugin: vim-jsbeautify {{{ augroup vim-jsbeautify autocmd! autocmd FileType html noremap :call HtmlBeautify() autocmd FileType html vnoremap :call RangeHtmlBeautify() autocmd FileType json noremap :call JsonBeautify() autocmd FileType json vnoremap :call RangeJsonBeautify() augroup END " }}} " Plugin: vim-jsdoc {{{ let g:jsdoc_allow_input_prompt = 1 " reserve for the mapping used by 'vim-tmux-navigator' let g:jsdoc_default_mapping = 0 " }}} " Plugin: vim-jsx {{{ let g:jsx_ext_required = 0 " }}} " Plugin: vim-signature {{{ nnoremap ]" :call signature#mark#Goto("next", "spot", "global") nnoremap [" :call signature#mark#Goto("prev", "spot", "global") " }}} " Plugin: vim-slime {{{ let g:slime_target = "tmux" " }}} " Plugin: vim-test {{{ let test#strategy = "dispatch" nmap t :TestNearest nmap T :TestFile nmap A :TestSuite nmap L :TestLast nmap g :TestVisit " }}} " Autocommands {{{1 augroup docker " {{{2 " reference: https://github.com/docker/docker/blob/master/contrib/syntax/vim/ftdetect/dockerfile.vim autocmd BufNewFile,BufRead [Dd]ockerfile,Dockerfile.* set filetype=dockerfile augroup END " }}}2 augroup git " {{{2 autocmd! " commit message autocmd FileType gitcommit setlocal spell textwidth=72 augroup END " }}}2 augroup markdown " {{{2 autocmd! " force *.md as MarkDown, https://github.com/tpope/vim-markdown autocmd BufNewFile,BufReadPost *.md set filetype=markdown " highlight markdown fenced code syntax let g:markdown_fenced_languages = ['html', 'json', 'python', 'scss', 'sh', 'sql', 'yaml'] augroup END " }}}2 " }}}1 " Auto-save a file when you leave insert mode autocmd InsertLeave,TextChanged * if expand('%') != '' | update | endif " Temporarily disabled {{{ " cut down key stroke for normal mode " but lose the capability for repeating the linewise character search "nnoremap ; : " bind K to grep word under cursor "nnoremap K :grep! "\b\b":cw " }}} " Local config if filereadable($HOME . "/.vimrc.local") source ~/.vimrc.local endif if has('nvim') " let $NVIM_TUI_ENABLE_TRUE_COLOR=1 let $NVIM_TUI_ENABLE_CURSOR_SHAPE=1 " save screen estate let $FZF_DEFAULT_OPTS = $FZF_DEFAULT_OPTS.' --inline-info' endif