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 " }}}