diff options
Diffstat (limited to 'vim/init/keymaps.vim')
-rw-r--r-- | vim/init/keymaps.vim | 354 |
1 files changed, 181 insertions, 173 deletions
diff --git a/vim/init/keymaps.vim b/vim/init/keymaps.vim index e8cb61d..01726b9 100644 --- a/vim/init/keymaps.vim +++ b/vim/init/keymaps.vim | |||
@@ -168,6 +168,138 @@ nnoremap <C-k> ddkP | |||
168 | nnoremap S S<ESC> | 168 | nnoremap S S<ESC> |
169 | 169 | ||
170 | " }}} | 170 | " }}} |
171 | " SURROUND {{{ | ||
172 | |||
173 | inoremap ' ''<Left> | ||
174 | inoremap " ""<Left> | ||
175 | inoremap ( ()<Left> | ||
176 | inoremap [ []<Left> | ||
177 | inoremap { {}<Left> | ||
178 | |||
179 | vnoremap q <ESC>`<i"<ESC>`>la"<ESC> | ||
180 | vnoremap ( <ESC>`<i(<ESC>`>la)<ESC> | ||
181 | vnoremap [ <ESC>`<i[<ESC>`>la]<ESC> | ||
182 | vnoremap { <ESC>`<i{<ESC>`>la}<ESC> | ||
183 | vnoremap Q <ESC>`<i「<ESC>`>la」<ESC> | ||
184 | " vnoremap ' <ESC>`<i'<ESC>`>la'<ESC> | ||
185 | " vnoremap ` <ESC>`<i`<ESC>`>la`<ESC> | ||
186 | |||
187 | function! AddSpaceForSelection() | ||
188 | " If visual selection by lines, add empty space at top and bottom | ||
189 | if line("'<") != line("'>") || (col("'<") == 1 && col("'>") == len(getline('.'))+1) | ||
190 | '< norm! O | ||
191 | '> norm! o | ||
192 | exe "norm! "..(line("'<")-1).."GV"..(line("'>")+1).."G" | ||
193 | " Otherwise, add space at start and end column | ||
194 | else | ||
195 | call cursor('.', col("'<")) | ||
196 | execute "norm! i\<space>" | ||
197 | call cursor('.', col("'>")+1) | ||
198 | execute "norm! a\<space>" | ||
199 | endif | ||
200 | endfunction | ||
201 | vnoremap <space> :<C-u>call AddSpaceForSelection()<CR> | ||
202 | |||
203 | " }}} | ||
204 | " SEARCH/SUBSTITUTE {{{ | ||
205 | |||
206 | " Search for selected test | ||
207 | vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR> | ||
208 | |||
209 | nnoremap g/ gv<esc>/\%V | ||
210 | vnoremap g/ <esc>/\%V | ||
211 | |||
212 | " Substitue across file | ||
213 | vnoremap <leader>s y:%s//<C-R>0/g<LEFT><LEFT> | ||
214 | |||
215 | " Usage: Press <TAB> n times for area, and <CR> for substitute | ||
216 | let g:search_selection = 0 | ||
217 | " When leaving visual mode, resume search_selection | ||
218 | autocmd Modechanged [vV\x16]*:* let g:search_selection = 0 | ||
219 | xmap <expr> <TAB> g:search_selection ? "//e<CR>" : "*:let g:search_selection = 1<CR>gv//e<CR>" | ||
220 | xmap <expr> <S-TAB> g:search_selection ? "??<CR>" : "*:let g:search_selection = 1<CR>gv??<CR>" | ||
221 | vnoremap <CR> :s//<C-R>0/g<Left><Left> | ||
222 | |||
223 | " }}} | ||
224 | " SIGN {{{ | ||
225 | |||
226 | nnoremap <leader><leader>sc :<C-\>e'set signcolumn='..&signcolumn<CR> | ||
227 | |||
228 | nnoremap <leader>si :exe ":sign place " .. line('.') .. " line=" .. line('.') .. " name=piet file=" .. expand("%:p")<CR> | ||
229 | nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR> | ||
230 | |||
231 | " }}} | ||
232 | " FOLD {{{ | ||
233 | |||
234 | " Set fold options | ||
235 | nnoremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR> | ||
236 | nnoremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR> | ||
237 | |||
238 | " Toggle fold and foldcolumn | ||
239 | nnoremap <expr> zi "zizz:silent set foldcolumn="..(&foldenable ? "0" : "auto:3").."\<CR>" | ||
240 | |||
241 | " Show fold level when it changes | ||
242 | nnoremap zm zm:set foldlevel?<CR> | ||
243 | nnoremap zr zr:set foldlevel?<CR> | ||
244 | |||
245 | " Fold all except selection | ||
246 | vnoremap zF :<C-u>call ToggleUnfoldSelection()<CR> | ||
247 | " Resume | ||
248 | nnoremap zF :call ToggleUnfoldSelection()<CR>zv | ||
249 | |||
250 | vnoremap \z :call GrayOutOthers()<CR> | ||
251 | |||
252 | " Select current fold | ||
253 | onoremap az :<C-U>silent! keepjumps normal![zV]z<CR> | ||
254 | xnoremap az :<C-U>silent! keepjumps normal![zV]z<CR> | ||
255 | onoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> | ||
256 | xnoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> | ||
257 | |||
258 | " Use l to open fold | ||
259 | nnoremap <expr> l foldclosed('.') == -1 ? 'l' : 'zo' | ||
260 | |||
261 | " Open fold in next line | ||
262 | nnoremap <expr> zo foldclosed('.') == -1 ? 'zjzo' : 'zo' | ||
263 | nnoremap <expr> zO foldclosed('.') == -1 ? 'zjzO' : 'zO' | ||
264 | |||
265 | " Go to next fold and unfold | ||
266 | nnoremap zJ zjzx | ||
267 | nnoremap zK zkzx | ||
268 | |||
269 | " Fold file except selection | ||
270 | autocmd BufEnter * let b:unfold_selection = 0 | ||
271 | function! ToggleUnfoldSelection() | ||
272 | if !b:unfold_selection | ||
273 | let b:unfold_selection = 1 | ||
274 | mkview | ||
275 | echo 'Unfold'..&foldmethod | ||
276 | |||
277 | let &foldmethod = "manual" | ||
278 | norm! zE | ||
279 | execute "1,'<-1fold" | ||
280 | execute "'>+1,$fold" | ||
281 | else | ||
282 | let b:unfold_selection = 0 | ||
283 | loadview | ||
284 | endif | ||
285 | endfunction | ||
286 | |||
287 | autocmd BufEnter * let b:clear_matches = 0 | ||
288 | function! GrayOutOthers() | ||
289 | if b:clear_matches | ||
290 | let b:clear_matches = 0 | ||
291 | call clearmatches() | ||
292 | else | ||
293 | let b:clear_matches = 1 | ||
294 | let pos = getpos('.') | ||
295 | call matchadd('Folded', '\%<'.line("'<").'l') | ||
296 | call matchadd('Folded', '\%>'.line("'>").'l') | ||
297 | norm! zR | ||
298 | call setpos('.', pos) | ||
299 | endif | ||
300 | endfunction | ||
301 | |||
302 | " }}} | ||
171 | " REGISTER {{{ | 303 | " REGISTER {{{ |
172 | " Paste register 0 | 304 | " Paste register 0 |
173 | nnoremap <C-p> "0p | 305 | nnoremap <C-p> "0p |
@@ -278,49 +410,6 @@ nnoremap <expr> z> ":\<C-u>call ChangeUnfold(1,"..v:count..")\<CR>" | |||
278 | nnoremap <expr> z< ":\<C-u>call ChangeUnfold(0,"..v:count..")\<CR>" | 410 | nnoremap <expr> z< ":\<C-u>call ChangeUnfold(0,"..v:count..")\<CR>" |
279 | 411 | ||
280 | "}}} | 412 | "}}} |
281 | " TERMINAL {{{ | ||
282 | |||
283 | " Use <leader>z to toggle | ||
284 | let g:alacritty_extra_padding = 0 | ||
285 | function! ToggleWinPadding() | ||
286 | if g:alacritty_extra_padding | ||
287 | !alacritty msg config --window-id $WINDOWID --reset | ||
288 | call SetEmulaterBackground() | ||
289 | hi EndOfBuffer None | ||
290 | hi MsgArea None | ||
291 | else | ||
292 | redir => output | hi LineNr | redir END | ||
293 | let bg_color = matchstr(output, 'guibg=\zs[^\s]\+\ze') | ||
294 | |||
295 | try | ||
296 | exe "hi EndOfBuffer guifg="..bg_color.." guibg="..bg_color | ||
297 | exe "hi MsgArea guibg="..bg_color | ||
298 | endtry | ||
299 | exe "!alacritty msg config --window-id $WINDOWID window.padding.x=300 'colors.primary.background=\"\\"..bg_color.."\"'" | ||
300 | endif | ||
301 | |||
302 | let g:alacritty_extra_padding = !g:alacritty_extra_padding | ||
303 | endfunc | ||
304 | nnoremap <leader>z <Cmd>silent call ToggleWinPadding()<CR> | ||
305 | |||
306 | " In case ALT key is not working | ||
307 | " execute "set <M-2>=\e2" | ||
308 | " execute "set <M-1>=\e1" | ||
309 | " execute "set <M-3>=\e3" | ||
310 | " execute "set <M-4>=\e4" | ||
311 | " execute "set <M-5>=\e5" | ||
312 | " execute "set <M-6>=\e6" | ||
313 | " execute "set <M-7>=\e7" | ||
314 | " execute "set <M-8>=\e8" | ||
315 | " execute "set <M-9>=\e9" | ||
316 | " execute "set <M-0>=\e0" | ||
317 | " execute "set <M-f>=\ef" | ||
318 | " execute "set <M-b>=\eb" | ||
319 | " execute "set <M-d>=\ed" | ||
320 | " execute "set <M-l>=\el" | ||
321 | " execute "set <M-h>=\eh" | ||
322 | |||
323 | "}}} | ||
324 | " MANAGE_VIMRC {{{ | 413 | " MANAGE_VIMRC {{{ |
325 | 414 | ||
326 | " source .vimrc | 415 | " source .vimrc |
@@ -341,11 +430,18 @@ nnoremap so :set<space> | |||
341 | nnoremap <leader><leader>ft :<C-\>e'set filetype='..&filetype<CR> | 430 | nnoremap <leader><leader>ft :<C-\>e'set filetype='..&filetype<CR> |
342 | nnoremap <leader><leader>sw :<C-\>e'set shiftwidth='..&shiftwidth<CR> | 431 | nnoremap <leader><leader>sw :<C-\>e'set shiftwidth='..&shiftwidth<CR> |
343 | nnoremap <leader><leader>ts :<C-\>e'set tabstop='..&tabstop<CR> | 432 | nnoremap <leader><leader>ts :<C-\>e'set tabstop='..&tabstop<CR> |
344 | nnoremap \e :set expandtab!<CR>:set expandtab?<CR> | 433 | nnoremap \E :set expandtab!<CR>:set expandtab?<CR> |
434 | nnoremap \e :call ToggleEventIgnore()<CR> | ||
345 | nnoremap \l :set list!<CR>:set list?<CR> | 435 | nnoremap \l :set list!<CR>:set list?<CR> |
346 | nnoremap \n :set nu!<CR>:set nu?<CR> | 436 | nnoremap \n :set nu!<CR>:set nu?<CR> |
347 | nnoremap \r :set relativenumber!<CR>:set rnu?<CR> | 437 | nnoremap \r :set relativenumber!<CR>:set rnu?<CR> |
348 | 438 | ||
439 | function! ToggleEventIgnore() | ||
440 | let operator = empty(&eventignore) ? "+=" : "-=" | ||
441 | exe "set eventignore".operator.'all' | ||
442 | set eventignore? | ||
443 | endfunc | ||
444 | |||
349 | " Open a new buffer | 445 | " Open a new buffer |
350 | nnoremap <leader>B :enew<CR> | 446 | nnoremap <leader>B :enew<CR> |
351 | nnoremap <leader>O :e /tmp/buffer<CR> | 447 | nnoremap <leader>O :e /tmp/buffer<CR> |
@@ -380,6 +476,7 @@ function! CloseBufferSafely() | |||
380 | if &modified | 476 | if &modified |
381 | let answer = confirm("Save changes?", "&Yes\n&No\n&Cancel") | 477 | let answer = confirm("Save changes?", "&Yes\n&No\n&Cancel") |
382 | if answer == 1 | write | endif | 478 | if answer == 1 | write | endif |
479 | if answer == 2 && empty(bufname()) | bd! | return | endif | ||
383 | if answer == 3 | return | endif | 480 | if answer == 3 | return | endif |
384 | if answer == "" | return | endif | 481 | if answer == "" | return | endif |
385 | endif | 482 | endif |
@@ -403,7 +500,7 @@ function! Bye() | |||
403 | elseif &diff | 500 | elseif &diff |
404 | silent call CloseBuffersForDiff() | 501 | silent call CloseBuffersForDiff() |
405 | elseif len(windows) >1 | 502 | elseif len(windows) >1 |
406 | quit | 503 | quit! |
407 | else | 504 | else |
408 | call CloseBufferSafely() | 505 | call CloseBufferSafely() |
409 | " silent! call CloseBufferSafely() | 506 | " silent! call CloseBufferSafely() |
@@ -520,80 +617,52 @@ function! Tab_MoveRight() | |||
520 | endif | 617 | endif |
521 | endfunc | 618 | endfunc |
522 | " }}} | 619 | " }}} |
523 | " FOLD {{{ | 620 | " TERMINAL {{{ |
524 | |||
525 | " Set fold options | ||
526 | nnoremap <leader><leader>fm :<C-\>e'set foldmethod='..&foldmethod<CR> | ||
527 | nnoremap <leader><leader>fc :<C-\>e'set foldcolumn='..&foldcolumn<CR> | ||
528 | |||
529 | " Toggle fold and foldcolumn | ||
530 | nnoremap <expr> zi "zizz:silent set foldcolumn="..(&foldenable ? "0" : "auto:3").."\<CR>" | ||
531 | |||
532 | " Show fold level when it changes | ||
533 | nnoremap zm zm:set foldlevel?<CR> | ||
534 | nnoremap zr zr:set foldlevel?<CR> | ||
535 | |||
536 | " Fold all except selection | ||
537 | vnoremap zF :<C-u>call ToggleUnfoldSelection()<CR> | ||
538 | " Resume | ||
539 | nnoremap zF :call ToggleUnfoldSelection()<CR>zv | ||
540 | |||
541 | nnoremap \z :call GrayOutOtherFolds()<CR> | ||
542 | |||
543 | " Select current fold | ||
544 | onoremap az :<C-U>silent! keepjumps normal![zV]z<CR> | ||
545 | xnoremap az :<C-U>silent! keepjumps normal![zV]z<CR> | ||
546 | onoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> | ||
547 | xnoremap iz :<C-U>silent! keepjumps normal![zjV]zk<CR> | ||
548 | |||
549 | " Use l to open fold | ||
550 | nnoremap <expr> l foldclosed('.') == -1 ? 'l' : 'zo' | ||
551 | |||
552 | " Open fold in next line | ||
553 | nnoremap <expr> zo foldclosed('.') == -1 ? 'zjzo' : 'zo' | ||
554 | nnoremap <expr> zO foldclosed('.') == -1 ? 'zjzO' : 'zO' | ||
555 | |||
556 | " Go to next fold and unfold | ||
557 | nnoremap zJ zjzx | ||
558 | nnoremap zK zkzx | ||
559 | |||
560 | " Fold file except selection | ||
561 | autocmd BufEnter * let b:unfold_selection = 0 | ||
562 | function! ToggleUnfoldSelection() | ||
563 | if !b:unfold_selection | ||
564 | let b:unfold_selection = 1 | ||
565 | mkview | ||
566 | echo 'Unfold'..&foldmethod | ||
567 | 621 | ||
568 | let &foldmethod = "manual" | 622 | " Use <leader>z to toggle |
569 | norm! zE | 623 | let g:alacritty_extra_padding = 0 |
570 | execute "0,'<-1fold" | 624 | function! ToggleWinPadding() |
571 | execute "'>+1,$fold" | 625 | if g:alacritty_extra_padding |
626 | !alacritty msg config --window-id $WINDOWID --reset | ||
627 | call SetEmulaterBackground() | ||
628 | hi EndOfBuffer None | ||
629 | hi MsgArea None | ||
572 | else | 630 | else |
573 | let b:unfold_selection = 0 | 631 | redir => output | hi LineNr | redir END |
574 | loadview | 632 | let bg_color = matchstr(output, 'guibg=\zs[^\s]\+\ze') |
575 | endif | ||
576 | endfunction | ||
577 | 633 | ||
578 | autocmd BufEnter * let b:clear_matches = 0 | 634 | try |
579 | function! GrayOutOtherFolds() | 635 | exe "hi EndOfBuffer guifg="..bg_color.." guibg="..bg_color |
580 | if b:clear_matches | 636 | exe "hi MsgArea guibg="..bg_color |
581 | let b:clear_matches = 0 | 637 | endtry |
582 | call clearmatches() | 638 | exe "!alacritty msg config --window-id $WINDOWID window.padding.x=300 'colors.primary.background=\"\\"..bg_color.."\"'" |
583 | else | ||
584 | let b:clear_matches = 1 | ||
585 | let pos = getpos('.') | ||
586 | exe "norm! [zV]z\<C-c>" | ||
587 | call matchadd('Folded', '\%<'.line("'<").'l') | ||
588 | call matchadd('Folded', '\%>'.line("'>").'l') | ||
589 | norm! zR | ||
590 | call setpos('.', pos) | ||
591 | endif | 639 | endif |
592 | endfunction | ||
593 | 640 | ||
594 | " }}} | 641 | let g:alacritty_extra_padding = !g:alacritty_extra_padding |
642 | endfunc | ||
643 | nnoremap <leader>z <Cmd>silent call ToggleWinPadding()<CR> | ||
644 | |||
645 | " In case ALT key is not working | ||
646 | " execute "set <M-2>=\e2" | ||
647 | " execute "set <M-1>=\e1" | ||
648 | " execute "set <M-3>=\e3" | ||
649 | " execute "set <M-4>=\e4" | ||
650 | " execute "set <M-5>=\e5" | ||
651 | " execute "set <M-6>=\e6" | ||
652 | " execute "set <M-7>=\e7" | ||
653 | " execute "set <M-8>=\e8" | ||
654 | " execute "set <M-9>=\e9" | ||
655 | " execute "set <M-0>=\e0" | ||
656 | " execute "set <M-f>=\ef" | ||
657 | " execute "set <M-b>=\eb" | ||
658 | " execute "set <M-d>=\ed" | ||
659 | " execute "set <M-l>=\el" | ||
660 | " execute "set <M-h>=\eh" | ||
661 | |||
662 | "}}} | ||
595 | " HIGHLIGHT {{{ | 663 | " HIGHLIGHT {{{ |
596 | 664 | ||
665 | nnoremap <leader>I :Inspect<CR> | ||
597 | nnoremap <expr> \sy exists("g:syntax_on") ? ":syntax off <CR>" : ":syntax enable<CR>" | 666 | nnoremap <expr> \sy exists("g:syntax_on") ? ":syntax off <CR>" : ":syntax enable<CR>" |
598 | 667 | ||
599 | " Toggle conceallevel0/2 | 668 | " Toggle conceallevel0/2 |
@@ -630,39 +699,6 @@ nnoremap <silent> <leader>gh :call matchadd('MultiLineHighlight', '\%'.line('.') | |||
630 | nnoremap <silent> <leader>gH :call clearmatches()<CR> | 699 | nnoremap <silent> <leader>gH :call clearmatches()<CR> |
631 | 700 | ||
632 | " }}} | 701 | " }}} |
633 | " SURROUND {{{ | ||
634 | |||
635 | inoremap ' ''<Left> | ||
636 | inoremap " ""<Left> | ||
637 | inoremap ( ()<Left> | ||
638 | inoremap [ []<Left> | ||
639 | inoremap { {}<Left> | ||
640 | |||
641 | vnoremap q <ESC>`<i"<ESC>`>la"<ESC> | ||
642 | vnoremap ( <ESC>`<i(<ESC>`>la)<ESC> | ||
643 | vnoremap [ <ESC>`<i[<ESC>`>la]<ESC> | ||
644 | vnoremap { <ESC>`<i{<ESC>`>la}<ESC> | ||
645 | vnoremap Q <ESC>`<i「<ESC>`>la」<ESC> | ||
646 | " vnoremap ' <ESC>`<i'<ESC>`>la'<ESC> | ||
647 | " vnoremap ` <ESC>`<i`<ESC>`>la`<ESC> | ||
648 | |||
649 | function! AddSpaceForSelection() | ||
650 | " If visual selection by lines, add empty space at top and bottom | ||
651 | if line("'<") != line("'>") || (col("'<") == 1 && col("'>") == len(getline('.'))+1) | ||
652 | '< norm! O | ||
653 | '> norm! o | ||
654 | exe "norm! "..(line("'<")-1).."GV"..(line("'>")+1).."G" | ||
655 | " Otherwise, add space at start and end column | ||
656 | else | ||
657 | call cursor('.', col("'<")) | ||
658 | execute "norm! i\<space>" | ||
659 | call cursor('.', col("'>")+1) | ||
660 | execute "norm! a\<space>" | ||
661 | endif | ||
662 | endfunction | ||
663 | vnoremap <space> :<C-u>call AddSpaceForSelection()<CR> | ||
664 | |||
665 | " }}} | ||
666 | " QUICKFIX {{{ | 702 | " QUICKFIX {{{ |
667 | 703 | ||
668 | nnoremap <leader>cn :cn<CR> | 704 | nnoremap <leader>cn :cn<CR> |
@@ -694,34 +730,6 @@ command! -nargs=1 -complete=command Redir silent call Redir(<q-args>) | |||
694 | command! -nargs=1 -complete=command R silent call Redir(<q-args>) | 730 | command! -nargs=1 -complete=command R silent call Redir(<q-args>) |
695 | nnoremap <leader>rr :Redir<space> | 731 | nnoremap <leader>rr :Redir<space> |
696 | " }}} | 732 | " }}} |
697 | " SEARCH/SUBSTITUTE {{{ | ||
698 | |||
699 | " Search for selected test | ||
700 | vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR> | ||
701 | |||
702 | nnoremap g/ gv<esc>/\%V | ||
703 | vnoremap g/ <esc>/\%V | ||
704 | |||
705 | " Substitue across file | ||
706 | vnoremap <leader>s y:%s//<C-R>0/g<LEFT><LEFT> | ||
707 | |||
708 | " Usage: Press <TAB> n times for area, and <CR> for substitute | ||
709 | let g:search_selection = 0 | ||
710 | " When leaving visual mode, resume search_selection | ||
711 | autocmd Modechanged [vV\x16]*:* let g:search_selection = 0 | ||
712 | xmap <expr> <TAB> g:search_selection ? "//e<CR>" : "*:let g:search_selection = 1<CR>gv//e<CR>" | ||
713 | xmap <expr> <S-TAB> g:search_selection ? "??<CR>" : "*:let g:search_selection = 1<CR>gv??<CR>" | ||
714 | vnoremap <CR> :s//<C-R>0/g<Left><Left> | ||
715 | |||
716 | " }}} | ||
717 | " SIGN {{{ | ||
718 | |||
719 | nnoremap <leader><leader>sc :<C-\>e'set signcolumn='..&signcolumn<CR> | ||
720 | |||
721 | nnoremap <leader>si :exe ":sign place " .. line('.') .. " line=" .. line('.') .. " name=piet file=" .. expand("%:p")<CR> | ||
722 | nnoremap <leader>sI :exe ":sign unplace * file=" .. expand("%:p")<CR> | ||
723 | |||
724 | " }}} | ||
725 | " GIT_TIG {{{ | 733 | " GIT_TIG {{{ |
726 | 734 | ||
727 | let g:tig_explorer_keymap_commit_split = '<C-s>' | 735 | let g:tig_explorer_keymap_commit_split = '<C-s>' |