diff options
Diffstat (limited to 'vim/init')
| -rw-r--r-- | vim/init/keymaps.vim | 125 |
1 files changed, 77 insertions, 48 deletions
diff --git a/vim/init/keymaps.vim b/vim/init/keymaps.vim index 5639e11..1a5e88a 100644 --- a/vim/init/keymaps.vim +++ b/vim/init/keymaps.vim | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | "====================================================================== | 1 | "====================================================================== |
| 2 | " Only for key mapping | 2 | " Only for key mapping |
| 3 | "====================================================================== | 3 | "====================================================================== |
| 4 | " vim: sw=2 ts=2 foldmethod=marker foldmarker={{{,}}} | ||
| 4 | 5 | ||
| 5 | " COMMON_MAPPING ----------------{{{ | 6 | " COMMON_MAPPING ----------------{{{ |
| 6 | 7 | ||
| @@ -8,17 +9,17 @@ | |||
| 8 | map <space> / | 9 | map <space> / |
| 9 | 10 | ||
| 10 | " Escape normal mode by <C-c> | 11 | " Escape normal mode by <C-c> |
| 11 | imap <C-c> <Esc>l | 12 | inoremap <C-c> <Esc>l |
| 12 | 13 | ||
| 13 | " Search for selected test | 14 | " Search for selected test |
| 14 | vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR> | 15 | vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR> |
| 15 | " Set wrap | ||
| 16 | 16 | ||
| 17 | " Set wrap | ||
| 17 | nnoremap <leader>W :set wrap!<CR> | 18 | nnoremap <leader>W :set wrap!<CR> |
| 18 | 19 | ||
| 19 | " Fast saving | 20 | " Fast saving |
| 20 | function! s:WriteOrEnterFileName() | 21 | function! s:WriteOrEnterFileName() |
| 21 | if !empty(expand('%')) | w! | else | call feedkeys(":w ") | endif | 22 | if !empty(expand('%')) | write! | else | call feedkeys(":w ") | endif |
| 22 | endfunction | 23 | endfunction |
| 23 | nmap <leader>w :call <SID>WriteOrEnterFileName()<CR> | 24 | nmap <leader>w :call <SID>WriteOrEnterFileName()<CR> |
| 24 | 25 | ||
| @@ -38,27 +39,9 @@ augroup vimrc_CRfix | |||
| 38 | autocmd CmdwinEnter * nnoremap <buffer> <C-c> <C-c> | 39 | autocmd CmdwinEnter * nnoremap <buffer> <C-c> <C-c> |
| 39 | augroup END | 40 | augroup END |
| 40 | 41 | ||
| 41 | " Open terminal | ||
| 42 | " nnoremap <leader>, :terminal ++noclose<CR> | ||
| 43 | vnoremap <leader>, :terminal<CR> | ||
| 44 | |||
| 45 | " Paste register 0 | ||
| 46 | nnoremap <C-p> "0p | ||
| 47 | |||
| 48 | " Toggle paste mode on and off | ||
| 49 | map <leader>pp :setlocal paste!<CR> | ||
| 50 | |||
| 51 | " Copy from system clipboard | ||
| 52 | nnoremap <leader>P :r !xsel -ob<CR> | ||
| 53 | vnoremap Y "+y | ||
| 54 | |||
| 55 | " Move one line up and down | ||
| 56 | nnoremap <C-j> ddp | ||
| 57 | nnoremap <C-k> ddkP | ||
| 58 | |||
| 59 | " In case ALT key is not working | 42 | " In case ALT key is not working |
| 60 | " execute "set <M-1>=\e1" | ||
| 61 | " execute "set <M-2>=\e2" | 43 | " execute "set <M-2>=\e2" |
| 44 | " execute "set <M-1>=\e1" | ||
| 62 | " execute "set <M-3>=\e3" | 45 | " execute "set <M-3>=\e3" |
| 63 | " execute "set <M-4>=\e4" | 46 | " execute "set <M-4>=\e4" |
| 64 | " execute "set <M-5>=\e5" | 47 | " execute "set <M-5>=\e5" |
| @@ -81,8 +64,6 @@ nnoremap <leader>S [s | |||
| 81 | " Show full path by default | 64 | " Show full path by default |
| 82 | nnoremap <C-g> 1<C-g> | 65 | nnoremap <C-g> 1<C-g> |
| 83 | 66 | ||
| 84 | nnoremap S S<ESC> | ||
| 85 | |||
| 86 | " Translate by Google API | 67 | " Translate by Google API |
| 87 | vnoremap Tz :!trans -t zh-TW -b<CR> | 68 | vnoremap Tz :!trans -t zh-TW -b<CR> |
| 88 | vnoremap Te :!trans -t en-US -b<CR> | 69 | vnoremap Te :!trans -t en-US -b<CR> |
| @@ -193,6 +174,27 @@ inoremap <silent><M-9> <Esc>:tablast<CR> | |||
| 193 | " }}} | 174 | " }}} |
| 194 | 175 | ||
| 195 | " }}} | 176 | " }}} |
| 177 | " REGISTER {{{ | ||
| 178 | " Paste register 0 | ||
| 179 | nnoremap <C-p> "0p | ||
| 180 | |||
| 181 | " Toggle paste mode on and off | ||
| 182 | map <leader>pp :setlocal paste!<CR> | ||
| 183 | |||
| 184 | " Copy from system clipboard | ||
| 185 | nnoremap <leader>P :r !xsel -ob<CR> | ||
| 186 | vnoremap Y "+y | ||
| 187 | " }}} | ||
| 188 | " EDIT {{{ | ||
| 189 | |||
| 190 | " Move one line up and down | ||
| 191 | nnoremap <C-j> ddp | ||
| 192 | nnoremap <C-k> ddkP | ||
| 193 | |||
| 194 | " Clear current line | ||
| 195 | nnoremap S S<ESC> | ||
| 196 | |||
| 197 | " }}} | ||
| 196 | " MANAGE_VIMRC ----------------{{{ | 198 | " MANAGE_VIMRC ----------------{{{ |
| 197 | 199 | ||
| 198 | " source .vimrc | 200 | " source .vimrc |
| @@ -395,18 +397,22 @@ endfunc | |||
| 395 | noremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR> | 397 | noremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR> |
| 396 | noremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR> | 398 | noremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR> |
| 397 | 399 | ||
| 400 | nnoremap zi zizz | ||
| 401 | |||
| 398 | " Show fold level when it changes | 402 | " Show fold level when it changes |
| 399 | nnoremap zm zm:set foldlevel<CR> | 403 | nnoremap zm zm:set foldlevel<CR> |
| 400 | nnoremap zr zr:set foldlevel<CR> | 404 | nnoremap zr zr:set foldlevel<CR> |
| 401 | 405 | ||
| 402 | " Fold all except selection | 406 | " Fold all except selection |
| 403 | vnoremap zF :<C-u>call UnfoldSelectionOnly()<CR> | 407 | vnoremap zF :<C-u>call ToggleUnfoldSelection()<CR> |
| 404 | " Resume | 408 | " Resume |
| 405 | nnoremap zF :<C-u>call ResumeFoldmethod()<CR>zv | 409 | nnoremap zF :call ToggleUnfoldSelection()<CR>zv |
| 410 | |||
| 411 | nnoremap \z :call GrayOutOtherFolds()<CR> | ||
| 406 | 412 | ||
| 407 | " Select current fold | 413 | " Select current fold |
| 408 | xnoremap az :<C-U>silent!normal![zV]z<CR> | 414 | xnoremap az :<C-U>silent! keepjumps normal![zV]z<CR> |
| 409 | xnoremap iz :<C-U>silent!normal![zjV]zk<CR> | 415 | xnoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> |
| 410 | 416 | ||
| 411 | " Use l to open fold | 417 | " Use l to open fold |
| 412 | nnoremap <expr> l foldclosed('.') == -1 ? 'l' : 'zo' | 418 | nnoremap <expr> l foldclosed('.') == -1 ? 'l' : 'zo' |
| @@ -415,29 +421,49 @@ nnoremap <expr> l foldclosed('.') == -1 ? 'l' : 'zo' | |||
| 415 | nnoremap <expr> zo foldclosed('.') == -1 ? 'zjzo' : 'zo' | 421 | nnoremap <expr> zo foldclosed('.') == -1 ? 'zjzo' : 'zo' |
| 416 | nnoremap <expr> zO foldclosed('.') == -1 ? 'zjzO' : 'zO' | 422 | nnoremap <expr> zO foldclosed('.') == -1 ? 'zjzO' : 'zO' |
| 417 | 423 | ||
| 424 | " Go to next fold and unfold | ||
| 418 | nnoremap zJ zjzx | 425 | nnoremap zJ zjzx |
| 419 | nnoremap zK zkzx | 426 | nnoremap zK zkzx |
| 420 | 427 | ||
| 421 | " Fold file except selection | 428 | " Fold file except selection |
| 422 | let b:original_foldmethod = "" | 429 | autocmd BufEnter * let b:unfold_selection = 0 |
| 423 | function! UnfoldSelectionOnly() | 430 | function! ToggleUnfoldSelection() |
| 424 | echo 'Unfold'..&foldmethod | 431 | if !b:unfold_selection |
| 425 | let b:original_foldmethod = &foldmethod | 432 | let b:unfold_selection = 1 |
| 426 | let &foldmethod = "manual" | 433 | mkview |
| 427 | norm! zE | 434 | echo 'Unfold'..&foldmethod |
| 428 | execute "0,'<-1fold" | 435 | |
| 429 | execute "'>+1,$fold" | 436 | let &foldmethod = "manual" |
| 437 | norm! zE | ||
| 438 | execute "0,'<-1fold" | ||
| 439 | execute "'>+1,$fold" | ||
| 440 | else | ||
| 441 | let b:unfold_selection = 0 | ||
| 442 | loadview | ||
| 443 | endif | ||
| 444 | endfunction | ||
| 445 | |||
| 446 | autocmd BufEnter * let b:clear_matches = 0 | ||
| 447 | function! GrayOutOtherFolds() | ||
| 448 | if b:clear_matches | ||
| 449 | let b:clear_matches = 0 | ||
| 450 | call clearmatches() | ||
| 451 | else | ||
| 452 | let b:clear_matches = 1 | ||
| 453 | let pos = getpos('.') | ||
| 454 | exe "norm! [zV]z\<C-c>" | ||
| 455 | call matchadd('Folded', '\%<'.line("'<").'l') | ||
| 456 | call matchadd('Folded', '\%>'.line("'>").'l') | ||
| 457 | norm! zR | ||
| 458 | call setpos('.', pos) | ||
| 459 | endif | ||
| 430 | endfunction | 460 | endfunction |
| 431 | function! ResumeFoldmethod() | ||
| 432 | norm! zE | ||
| 433 | let &foldmethod = empty(b:original_foldmethod) ? "indent" : b:original_foldmethod | ||
| 434 | endfunc | ||
| 435 | 461 | ||
| 436 | " }}} | 462 | " }}} |
| 437 | " HIGHLIGHT ----------------{{{ | 463 | " HIGHLIGHT ----------------{{{ |
| 438 | 464 | ||
| 439 | " Disable highlight when <leader><CR> is pressed | 465 | " Disable highlight when <leader><CR> is pressed |
| 440 | map <silent> <leader><CR> :noh<CR> | 466 | noremap <silent> <leader><CR> :noh<CR> |
| 441 | 467 | ||
| 442 | function! HiFile() | 468 | function! HiFile() |
| 443 | let i = 1 | 469 | let i = 1 |
| @@ -454,7 +480,7 @@ endfunction | |||
| 454 | function! GetHighlightGroupName() | 480 | function! GetHighlightGroupName() |
| 455 | let l:syntaxID = synID(line('.'), col('.'), 1) | 481 | let l:syntaxID = synID(line('.'), col('.'), 1) |
| 456 | let l:groupName = synIDattr(l:syntaxID, 'name') | 482 | let l:groupName = synIDattr(l:syntaxID, 'name') |
| 457 | echo "Highlight Group Name: " . l:groupName | 483 | echo l:groupName |
| 458 | endfunction | 484 | endfunction |
| 459 | nnoremap <leader>H :call GetHighlightGroupName()<CR> | 485 | nnoremap <leader>H :call GetHighlightGroupName()<CR> |
| 460 | 486 | ||
| @@ -485,9 +511,12 @@ vnoremap ` <ESC>`<i`<ESC>`>la`<ESC> | |||
| 485 | vnoremap Q <ESC>`<i「<ESC>`>la」<ESC> | 511 | vnoremap Q <ESC>`<i「<ESC>`>la」<ESC> |
| 486 | 512 | ||
| 487 | function! AddSpaceForSelection() | 513 | function! AddSpaceForSelection() |
| 514 | " If visual selection by lines, add empty space at top and bottom | ||
| 488 | if line("'<") != line("'>") || (col("'<") == 1 && col("'>") == len(getline('.'))+1) | 515 | if line("'<") != line("'>") || (col("'<") == 1 && col("'>") == len(getline('.'))+1) |
| 489 | '< norm! O | 516 | '< norm! O | |
| 490 | '> norm! o | 517 | '> norm! o |
| 518 | exe "norm! "..(line("'<")-1).."GV"..(line("'>")+1).."G" | ||
| 519 | " Otherwise, add space at start and end column | ||
| 491 | else | 520 | else |
| 492 | call cursor('.', col("'<")) | 521 | call cursor('.', col("'<")) |
| 493 | execute "norm! i\<space>" | 522 | execute "norm! i\<space>" |
| @@ -543,7 +572,7 @@ autocmd Modechanged [vV\x16]*:* let g:search_not_in_register = 1 | |||
| 543 | function! ExpandSelectionBySearch(sep) | 572 | function! ExpandSelectionBySearch(sep) |
| 544 | if g:search_not_in_register | 573 | if g:search_not_in_register |
| 545 | " Save current selection to register, and keep selection | 574 | " Save current selection to register, and keep selection |
| 546 | execute 'norm ygv' | 575 | norm! ygv |
| 547 | let g:search_not_in_register = 0 | 576 | let g:search_not_in_register = 0 |
| 548 | endif | 577 | endif |
| 549 | " Use register s to go to next search, counts/total is displayed in | 578 | " Use register s to go to next search, counts/total is displayed in |
| @@ -565,7 +594,7 @@ vnoremap <CR> <Cmd>call SubstituteBySearch()<CR> | |||
| 565 | nnoremap <leader>si :exe ":sign place " .. line('.') .. " line=" .. line('.') .. " name=piet file=" .. expand("%:p")<CR> | 594 | nnoremap <leader>si :exe ":sign place " .. line('.') .. " line=" .. line('.') .. " name=piet file=" .. expand("%:p")<CR> |
| 566 | nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR> | 595 | nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR> |
| 567 | 596 | ||
| 568 | " }} | 597 | " }}} |
| 569 | " GIT_TIG ----------------{{{ | 598 | " GIT_TIG ----------------{{{ |
| 570 | 599 | ||
| 571 | let g:tig_explorer_keymap_commit_split = '<C-s>' | 600 | let g:tig_explorer_keymap_commit_split = '<C-s>' |
| @@ -575,7 +604,7 @@ nnoremap <C-t>s <Cmd>TigStatus<CR> | |||
| 575 | nnoremap <C-t>b <Cmd>TigBlame<CR> | 604 | nnoremap <C-t>b <Cmd>TigBlame<CR> |
| 576 | 605 | ||
| 577 | " }}} | 606 | " }}} |
| 578 | " Markdown items (temproray solution) ----------------{{{ | 607 | " Tmp: Markdown items (temproray solution) ----------------{{{ |
| 579 | 608 | ||
| 580 | " Toggle list item in markdown: "- [ ] XXX" -> "XXX" -> "- XXX" -> "- [ ] XXX" | 609 | " Toggle list item in markdown: "- [ ] XXX" -> "XXX" -> "- XXX" -> "- [ ] XXX" |
| 581 | " autocmd FileType markdown nnoremap <buffer> <leader>i V:!sed -E '/^ *- \[.\]/ { s/^( *)- \[.\] */\1/; q; }; /^ *[^[:space:]-]/ { s/^( *)/\1- /; q; }; /^ *- / { s/^( *)- /\1- [ ] /; q; }'<CR><CR> | 610 | " autocmd FileType markdown nnoremap <buffer> <leader>i V:!sed -E '/^ *- \[.\]/ { s/^( *)- \[.\] */\1/; q; }; /^ *[^[:space:]-]/ { s/^( *)/\1- /; q; }; /^ *- / { s/^( *)- /\1- [ ] /; q; }'<CR><CR> |
| @@ -584,14 +613,14 @@ nnoremap <C-t>b <Cmd>TigBlame<CR> | |||
| 584 | " Toggle task status: "- [ ] " -> "- [x]" -> "- [.] " -> "- [ ] " | 613 | " Toggle task status: "- [ ] " -> "- [x]" -> "- [.] " -> "- [ ] " |
| 585 | " nnoremap <leader>x V:!sed -E '/^ *- \[ \]/ { s/^( *)- \[ \]/\1- [x]/; q; }; /^ *- \[\x\]/ { s/^( *)- \[\x\]/\1- [.]/; q; }; /^ *- \[\.\]/ { s/^( *)- \[\.\]/\1- [ ]/; q; }'<CR><CR> | 614 | " nnoremap <leader>x V:!sed -E '/^ *- \[ \]/ { s/^( *)- \[ \]/\1- [x]/; q; }; /^ *- \[\x\]/ { s/^( *)- \[\x\]/\1- [.]/; q; }; /^ *- \[\.\]/ { s/^( *)- \[\.\]/\1- [ ]/; q; }'<CR><CR> |
| 586 | " }}} | 615 | " }}} |
| 587 | " Common system command ----------------{{{ | 616 | " Tmp: Common system command ----------------{{{ |
| 588 | " Show date selector | 617 | " Show date selector |
| 589 | nnoremap <leader>dd :r !sh -c 'LANG=en zenity --calendar --date-format="\%Y.\%m.\%d" 2>/dev/null'<CR><CR> | 618 | nnoremap <leader>dd :r !sh -c 'LANG=en zenity --calendar --date-format="\%Y.\%m.\%d" 2>/dev/null'<CR><CR> |
| 590 | nnoremap <leader>dD :r !sh -c 'LANG=en zenity --calendar --date-format="\%a \%b \%d" 2>/dev/null'<CR><CR> | 619 | nnoremap <leader>dD :r !sh -c 'LANG=en zenity --calendar --date-format="\%a \%b \%d" 2>/dev/null'<CR><CR> |
| 591 | nnoremap <leader>dt :r !date +\%H:\%m<CR>A | 620 | nnoremap <leader>dt :r !date +\%H:\%m<CR>A |
| 592 | 621 | ||
| 593 | " }}} | 622 | " }}} |
| 594 | " Compile ----------------{{{ | 623 | " Tmp: Compile ----------------{{{ |
| 595 | 624 | ||
| 596 | " 编译运行 C/C++ 项目 | 625 | " 编译运行 C/C++ 项目 |
| 597 | " 详细见:http://www.skywind.me/blog/archives/2084 | 626 | " 详细见:http://www.skywind.me/blog/archives/2084 |