# HG changeset patch # User Ludovic Chabant # Date 1398314614 25200 # Node ID e688b658ce5bd1db8c777f5743409be775aee7e1 # Parent 685dfc4b5862fcbfacdad3ab355ad34b07b4fbfb Add variants of existing commands that open things in a new tab page. diff -r 685dfc4b5862 -r e688b658ce5b doc/lawrencium.txt --- a/doc/lawrencium.txt Wed Apr 23 20:36:34 2014 -0700 +++ b/doc/lawrencium.txt Wed Apr 23 21:43:34 2014 -0700 @@ -108,6 +108,14 @@ *:Hgvdiff_f* :Hgvdiff {revspec} Same as |:Hgdiff_f| but uses a vertical split. + *:Hgtabdiff* +:Hgtabdiff Same as |:Hgdiff| but opens the diff with a vertical + split in a new tab page. + + *:Hgtabdiff_f* +:Hgtabdiff {revspec} Same as |:Hgdiff_f| but opens the diff with a vertical + split in a new tab page. + *:Hgdiffsum* :Hgdiffsum Shows the "diff summary" (the output of `hg diff`) of the current file against its parent revision. @@ -134,6 +142,14 @@ respectively, but uses a vertical split window instead of a horizontal split window. + *:Hgtabdiffsumsplit* + *:Hgtabdiffsumsplit_f* +:Hgtabdiffsumsplit +:Hgtabdiffsumsplit {revspec} + Same as |:Hgdiffsumsplit| and |:Hgdiffsumsplit_f| + respectively, but opens the diff summary with a + vertical split in a new tab page. + *:Hgcommit* :Hgcommit Opens a new window to edit a commit message into a temporary file and, upon quitting the buffer, if that @@ -215,13 +231,18 @@ current line, between the working directory version and the parent revision version. Similar to running |:Hgdiff| on that file. - Mapped to . *:Hgstatusvdiff* :Hgstatusvdiff Similar to |:Hgstatusdiff|, but use a vertical split. Similar to running |:Hgvdiff| on that file. Mapped to . + *:Hgstatustabdiff* +:Hgstatustabdiff Similar to |:Hgstatusdiff|, but opens the split with a + vertical split in a new tab page. + Similar to running |:Hgtabdiff| on that file. + Mapped to . + *:Hgstatusdiffsum* :Hgstatusdiffsum Similar to |:Hgstatusdiff|, but show a diff summary, like the one shown with |:Hgdiffsum|, instead of @@ -233,6 +254,10 @@ split. Mapped to . + *:Hgstatustabdiffsum* +:Hgstatustabdiffsum Similar to |:Hgstatusdiffsum|, but opens the diff + summary with a vertical split in a new tab page. + *:Hgstatuscommit* :Hgstatuscommit Runs |:Hgcommit| on the files currently mentioned in the buffer, or in the current selection. The first @@ -244,7 +269,6 @@ *:Hgstatusvcommit* :Hgstatusvcommit Similar to |:Hgstatuscommit|, but use a vertical split, as with |:Hgvcommit|. - Not mapped byd default. *:Hgstatusrefresh* :Hgstatusrefresh Refreshes the status window by running `hg status` @@ -304,6 +328,13 @@ Same as |:Hglogdiffsum_r| but opens a vertical split instead of a horizontal one. + *:Hglogtabdiffsum* + *:Hglogtabdiffsum_r* +:Hglogtabdiffsum +:Hglogtabdiffsum {rev1} {rev2} + Same as |:Hglogdiffsum| and |:Hglogdiffsum_r| but + opens the diff summary in a new tab page. + *:Hglogrevedit* :Hglogrevedit Looks at the revision specified on the current line, and opens that revision for edit in the previous @@ -338,6 +369,13 @@ Same as |:Hglogdiff_r| but opens a vertical split instead of a horizontal one. + *:Hglogtabdiff* + *:Hglogtabdiff_r* +:Hglogtabdiff +:Hglogtabdiff {rev1} {rev2} + Same as |:Hglogdiff| and |:Hglogdiff_r| but opens the + diff with a vertical split in a new tab page. + *lawrencium-log-mappings* A few other mappings are available in the log window: diff -r 685dfc4b5862 -r e688b658ce5b plugin/lawrencium.vim --- a/plugin/lawrencium.vim Wed Apr 23 20:36:34 2014 -0700 +++ b/plugin/lawrencium.vim Wed Apr 23 21:43:34 2014 -0700 @@ -888,11 +888,13 @@ execute "resize " . (line('$') + 1) " Add some nice commands. - command! -buffer Hgstatusedit :call s:HgStatus_FileEdit() + command! -buffer Hgstatusedit :call s:HgStatus_FileEdit(0) command! -buffer Hgstatusdiff :call s:HgStatus_Diff(0) command! -buffer Hgstatusvdiff :call s:HgStatus_Diff(1) - command! -buffer Hgstatusdiffsum :call s:HgStatus_DiffSummary(0) - command! -buffer Hgstatusvdiffsum :call s:HgStatus_DiffSummary(1) + command! -buffer Hgstatustabdiff :call s:HgStatus_Diff(2) + command! -buffer Hgstatusdiffsum :call s:HgStatus_DiffSummary(1) + command! -buffer Hgstatusvdiffsum :call s:HgStatus_DiffSummary(2) + command! -buffer Hgstatustabdiffsum :call s:HgStatus_DiffSummary(3) command! -buffer Hgstatusrefresh :call s:HgStatus_Refresh() command! -buffer -range Hgstatusaddremove :call s:HgStatus_AddRemove(, ) command! -buffer -range=% -bang Hgstatuscommit :call s:HgStatus_Commit(, , 0, 0) @@ -905,7 +907,7 @@ nnoremap :Hgstatusedit nnoremap :call search('^[MARC\!\?I ]\s.', 'We') nnoremap :call search('^[MARC\!\?I ]\s.', 'Wbe') - nnoremap :Hgstatusdiff + nnoremap :Hgstatustabdiff nnoremap :Hgstatusvdiff nnoremap :Hgstatusdiffsum nnoremap :Hgstatusvdiffsum @@ -925,22 +927,35 @@ edit endfunction -function! s:HgStatus_FileEdit() abort +function! s:HgStatus_FileEdit(newtab) abort " Get the path of the file the cursor is on. let l:filename = s:HgStatus_GetSelectedFile() - - " If the file is already open in a window, jump to that window. - " Otherwise, jump to the previous window and open it there. - for nr in range(1, winnr('$')) - let l:br = winbufnr(nr) - let l:bpath = fnamemodify(bufname(l:br), ':p') - if l:bpath ==# l:filename - execute nr . 'wincmd w' - return - endif - endfor - wincmd p + + let l:cleanupbufnr = -1 + if a:newtab == 0 + " If the file is already open in a window, jump to that window. + " Otherwise, jump to the previous window and open it there. + for nr in range(1, winnr('$')) + let l:br = winbufnr(nr) + let l:bpath = fnamemodify(bufname(l:br), ':p') + if l:bpath ==# l:filename + execute nr . 'wincmd w' + return + endif + endfor + wincmd p + else + " Just open a new tab so we can edit the file there. + " We don't use `tabedit` because it messes up the current window + " if it happens to be the same file. + " We'll just have to clean up the default empty buffer created. + tabnew + let l:cleanupbufnr = bufnr('%') + endif execute 'edit ' . escape(l:filename, ' \') + if l:cleanupbufnr >= 0 + execute 'bdelete ' . l:cleanupbufnr + endif endfunction function! s:HgStatus_AddRemove(linestart, lineend) abort @@ -971,21 +986,28 @@ call s:HgCommit(a:bang, a:vertical, l:filenames) endfunction -function! s:HgStatus_Diff(vertical) abort +function! s:HgStatus_Diff(split) abort " Open the file and run `Hgdiff` on it. - call s:HgStatus_FileEdit() - call s:HgDiff('%:p', a:vertical) + " We also need to translate the split mode for it... if we already + " opened the file in a new tab, `HgDiff` only needs to do a vertical + " split (i.e. split=1). + let l:newtab = 0 + let l:hgdiffsplit = a:split + if a:split == 2 + let l:newtab = 1 + let l:hgdiffsplit = 1 + endif + call s:HgStatus_FileEdit(l:newtab) + call s:HgDiff('%:p', l:hgdiffsplit) endfunction -function! s:HgStatus_DiffSummary(vertical) abort +function! s:HgStatus_DiffSummary(split) abort " Get the path of the file the cursor is on. let l:path = s:HgStatus_GetSelectedFile() - let l:split_type = 1 - if a:vertical - let l:split_type = 2 + if a:split < 3 + wincmd p endif - wincmd p - call s:HgDiffSummary(l:path, l:split_type) + call s:HgDiffSummary(l:path, a:split) endfunction function! s:HgStatus_QNew(linestart, lineend, patchname, ...) abort @@ -1113,9 +1135,9 @@ " }}} -" Hgdiff, Hgvdiff {{{ +" Hgdiff, Hgvdiff, Hgtabdiff {{{ -function! s:HgDiff(filename, vertical, ...) abort +function! s:HgDiff(filename, split, ...) abort " Default revisions to diff: the working directory (null string) " and the parent of the working directory (using Mercurial's revsets syntax). " Otherwise, use the 1 or 2 revisions specified as extra parameters. @@ -1148,24 +1170,43 @@ let l:diff_buffers = [] " Get the first file and open it. + let l:cleanupbufnr = -1 if l:rev1 == '' - if bufexists(l:path) - execute 'buffer ' . fnameescape(l:path) + if a:split == 2 + " Don't use `tabedit` here because if `l:path` is the same as + " the current path, it will also reload the buffer in the current + " tab/window for some reason, which causes all state to be lost + " (all folds get collapsed again, cursor is moved to start, etc.) + tabnew + let l:cleanupbufnr = bufnr('%') + execute 'edit ' . fnameescape(l:path) else - execute 'edit ' . fnameescape(l:path) + if bufexists(l:path) + execute 'buffer ' . fnameescape(l:path) + else + execute 'edit ' . fnameescape(l:path) + endif endif " Make it part of the diff group. call s:HgDiff_DiffThis() else let l:rev_path = l:repo.GetLawrenciumPath(l:path, 'rev', l:rev1) + if a:split == 2 + " See comments above about avoiding `tabedit`. + tabnew + let l:cleanupbufnr = bufnr('%') + endif execute 'edit ' . fnameescape(l:rev_path) " Make it part of the diff group. call s:HgDiff_DiffThis() endif + if l:cleanupbufnr >= 0 + execute 'bdelete ' . l:cleanupbufnr + endif " Get the second file and open it too. let l:diffsplit = 'diffsplit' - if a:vertical + if a:split >= 1 let l:diffsplit = 'vertical diffsplit' endif if l:rev2 == '' @@ -1250,10 +1291,11 @@ call s:AddMainCommand("-nargs=* Hgdiff :call s:HgDiff('%:p', 0, )") call s:AddMainCommand("-nargs=* Hgvdiff :call s:HgDiff('%:p', 1, )") +call s:AddMainCommand("-nargs=* Hgtabdiff :call s:HgDiff('%:p', 2, )") " }}} -" Hgdiffsum, Hgdiffsumsplit, Hgvdiffsumsplit {{{ +" Hgdiffsum, Hgdiffsumsplit, Hgvdiffsumsplit, Hgtabdiffsum {{{ function! s:HgDiffSummary(filename, split, ...) abort " Default revisions to diff: the working directory (null string) @@ -1285,6 +1327,8 @@ let l:cmd = 'rightbelow split ' elseif a:split == 2 let l:cmd = 'rightbelow vsplit ' + elseif a:split == 3 + let l:cmd = 'tabedit ' endif execute l:cmd . l:special endfunction @@ -1292,6 +1336,7 @@ call s:AddMainCommand("-nargs=* Hgdiffsum :call s:HgDiffSummary('%:p', 0, )") call s:AddMainCommand("-nargs=* Hgdiffsumsplit :call s:HgDiffSummary('%:p', 1, )") call s:AddMainCommand("-nargs=* Hgvdiffsumsplit :call s:HgDiffSummary('%:p', 2, )") +call s:AddMainCommand("-nargs=* Hgtabdiffsum :call s:HgDiffSummary('%:p', 3, )") " }}} @@ -1453,12 +1498,14 @@ " Add some other nice commands and mappings. let l:is_file = (l:path != '' && filereadable(l:repo.GetFullPath(l:path))) - command! -buffer -nargs=* Hglogdiffsum :call s:HgLog_DiffSummary(0, ) - command! -buffer -nargs=* Hglogvdiffsum :call s:HgLog_DiffSummary(1, ) + command! -buffer -nargs=* Hglogdiffsum :call s:HgLog_DiffSummary(1, ) + command! -buffer -nargs=* Hglogvdiffsum :call s:HgLog_DiffSummary(2, ) + command! -buffer -nargs=* Hglogtabdiffsum :call s:HgLog_DiffSummary(3, ) if l:is_file - command! -buffer Hglogrevedit :call s:HgLog_FileRevEdit() - command! -buffer -nargs=* Hglogdiff :call s:HgLog_Diff(0, ) - command! -buffer -nargs=* Hglogvdiff :call s:HgLog_Diff(1, ) + command! -buffer Hglogrevedit :call s:HgLog_FileRevEdit() + command! -buffer -nargs=* Hglogdiff :call s:HgLog_Diff(0, ) + command! -buffer -nargs=* Hglogvdiff :call s:HgLog_Diff(1, ) + command! -buffer -nargs=* Hglogtabdiff :call s:HgLog_Diff(2, ) endif if g:lawrencium_define_mappings @@ -1468,7 +1515,7 @@ nnoremap q :bdelete! if l:is_file nnoremap :Hglogrevedit - nnoremap :Hglogdiff + nnoremap :Hglogtabdiff nnoremap :Hglogvdiff endif endif @@ -1498,7 +1545,7 @@ call s:edit_deletable_buffer('lawrencium_rev_for', l:bufobj.nr, l:path) endfunction -function! s:HgLog_Diff(vertical, ...) abort +function! s:HgLog_Diff(split, ...) abort let l:revs = [] if a:0 >= 2 let l:revs = [a:1, a:2] @@ -1516,11 +1563,13 @@ " Go to the window we were in before going to the log window, " and open the split diff there. - wincmd p - call s:HgDiff(l:path, a:vertical, l:revs) + if a:split < 2 + wincmd p + endif + call s:HgDiff(l:path, a:split, l:revs) endfunction -function! s:HgLog_DiffSummary(vertical, ...) abort +function! s:HgLog_DiffSummary(split, ...) abort let l:revs = [] if a:0 >= 2 let l:revs = [a:1, a:2] @@ -1530,11 +1579,6 @@ let l:revs = [s:HgLog_GetSelectedRev()] endif - let l:split_type = 1 - if a:vertical - let l:split_type = 2 - endif - let l:repo = s:hg_repo() let l:bufobj = s:buffer_obj() let l:log_path = s:parse_lawrencium_path(l:bufobj.GetName()) @@ -1543,7 +1587,7 @@ " Go to the window we were in before going in the log window, " and split for the diff summary from there. wincmd p - call s:HgDiffSummary(l:path, l:split_type, l:revs) + call s:HgDiffSummary(l:path, a:split, l:revs) endfunction function! s:HgLog_GetSelectedRev(...) abort