" Modeline and Notes { " vim: set sw=4 ts=4 sts=4 et tw=78 foldmarker={,} nofoldenable foldmethod=marker spell: " " This is Nachuan's personal vim config fork from " spf13/spf13-vim (http://spf13.com) " Environment { " The default leader is '\', but many people prefer ',' as it's in a standard let mapleader = ',' let maplocalleader = '_' " } " Use bundles config { if filereadable(expand("~/.vimrc.bundles")) source ~/.vimrc.bundles endif " } " General { set background=dark " Assume a dark background " Allow to trigger background function! ToggleBG() let s:tbg = &background " Inversion if s:tbg == "dark" set background=light else set background=dark endif endfunction noremap bg :call ToggleBG() noremap h :noh " turn off highlight filetype plugin indent on " Automatically detect file types. syntax on " Syntax highlighting syntax enable " Syntax highlighting set mouse=a " Automatically enable mouse usage set mousehide " Hide the mouse cursor while typing scriptencoding utf-8 " Most prefer to automatically switch to the current file directory when " a new buffer is opened; to prevent this behavior, add the following to " your .vimrc.before.local file: " let g:spf13_no_autochdir = 1 if !exists('g:spf13_no_autochdir') autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | lcd %:p:h | endif " Always switch to the current file directory endif set shortmess+=filmnrxoOtT " Abbrev. of messages (avoids 'hit enter') set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility set virtualedit=onemore " Allow for cursor beyond last character set history=1000 " Store a ton of history (default is 20) set spell " Spell checking on 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 iskeyword-=_ " '_' is an end of word designator " Instead of reverting the cursor to the last position in the buffer, we " set it to the first line when editing a git commit message au FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0]) " http://vim.wikia.com/wiki/Restore_cursor_to_file_position_in_previous_editing_session " Restore cursor to file position in previous editing session " To disable this, add the following to your .vimrc file: " let g:spf13_no_restore_cursor = 1 if !exists('g:spf13_no_restore_cursor') function! ResCur() if line("'\"") <= line("$") silent! normal! g`" return 1 endif endfunction augroup resCur autocmd! autocmd BufWinEnter * call ResCur() augroup END endif " Setting up the directories { set backup " Backups are nice ... if has('persistent_undo') set undofile " So is persistent undo ... set undolevels=1000 " Maximum number of changes that can be undone set undoreload=10000 " Maximum number lines to save for undo on a buffer reload endif " } " } " Vim UI { if filereadable(expand("~/.vim/bundle/vim-colors-solarized/colors/solarized.vim")) let g:solarized_termcolors=256 let g:solarized_termtrans=1 let g:solarized_contrast="normal" let g:solarized_visibility="normal" call togglebg#map("") colorscheme solarized endif set tabpagemax=15 " Only show 15 tabs set showmode " Display the current mode set cursorline " Highlight current line highlight clear SignColumn " SignColumn should match background highlight clear LineNr " Current line number row will have same background color in relative mode "highlight clear CursorLineNr " Remove highlight color from current line number if has('cmdline_info') set ruler " Show the ruler set rulerformat=%30(%=\:b%n%y%m%r%w\ %l,%c%V\ %P%) " A ruler on steroids set showcmd " Show partial commands in status line and endif if has('statusline') set laststatus=2 " Broken down into easily includeable segments set statusline=%<%f\ " Filename set statusline+=%w%h%m%r " Options set statusline+=\ [%{&ff}/%Y] " Filetype set statusline+=\ [%{getcwd()}] " Current dir set statusline+=%=%-14.(%l,%c%V%)\ %p%% " Right aligned file nav info endif set backspace=indent,eol,start " Backspace for dummies set number " Line numbers on set showmatch " Show matching brackets/parenthesis set incsearch " Find as you type search set hlsearch " Highlight search terms set winminheight=0 " Windows can be 0 line high set ignorecase " Case insensitive search set smartcase " Case sensitive when uc present set wildmenu " Show list instead of just completing set wildmode=list:longest,full " Command completion, list matches, then longest common part, then all. set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too set scrolljump=1 " Lines to scroll when cursor leaves screen set scrolloff=5 " Minimum lines to keep above and below cursor set sidescrolloff=5 " Minimum lines to keep at the left or right of the cursor " } " Formatting { "set nowrap " Do not wrap long lines set autoindent " Indent at the same level of the previous line 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 nolist " let vim not showing '$' or other sign set matchpairs+=<:> " Match, to be used with % set comments=sl:/*,mb:*,elx:*/ " auto format comment blocks " Remove trailing whitespaces and ^M chars " To disable the stripping of whitespace, add the following to your " .vimrc.before.local file: " let g:spf13_keep_trailing_whitespace = 1 "autocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl,sql autocmd BufWritePre if !exists('g:spf13_keep_trailing_whitespace') | call StripTrailingWhitespace() | endif "autocmd FileType go autocmd BufWritePre Fmt autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig autocmd FileType haskell,puppet,ruby,yml setlocal expandtab shiftwidth=2 softtabstop=2 " preceding line best in a plugin but here for now. autocmd BufNewFile,BufRead *.coffee set filetype=coffee " Workaround vim-commentary for Haskell autocmd FileType haskell setlocal commentstring=--\ %s " Workaround broken colour highlighting in Haskell autocmd FileType haskell,rust setlocal nospell " } " Key (re)Mappings { " Wrapped lines goes down/up to next row, rather than next line in file. noremap j gj noremap k gk " Stupid shift key fixes if !exists('g:spf13_no_keyfixes') if has("user_commands") command! -bang -nargs=* -complete=file E e command! -bang -nargs=* -complete=file W w command! -bang -nargs=* -complete=file Wq wq command! -bang -nargs=* -complete=file WQ wq command! -bang Wa wa command! -bang WA wa command! -bang Q q command! -bang QA qa command! -bang Qa qa endif cmap Tabe tabe endif " Yank from the cursor to the end of the line, to be consistent with C and D. nnoremap Y y$ set foldmethod=syntax autocmd FileType python set foldmethod=indent set nofoldenable " Code folding options nmap f0 :set foldlevel=0 nmap f1 :set foldlevel=1 nmap f2 :set foldlevel=2 nmap f3 :set foldlevel=3 nmap f4 :set foldlevel=4 nmap f5 :set foldlevel=5 nmap f6 :set foldlevel=6 nmap f7 :set foldlevel=7 nmap f8 :set foldlevel=8 nmap f9 :set foldlevel=9 " Most prefer to toggle search highlighting rather than clear the current " search results. To clear search highlighting rather than toggle it on " and off, add the following to your .vimrc.before.local file: " let g:spf13_clear_search_highlight = 1 if exists('g:spf13_clear_search_highlight') nmap / :nohlsearch else nmap / :set invhlsearch endif " Find merge conflict markers map fc /\v^[<\|=>]{7}( .*\|$) " Visual shifting (does not exit Visual mode) vnoremap < >gv " Allow using the repeat operator with a visual selection (!) " http://stackoverflow.com/a/8064607/127816 vnoremap . :normal . " For when you forget to sudo.. Really Write the file. cmap w!! w !sudo tee % >/dev/null " Adjust viewports to the same size map = = " Map ff to display all lines with keyword under cursor " and ask which one to jump to nmap ff [I:let nr = input("Which one: ")exe "normal " . nr ."[\t" " Easier horizontal scrolling map zl zL map zh zH " Easier formatting nnoremap q gwip " Plugins { " Misc { if isdirectory(expand("~/.vim/bundle/nerdtree")) let g:NERDShutUp=1 endif if isdirectory(expand("~/.vim/bundle/matchit.zip")) let b:match_ignorecase = 1 endif " } " AutoCloseTag { " Make it so AutoCloseTag works for xml and xhtml files as well au FileType xhtml,xml ru ftplugin/html/autoclosetag.vim nmap ac ToggleAutoCloseMappings " } " NerdTree { if isdirectory(expand("~/.vim/bundle/nerdtree")) nnoremap :NERDTreeToggle " map e :NERDTreeFind nmap nt :NERDTreeFind let NERDTreeShowBookmarks=1 let NERDTreeIgnore=['\.py[cd]$', '\~$', '\.swo$', '\.swp$', '^\.git$', '^\.hg$', '^\.svn$', '\.bzr$'] let NERDTreeChDirMode=0 let NERDTreeQuitOnOpen=1 let NERDTreeMouseMode=2 let NERDTreeShowHidden=1 let NERDTreeKeepTreeInNewTab=1 endif " } " JSON { nmap jt :%!python -m json.tool:set filetype=json let g:vim_json_syntax_conceal = 0 " } " indent_guides { if isdirectory(expand("~/.vim/bundle/vim-indent-guides/")) let g:indent_guides_start_level = 2 let g:indent_guides_guide_size = 1 let g:indent_guides_enable_on_vim_startup = 0 map f :IndentGuidesToggle endif " } " vim-airline { " Set configuration options for the statusline plugin vim-airline. " Use the powerline theme and optionally enable powerline symbols. " To use the symbols , , , , , , and .in the statusline " segments add the following to your .vimrc.before.local file: " let g:airline_powerline_fonts=1 " If the previous symbols do not render for you then install a " powerline enabled font. " See `:echo g:airline_theme_map` for some more choices " Default in terminal vim is 'dark' let g:airline_section_z = '' let g:airline_section_y = '' if isdirectory(expand("~/.vim/bundle/vim-airline-themes/")) if !exists('g:airline_theme') let g:airline_theme = 'solarized' endif endif " } " } " Functions { " Initialize directories { function! InitializeDirectories() let parent = $HOME let prefix = 'vim' let dir_list = { \ 'backup': 'backupdir', \ 'views': 'viewdir', \ 'swap': 'directory' } if has('persistent_undo') let dir_list['undo'] = 'undodir' endif " To specify a different directory in which to place the vimbackup, " vimviews, vimundo, and vimswap files/directories, add the following to " your .vimrc.before.local file: " let g:spf13_consolidated_directory = " eg: let g:spf13_consolidated_directory = $HOME . '/.vim/' let g:spf13_consolidated_directory = $HOME . '/.vim/.' if exists('g:spf13_consolidated_directory') let common_dir = g:spf13_consolidated_directory . prefix else let common_dir = parent . '/.' . prefix endif for [dirname, settingname] in items(dir_list) let directory = common_dir . dirname . '/' if exists("*mkdir") if !isdirectory(directory) call mkdir(directory) endif endif if !isdirectory(directory) echo "Warning: Unable to create backup directory: " . directory echo "Try: mkdir -p " . directory else let directory = substitute(directory, " ", "\\\\ ", "g") exec "set " . settingname . "=" . directory endif endfor endfunction call InitializeDirectories() " } " Initialize NERDTree as needed { function! NERDTreeInitAsNeeded() redir => bufoutput buffers! redir END let idx = stridx(bufoutput, "NERD_tree") if idx > -1 NERDTreeMirror NERDTreeFind wincmd l endif endfunction " } " Strip whitespace { function! StripTrailingWhitespace() " Preparation: save last search, and cursor position. let _s=@/ let l = line(".") let c = col(".") " do the business: %s/\s\+$//e " clean up: restore previous search history, and cursor position let @/=_s call cursor(l, c) endfunction " } " Shell command { function! s:RunShellCommand(cmdline) botright new setlocal buftype=nofile setlocal bufhidden=delete setlocal nobuflisted setlocal noswapfile setlocal nowrap setlocal filetype=shell setlocal syntax=shell call setline(1, a:cmdline) call setline(2, substitute(a:cmdline, '.', '=', 'g')) execute 'silent $read !' . escape(a:cmdline, '%#') setlocal nomodifiable 1 endfunction command! -complete=file -nargs=+ Shell call s:RunShellCommand() " e.g. Grep current file for : Shell grep -Hn % " } " Fix file type error for typescript autocmd BufNewFile,BufRead *.ts set filetype=typescript " leader s change occurence :nnoremap s :%s/\<\>/ " leader num change tab nnoremap 1 :b1 nnoremap 2 :b2 nnoremap 3 :b3 nnoremap 4 :b4 nnoremap 5 :b5 nnoremap 6 :b6 nnoremap 7 :b7 nnoremap 8 :b8 nnoremap 9 :b9 "let c = 0 "while c <= 100 " execute 'nnoremap '.c ':b'.c.'' " let c += 1 "endwhile " These are to cancel the default behavior of d, D, c, C " to put the text they delete in the default register. " Note that this means e.g. "ad won't copy the text into " register a anymore. You have to explicitly yank it. " " TIPS: you can type :registers to view value in each registers vnoremap p "0p " TIPS: :hi can be used to check current highlight options " Coc has wired floating color, this is an attempt to fix it highlight CocFloating ctermbg=green highlight FgCocErrorFloatBgCocFloating cterm=bold ctermfg=124 guifg=DarkRed ctermbg=green " c highlight fix highlight cComment ctermfg=12 guifg=#458588 " copy to system set clipboard=unnamed " space-d jump to definition if coc is installed "nnoremap d :call CocAction('jumpDefinition', v: false) "nnoremap r :call CocAction('jumpReferences', v: false) if filereadable(expand("~/.vim-config/.exp-coc-config")) source ~/.vim-config/.exp-coc-config endif " fix paste mess up when using tmux if &term =~ "screen" let &t_BE = "\e[?2004h" let &t_BD = "\e[?2004l" exec "set t_PS=\e[200~" exec "set t_PE=\e[201~" endif