Mercurial > vim-lawrencium
comparison plugin/lawrencium.vim @ 23:84bceffbb19c
Restore window settings when a diff window is closed.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 20 Dec 2011 14:33:05 -0800 |
parents | d0acefc1ec9a |
children | 21a879a09f20 |
comparison
equal
deleted
inserted
replaced
21:d0acefc1ec9a | 23:84bceffbb19c |
---|---|
489 execute 'buffer ' . fnameescape(l:path) | 489 execute 'buffer ' . fnameescape(l:path) |
490 else | 490 else |
491 execute 'edit ' . fnameescape(l:path) | 491 execute 'edit ' . fnameescape(l:path) |
492 endif | 492 endif |
493 " Make it part of the diff group. | 493 " Make it part of the diff group. |
494 diffthis | 494 call s:HgDiff_DiffThis() |
495 else | 495 else |
496 let l:temp_file = tempname() | 496 let l:temp_file = tempname() |
497 call l:repo.RunCommand('cat', '-r', '"'.l:rev1.'"', '-o', l:temp_file, l:path) | 497 call l:repo.RunCommand('cat', '-r', '"'.l:rev1.'"', '-o', l:temp_file, l:path) |
498 execute 'edit ' . fnameescape(l:temp_file) | 498 execute 'edit ' . fnameescape(l:temp_file) |
499 " Make it part of the diff group. | 499 " Make it part of the diff group. |
500 diffthis | 500 call s:HgDiff_DiffThis() |
501 " Remember the repo it belongs to. | 501 " Remember the repo it belongs to. |
502 let b:mercurial_dir = l:repo.root_dir | 502 let b:mercurial_dir = l:repo.root_dir |
503 " Make sure it's deleted when we move away from it. | 503 " Make sure it's deleted when we move away from it. |
504 setlocal bufhidden=delete | 504 setlocal bufhidden=delete |
505 endif | 505 endif |
519 let b:mercurial_dir = l:repo.root_dir | 519 let b:mercurial_dir = l:repo.root_dir |
520 " Make sure it's deleted when we move away from it. | 520 " Make sure it's deleted when we move away from it. |
521 setlocal bufhidden=delete | 521 setlocal bufhidden=delete |
522 endif | 522 endif |
523 endfunction | 523 endfunction |
524 | |
525 function! s:HgDiff_DiffThis() abort | |
526 " Store some commands to run when we exit diff mode. | |
527 " It's needed because `diffoff` reverts those settings to their default | |
528 " values, instead of their previous ones. | |
529 if !&diff | |
530 call s:trace('Enabling diff mode on ' . bufname('%')) | |
531 let w:lawrencium_diffoff = {} | |
532 let w:lawrencium_diffoff['&diff'] = 0 | |
533 let w:lawrencium_diffoff['&wrap'] = &l:wrap | |
534 let w:lawrencium_diffoff['&scrollopt'] = &l:scrollopt | |
535 let w:lawrencium_diffoff['&scrollbind'] = &l:scrollbind | |
536 let w:lawrencium_diffoff['&cursorbind'] = &l:cursorbind | |
537 let w:lawrencium_diffoff['&foldmethod'] = &l:foldmethod | |
538 let w:lawrencium_diffoff['&foldcolumn'] = &l:foldcolumn | |
539 diffthis | |
540 endif | |
541 endfunction | |
542 | |
543 function! s:HgDiff_DiffOff(...) abort | |
544 " Get the window name (given as a paramter, or current window). | |
545 let l:nr = a:0 ? a:1 : winnr() | |
546 | |
547 " Run the commands we saved in `HgDiff_DiffThis`, or just run `diffoff`. | |
548 let l:backup = getwinvar(l:nr, 'lawrencium_diffoff') | |
549 if type(l:backup) == type({}) && len(l:backup) > 0 | |
550 call s:trace('Disabling diff mode on ' . l:nr) | |
551 for key in keys(l:backup) | |
552 call setwinvar(l:nr, key, l:backup[key]) | |
553 endfor | |
554 call setwinvar(l:nr, 'lawrencium_diffoff', {}) | |
555 else | |
556 call s:trace('Disabling diff mode on ' . l:nr . ' (but no true restore)') | |
557 diffoff | |
558 endif | |
559 endfunction | |
560 | |
561 function! s:HgDiff_GetDiffWindows() abort | |
562 let l:result = [] | |
563 for nr in range(1, winnr('$')) | |
564 if getwinvar(nr, '&diff') | |
565 call add(l:result, nr) | |
566 endif | |
567 endfor | |
568 return l:result | |
569 endfunction | |
570 | |
571 function! s:HgDiff_CleanUp() abort | |
572 " If we're not leaving a diff window, do nothing. | |
573 if !&diff | |
574 return | |
575 endif | |
576 | |
577 " If there will be only one diff window left (plus the one we're leaving), | |
578 " turn off diff everywhere. | |
579 let l:nrs = s:HgDiff_GetDiffWindows() | |
580 if len(l:nrs) <= 2 | |
581 call s:trace('Disabling diff mode in ' . len(l:nrs) . ' windows.') | |
582 for nr in l:nrs | |
583 if getwinvar(nr, '&diff') | |
584 call s:HgDiff_DiffOff(nr) | |
585 endif | |
586 endfor | |
587 else | |
588 call s:trace('Still ' . len(l:nrs) . ' diff windows open.') | |
589 endif | |
590 endfunction | |
591 | |
592 augroup lawrencium_diff | |
593 autocmd! | |
594 autocmd BufWinLeave * call s:HgDiff_CleanUp() | |
595 augroup end | |
524 | 596 |
525 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hgdiff :execute s:HgDiff('%:p', 0, <f-args>)") | 597 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hgdiff :execute s:HgDiff('%:p', 0, <f-args>)") |
526 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hgvdiff :execute s:HgDiff('%:p', 1, <f-args>)") | 598 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hgvdiff :execute s:HgDiff('%:p', 1, <f-args>)") |
527 | 599 |
528 " }}} | 600 " }}} |