patch 9.1.1557: not possible to anchor specific lines in difff mode
Problem: not possible to anchor specific lines in difff mode
Solution: Add support for the anchoring lines in diff mode using the
'diffanchor' option (Yee Cheng Chin).
Adds support for anchoring specific lines to each other while viewing a
diff. While lines are anchored, they are guaranteed to be aligned to
each other in a diff view, allowing the user to control and inform the
diff algorithm what the desired alignment is. Internally, this is done
by splitting up the buffer at each anchor and run the diff algorithm on
each split section separately, and then merge the results back for a
logically consistent diff result.
To do this, add a new "diffanchors" option that takes a list of
`{address}`, and a new "diffopt" option value "anchor". Each address
specified will be an anchor, and the user can choose to use any type of
address, including marks, line numbers, or pattern search. Anchors are
sorted by line number in each file, and it's possible to have multiple
anchors on the same line (this is useful when doing multi-buffer diff).
Update documentation to provide examples.
This is similar to Git diff's `--anchored` flag. Other diff tools like
Meld/Araxis Merge also have similar features (called "synchronization
points" or "synchronization links"). We are not using Git/Xdiff's
`--anchored` implementation here because it has a very limited API
(it requires usage of the Patience algorithm, and can only anchor
unique lines that are the same across both files).
Because the user could anchor anywhere, diff anchors could result in
adjacent diff blocks (one block is directly touching another without a
gap), if there is a change right above the anchor point. We don't want
to merge these diff blocks because we want to line up the change at the
anchor. Adjacent diff blocks were first allowed when linematch was
added, but the existing code had a lot of branched paths where
line-matched diff blocks were handled differently. As a part of this
change, refactor them to have a more unified code path that is
generalized enough to handle adjacent diff blocks correctly and without
needing to carve in exceptions all over the place.
closes: #17615
Signed-off-by: Yee Cheng Chin <ychin.git@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
393d398247
commit
0d9160e11c
@ -1,4 +1,4 @@
|
||||
*diff.txt* For Vim version 9.1. Last change: 2025 Jun 20
|
||||
*diff.txt* For Vim version 9.1. Last change: 2025 Jul 26
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -14,7 +14,8 @@ The basics are explained in section |08.7| of the user manual.
|
||||
2. Viewing diffs |view-diffs|
|
||||
3. Jumping to diffs |jumpto-diffs|
|
||||
4. Copying diffs |copy-diffs|
|
||||
5. Diff options |diff-options|
|
||||
5. Diff anchors |diff-anchors|
|
||||
6. Diff options |diff-options|
|
||||
|
||||
==============================================================================
|
||||
1. Starting diff mode *start-vimdiff*
|
||||
@ -336,7 +337,129 @@ name or a part of a buffer name. Examples:
|
||||
diff mode (e.g., "file.c.v2")
|
||||
|
||||
==============================================================================
|
||||
5. Diff options *diff-options*
|
||||
5. Diff anchors *diff-anchors*
|
||||
|
||||
Diff anchors allow you to control where the diff algorithm aligns and
|
||||
synchronize text across files. Each anchor matches each other in each file,
|
||||
allowing you to control the output of a diff.
|
||||
|
||||
This is useful when a change involves complicated edits. For example, if a
|
||||
function was moved to another location and further edited. By default, the
|
||||
algorithm aims to create the smallest diff, which results in that entire
|
||||
function being considered to be deleted and added on the other side, making it
|
||||
hard to see what the actual edit on it was. You can use diff anchors to pin
|
||||
that function so the diff algorithm will align based on it.
|
||||
|
||||
To use it, set anchors using 'diffanchors' which is a comma-separated list of
|
||||
{address} in each file, and then add "anchor" to 'diffopt'. Internaly, Vim
|
||||
splits each file up into sections split by the anchors. It performs the diff
|
||||
on each pair of sections separately before merging the results back.
|
||||
|
||||
Setting 'diffanchors' will update the diff immediately. If an anchor is tied
|
||||
to a mark, and you change what the mark is pointed to, you need to manually
|
||||
call |:diffupdate| afterwards to get the updated diff results.
|
||||
|
||||
Example:
|
||||
|
||||
Let's say we have the following files, side-by-side. We are interested in the
|
||||
change that happened to the function `foo()`, which was both edited and moved.
|
||||
|
||||
File A: >
|
||||
int foo() {
|
||||
int n = 1;
|
||||
return n;
|
||||
}
|
||||
|
||||
int g = 1;
|
||||
|
||||
int bar(int a) {
|
||||
a *= 2;
|
||||
a += 3;
|
||||
return a;
|
||||
}
|
||||
<File B: >
|
||||
int bar(int a) {
|
||||
a *= 2;
|
||||
a += 3;
|
||||
return a;
|
||||
}
|
||||
|
||||
int foo() {
|
||||
int n = 999;
|
||||
return n;
|
||||
}
|
||||
|
||||
int g = 1;
|
||||
<
|
||||
A normal diff will usually align the diff result as such: >
|
||||
|
||||
int foo() { |----------------
|
||||
int n = 1; |----------------
|
||||
return n; |----------------
|
||||
} |----------------
|
||||
|----------------
|
||||
int g = 1; |----------------
|
||||
|----------------
|
||||
int bar(int a) {|int bar(int a) {
|
||||
a *= 2; | a *= 2;
|
||||
a += 3; | a += 3;
|
||||
return a; | return a;
|
||||
} |}
|
||||
----------------|
|
||||
----------------|int foo() {
|
||||
----------------| int n = 999;
|
||||
----------------| return n;
|
||||
----------------|}
|
||||
----------------|
|
||||
----------------|int g = 1;
|
||||
<
|
||||
What we want is to instead ask the diff to align on `foo()`: >
|
||||
|
||||
----------------|int bar(int a) {
|
||||
----------------| a *= 2;
|
||||
----------------| a += 3;
|
||||
----------------| return a;
|
||||
----------------|}
|
||||
----------------|
|
||||
int foo() { |int foo() {
|
||||
int n = 1; | int n = 999;
|
||||
return n; | return n;
|
||||
} |}
|
||||
|
|
||||
int g = 1; |int g = 1;
|
||||
|----------------
|
||||
int bar(int a) {|----------------
|
||||
a *= 2; |----------------
|
||||
a += 3; |----------------
|
||||
return a; |----------------
|
||||
} |----------------
|
||||
<
|
||||
|
||||
Below are some ways of setting diff anchors to get the above result. In each
|
||||
example, 'diffopt' needs to have `anchor` set for this to take effect.
|
||||
|
||||
Marks: Set the |'a| mark on the `int foo()` lines in each file first before
|
||||
setting the anchors: >
|
||||
set diffanchors='a
|
||||
|
||||
Pattern: Specify the anchor using a |pattern| (see |:/|). Here, we make sure
|
||||
to always start search from line 1 for consistency: >
|
||||
set diffanchors=1/int\ foo(/
|
||||
<
|
||||
Selection: Use visual mode to select the entire `foo()` function body in each
|
||||
file. Here, we use two anchors. This does a better job of making sure only
|
||||
the function bodies are anchored against each other but not the lines after
|
||||
it. Note the `'>+1` below. The "+1" is necessary as we want the split to
|
||||
happen below the last line of the function, not above: >
|
||||
set diffanchors='<,'>+1
|
||||
<
|
||||
Manually set two anchors using line numbers via buffer-local options: >
|
||||
setlocal diffanchors=1,5
|
||||
wincmd w
|
||||
setlocal diffanchors=7,11
|
||||
<
|
||||
==============================================================================
|
||||
6. Diff options *diff-options*
|
||||
|
||||
Also see |'diffopt'| and the "diff" item of |'fillchars'|.
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
*options.txt* For Vim version 9.1. Last change: 2025 Jul 13
|
||||
*options.txt* For Vim version 9.1. Last change: 2025 Jul 16
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -2986,6 +2986,28 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
Join the current window in the group of windows that shows differences
|
||||
between files. See |vimdiff|.
|
||||
|
||||
*'dia'* *'diffanchors'* *E1549*
|
||||
'diffanchors' 'dia' string (default "")
|
||||
global or local to buffer |global-local|
|
||||
List of {address} in each buffer, separated by commas, that are
|
||||
considered anchors when used for diffing. It's valid to specify "$+1"
|
||||
for 1 past the last line. "%" cannot be used for this option. There
|
||||
can be at most 20 anchors set for each buffer.
|
||||
|
||||
Each anchor line splits the buffer (the split happens above the
|
||||
anchor), with each part being diff'ed separately before the final
|
||||
result is joined. When more than one {address} are provided, the
|
||||
anchors will be sorted interally by line number. If using buffer
|
||||
local options, each buffer should have the same number of anchors
|
||||
(extra anchors will be ignored). This option is only used when
|
||||
'diffopt' has "anchor" set. See |diff-anchors| for more details and
|
||||
examples.
|
||||
*E1550*
|
||||
If some of the {address} do not resolve to a line in each buffer (e.g.
|
||||
a pattern search that does not match anything), none of the anchors
|
||||
will be used.
|
||||
|
||||
|
||||
*'dex'* *'diffexpr'*
|
||||
'diffexpr' 'dex' string (default "")
|
||||
global
|
||||
@ -3014,6 +3036,10 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
patience patience diff algorithm
|
||||
histogram histogram diff algorithm
|
||||
|
||||
anchor Anchor specific lines in each buffer to be
|
||||
aligned with each other if 'diffanchors' is
|
||||
set. See |diff-anchors|.
|
||||
|
||||
closeoff When a window is closed where 'diff' is set
|
||||
and there is only one window remaining in the
|
||||
same tab page with 'diff' set, execute
|
||||
@ -3116,6 +3142,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
"linematch:60", as this will enable alignment
|
||||
for a 2 buffer diff hunk of 30 lines each,
|
||||
or a 3 buffer diff hunk of 20 lines each.
|
||||
Implicitly sets "filler" when this is set.
|
||||
|
||||
vertical Start diff mode with vertical splits (unless
|
||||
explicitly specified otherwise).
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
*quickref.txt* For Vim version 9.1. Last change: 2025 Jun 28
|
||||
*quickref.txt* For Vim version 9.1. Last change: 2025 Jul 16
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -682,6 +682,7 @@ Short explanation of each option: *option-list*
|
||||
'delcombine' 'deco' delete combining characters on their own
|
||||
'dictionary' 'dict' list of file names used for keyword completion
|
||||
'diff' use diff mode for the current window
|
||||
'diffanchors' 'dia' list of {address} to force anchoring of a diff
|
||||
'diffexpr' 'dex' expression used to obtain a diff file
|
||||
'diffopt' 'dip' options for using diff mode
|
||||
'digraph' 'dg' enable the entering of digraphs in Insert mode
|
||||
|
||||
@ -216,9 +216,11 @@ $quote eval.txt /*$quote*
|
||||
'delcombine' options.txt /*'delcombine'*
|
||||
'dex' options.txt /*'dex'*
|
||||
'dg' options.txt /*'dg'*
|
||||
'dia' options.txt /*'dia'*
|
||||
'dict' options.txt /*'dict'*
|
||||
'dictionary' options.txt /*'dictionary'*
|
||||
'diff' options.txt /*'diff'*
|
||||
'diffanchors' options.txt /*'diffanchors'*
|
||||
'diffexpr' options.txt /*'diffexpr'*
|
||||
'diffopt' options.txt /*'diffopt'*
|
||||
'digraph' options.txt /*'digraph'*
|
||||
@ -4667,7 +4669,9 @@ E1540 eval.txt /*E1540*
|
||||
E1541 vi_diff.txt /*E1541*
|
||||
E1547 various.txt /*E1547*
|
||||
E1548 wayland.txt /*E1548*
|
||||
E1549 options.txt /*E1549*
|
||||
E155 sign.txt /*E155*
|
||||
E1550 options.txt /*E1550*
|
||||
E156 sign.txt /*E156*
|
||||
E157 sign.txt /*E157*
|
||||
E158 sign.txt /*E158*
|
||||
@ -6935,6 +6939,7 @@ dict-modification eval.txt /*dict-modification*
|
||||
did_filetype() builtin.txt /*did_filetype()*
|
||||
diff diff.txt /*diff*
|
||||
diff() builtin.txt /*diff()*
|
||||
diff-anchors diff.txt /*diff-anchors*
|
||||
diff-diffexpr diff.txt /*diff-diffexpr*
|
||||
diff-func-examples diff.txt /*diff-func-examples*
|
||||
diff-mode diff.txt /*diff-mode*
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
*version9.txt* For Vim version 9.1. Last change: 2025 Jul 15
|
||||
*version9.txt* For Vim version 9.1. Last change: 2025 Jul 16
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@ -41570,6 +41570,12 @@ the "inline" sub option value for the 'diffopt' setting, with "inline:simple"
|
||||
being added to the default "diffopt" value (but this does not change how diff
|
||||
mode works).
|
||||
|
||||
The 'diffanchors' option specifies a comma-separated list of addresses in
|
||||
a buffer that act as anchor points for splitting and independently diffing
|
||||
buffer sections, improving diff alignment. It is only used when 'diffopt'
|
||||
includes "anchor" and all specified addresses must resolve in every buffer, or
|
||||
else the anchors are ignored.
|
||||
|
||||
Completion~
|
||||
----------
|
||||
- New Insert-mode completion: |i_CTRL-X_CTRL-R| to complete words from
|
||||
@ -41799,6 +41805,7 @@ Options: ~
|
||||
|ins-completion| modes
|
||||
'completeitemalign' Order of |complete-items| in Insert mode completion
|
||||
popup
|
||||
'diffanchors' list of {address} to force syncing of diffs
|
||||
'eventignorewin' autocommand events that are ignored in a window
|
||||
'findfunc' Vim function to obtain the results for a |:find|
|
||||
command
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
" These commands create the option window.
|
||||
"
|
||||
" Maintainer: The Vim Project <https://github.com/vim/vim>
|
||||
" Last Change: 2025 Jul 10
|
||||
" Last Change: 2025 Jul 16
|
||||
" Former Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
|
||||
" If there already is an option window, jump to that one.
|
||||
@ -1056,6 +1056,9 @@ if has("diff")
|
||||
call <SID>OptionG("dip", &dip)
|
||||
call <SID>AddOption("diffexpr", gettext("expression used to obtain a diff file"))
|
||||
call <SID>OptionG("dex", &dex)
|
||||
call <SID>AddOption("diffanchors", gettext("list of addresses for anchoring a diff"))
|
||||
call append("$", "\t" .. s:global_or_local)
|
||||
call <SID>OptionG("dia", &dia)
|
||||
call <SID>AddOption("patchexpr", gettext("expression used to patch a file"))
|
||||
call <SID>OptionG("pex", &pex)
|
||||
endif
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
" Language: Vim script
|
||||
" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
|
||||
" Doug Kearns <dougkearns@gmail.com>
|
||||
" Last Change: 2025 Jul 14
|
||||
" Last Change: 2025 Jul 16
|
||||
" Former Maintainer: Charles E. Campbell
|
||||
|
||||
" DO NOT CHANGE DIRECTLY.
|
||||
@ -52,14 +52,14 @@ syn keyword vimStdPlugin contained Arguments Asm Break Cfilter Clear Continue Di
|
||||
" vimOptions are caught only when contained in a vimSet {{{2
|
||||
" GEN_SYN_VIM: vimOption normal, START_STR='syn keyword vimOption contained', END_STR='skipwhite nextgroup=vimSetEqual,vimSetMod'
|
||||
syn keyword vimOption contained al aleph ari allowrevins ambw ambiwidth arab arabic arshape arabicshape acd autochdir ai autoindent ar autoread asd autoshelldir aw autowrite awa autowriteall bg background bs backspace bk backup bkc backupcopy bdir backupdir bex backupext bsk backupskip bdlay balloondelay beval ballooneval bevalterm balloonevalterm bexpr balloonexpr bo belloff bin binary bomb brk breakat bri breakindent briopt breakindentopt bsdir browsedir bh bufhidden bl buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv charconvert chi chistory cin cindent cink cinkeys cino cinoptions cinsd cinscopedecls cinw cinwords cb clipboard cpm clipmethod ch cmdheight cwh cmdwinheight cc colorcolumn co columns com comments cms commentstring cp compatible skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained cpt complete cfu completefunc cfc completefuzzycollect cia completeitemalign cot completeopt cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt cursorlineopt debug def define deco delcombine dict dictionary diff dex diffexpr dip diffopt dg digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile efm errorformat ek esckeys ei eventignore eiw eventignorewin et expandtab skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained ex exrc fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp hkmapp hls hlsearch icon iconstring ic ignorecase skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained imaf imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd maxfuncdepth mmd maxmapdepth mm maxmem mmp maxmempattern mmt maxmemtot skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained msc maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse mousef mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt printoptions prompt ph pumheight pmw pummaxwidth pw pumwidth pythondll skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained pythonhome pythonthreedll pythonthreehome pyx pyxversion qftf quickfixtextfunc qe quoteescape ro readonly rdt redrawtime re regexpengine rnu relativenumber remap rop renderoptions report rs restorescreen ri revins rl rightleft rlc rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr scroll scb scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt sect sections secure sel selection slm selectmode ssop sessionoptions sh shell shcf shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash stmp shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw shiftwidth shm shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc sft showfulltag sm showmatch smd showmode stal showtabline skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained stpl showtabpanel ss sidescroll siso sidescrolloff scl signcolumn scs smartcase si smartindent sta smarttab sms smoothscroll sts softtabstop spell spc spellcapcheck spf spellfile spl spelllang spo spelloptions sps spellsuggest sb splitbelow spk splitkeep spr splitright sol startofline stl statusline su suffixes sua suffixesadd swf swapfile sws swapsync swb switchbuf smc synmaxcol syn syntax tcl tabclose tal tabline tpm tabpagemax tpl tabpanel tplo tabpanelopt ts tabstop tbs tagbsearch tc tagcase tfu tagfunc tl taglength tr tagrelative tag tags tgst tagstack tcldll term tbidi termbidi tenc termencoding tgc termguicolors twk termwinkey twsl termwinscroll tws termwinsize twt termwintype terse ta textauto tx textmode tw textwidth tsr thesaurus skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained tsrfu thesaurusfunc top tildeop to timeout tm timeoutlen title titlelen titleold titlestring tb toolbar tbis toolbariconsize ttimeout ttm ttimeoutlen tbi ttybuiltin tf ttyfast ttym ttymouse tsl ttyscroll tty ttytype udir undodir udf undofile ul undolevels ur undoreload uc updatecount ut updatetime vsts varsofttabstop vts vartabstop vbs verbose vfile verbosefile vdir viewdir vop viewoptions vi viminfo vif viminfofile ve virtualedit vb visualbell warn wiv weirdinvert ww whichwrap wc wildchar wcm wildcharm wig wildignore wic wildignorecase wmnu wildmenu wim wildmode wop wildoptions wak winaltkeys wcr wincolor wi window wfb winfixbuf wfh winfixheight wfw winfixwidth wh winheight wmh winminheight wmw winminwidth winptydll wiw winwidth skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained wse wlseat wst wlsteal wtm wltimeoutlen wrap wm wrapmargin ws wrapscan write wa writeany wb writebackup wd writedelay xtermcodes skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained cpt complete cfu completefunc cfc completefuzzycollect cia completeitemalign cot completeopt cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt cursorlineopt debug def define deco delcombine dict dictionary diff dia diffanchors dex diffexpr dip diffopt dg digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile efm errorformat ek esckeys ei eventignore eiw eventignorewin skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained et expandtab ex exrc fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp hkmapp hls hlsearch icon iconstring skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained ic ignorecase imaf imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd maxfuncdepth mmd maxmapdepth mm maxmem mmp maxmempattern skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained mmt maxmemtot msc maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse mousef mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt printoptions prompt ph pumheight pmw pummaxwidth skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained pw pumwidth pythondll pythonhome pythonthreedll pythonthreehome pyx pyxversion qftf quickfixtextfunc qe quoteescape ro readonly rdt redrawtime re regexpengine rnu relativenumber remap rop renderoptions report rs restorescreen ri revins rl rightleft rlc rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr scroll scb scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt sect sections secure sel selection slm selectmode ssop sessionoptions sh shell shcf shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash stmp shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw shiftwidth shm shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc sft showfulltag sm showmatch skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained smd showmode stal showtabline stpl showtabpanel ss sidescroll siso sidescrolloff scl signcolumn scs smartcase si smartindent sta smarttab sms smoothscroll sts softtabstop spell spc spellcapcheck spf spellfile spl spelllang spo spelloptions sps spellsuggest sb splitbelow spk splitkeep spr splitright sol startofline stl statusline su suffixes sua suffixesadd swf swapfile sws swapsync swb switchbuf smc synmaxcol syn syntax tcl tabclose tal tabline tpm tabpagemax tpl tabpanel tplo tabpanelopt ts tabstop tbs tagbsearch tc tagcase tfu tagfunc tl taglength tr tagrelative tag tags tgst tagstack tcldll term tbidi termbidi tenc termencoding tgc termguicolors twk termwinkey twsl termwinscroll tws termwinsize twt termwintype terse ta textauto skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained tx textmode tw textwidth tsr thesaurus tsrfu thesaurusfunc top tildeop to timeout tm timeoutlen title titlelen titleold titlestring tb toolbar tbis toolbariconsize ttimeout ttm ttimeoutlen tbi ttybuiltin tf ttyfast ttym ttymouse tsl ttyscroll tty ttytype udir undodir udf undofile ul undolevels ur undoreload uc updatecount ut updatetime vsts varsofttabstop vts vartabstop vbs verbose vfile verbosefile vdir viewdir vop viewoptions vi viminfo vif viminfofile ve virtualedit vb visualbell warn wiv weirdinvert ww whichwrap wc wildchar wcm wildcharm wig wildignore wic wildignorecase wmnu wildmenu wim wildmode wop wildoptions wak winaltkeys wcr wincolor wi window wfb winfixbuf wfh winfixheight wfw winfixwidth wh winheight wmh winminheight skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
syn keyword vimOption contained wmw winminwidth winptydll wiw winwidth wse wlseat wst wlsteal wtm wltimeoutlen wrap wm wrapmargin ws wrapscan write wa writeany wb writebackup wd writedelay xtermcodes skipwhite nextgroup=vimSetEqual,vimSetMod
|
||||
|
||||
" vimOptions: These are the turn-off setting variants {{{2
|
||||
" GEN_SYN_VIM: vimOption turn-off, START_STR='syn keyword vimOption contained', END_STR=''
|
||||
@ -91,7 +91,7 @@ syn match vimOption contained "t_k;"
|
||||
" vimOptions: These are the variable names {{{2
|
||||
" GEN_SYN_VIM: vimOption normal variable, START_STR='syn keyword vimOptionVarName contained', END_STR=''
|
||||
syn keyword vimOptionVarName contained al aleph ari allowrevins ambw ambiwidth arab arabic arshape arabicshape acd autochdir ai autoindent ar autoread asd autoshelldir aw autowrite awa autowriteall bg background bs backspace bk backup bkc backupcopy bdir backupdir bex backupext bsk backupskip bdlay balloondelay beval ballooneval bevalterm balloonevalterm bexpr balloonexpr bo belloff bin binary bomb brk breakat bri breakindent briopt breakindentopt bsdir browsedir bh bufhidden bl buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv charconvert chi chistory cin cindent cink cinkeys cino cinoptions cinsd cinscopedecls cinw cinwords cb clipboard cpm clipmethod ch cmdheight cwh cmdwinheight cc colorcolumn co columns com comments cms commentstring cp compatible
|
||||
syn keyword vimOptionVarName contained cpt complete cfu completefunc cfc completefuzzycollect cia completeitemalign cot completeopt cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt cursorlineopt debug def define deco delcombine dict dictionary diff dex diffexpr dip diffopt dg digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile efm errorformat ek esckeys ei eventignore eiw eventignorewin
|
||||
syn keyword vimOptionVarName contained cpt complete cfu completefunc cfc completefuzzycollect cia completeitemalign cot completeopt cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt cursorlineopt debug def define deco delcombine dict dictionary diff dia diffanchors dex diffexpr dip diffopt dg digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile efm errorformat ek esckeys ei eventignore eiw eventignorewin
|
||||
syn keyword vimOptionVarName contained et expandtab ex exrc fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp hkmapp hls hlsearch icon iconstring
|
||||
syn keyword vimOptionVarName contained ic ignorecase imaf imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd maxfuncdepth mmd maxmapdepth mm maxmem mmp maxmempattern
|
||||
syn keyword vimOptionVarName contained mmt maxmemtot msc maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse mousef mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt printoptions prompt ph pumheight pmw pummaxwidth
|
||||
|
||||
@ -2524,6 +2524,9 @@ free_buf_options(
|
||||
free_callback(&buf->b_ffu_cb);
|
||||
#endif
|
||||
clear_string_option(&buf->b_p_dict);
|
||||
#ifdef FEAT_DIFF
|
||||
clear_string_option(&buf->b_p_dia);
|
||||
#endif
|
||||
clear_string_option(&buf->b_p_tsr);
|
||||
clear_string_option(&buf->b_p_qe);
|
||||
buf->b_p_ar = -1;
|
||||
|
||||
625
src/diff.c
625
src/diff.c
@ -42,6 +42,7 @@ static int diff_need_update = FALSE; // ex_diffupdate needs to be called
|
||||
#define DIFF_INLINE_SIMPLE 0x4000 // inline highlight with simple algorithm
|
||||
#define DIFF_INLINE_CHAR 0x8000 // inline highlight with character diff
|
||||
#define DIFF_INLINE_WORD 0x10000 // inline highlight with word diff
|
||||
#define DIFF_ANCHOR 0x20000 // use 'diffanchors' to anchor the diff
|
||||
#define ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL)
|
||||
#define ALL_INLINE (DIFF_INLINE_NONE | DIFF_INLINE_SIMPLE | DIFF_INLINE_CHAR | DIFF_INLINE_WORD)
|
||||
#define ALL_INLINE_DIFF (DIFF_INLINE_CHAR | DIFF_INLINE_WORD)
|
||||
@ -59,6 +60,8 @@ static int diff_bin_works = MAYBE; // TRUE when "diff --binary" works, FALSE
|
||||
// checked yet
|
||||
#endif
|
||||
|
||||
#define MAX_DIFF_ANCHORS 20
|
||||
|
||||
// used for diff input
|
||||
typedef struct {
|
||||
char_u *din_fname; // used for external diff
|
||||
@ -113,6 +116,7 @@ static int parse_diff_ed(char_u *line, diffhunk_T *hunk);
|
||||
static int parse_diff_unified(char_u *line, diffhunk_T *hunk);
|
||||
static int xdiff_out_indices(long start_a, long count_a, long start_b, long count_b, void *priv);
|
||||
static int xdiff_out_unified(void *priv, mmbuffer_t *mb, int nbuf);
|
||||
static int parse_diffanchors(int check_only, buf_T *buf, linenr_T *anchors, int *num_anchors);
|
||||
|
||||
#define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
|
||||
for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
|
||||
@ -410,10 +414,22 @@ diff_mark_adjust_tp(
|
||||
// 1. change completely above line1: nothing to do
|
||||
if (last >= line1 - 1)
|
||||
{
|
||||
if (diff_busy)
|
||||
{
|
||||
// Currently in the middle of updating diff blocks. All we want
|
||||
// is to adjust the line numbers and nothing else.
|
||||
if (dp->df_lnum[idx] > line2)
|
||||
dp->df_lnum[idx] += amount_after;
|
||||
|
||||
// Advance to next entry.
|
||||
dprev = dp;
|
||||
dp = dp->df_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 6. change below line2: only adjust for amount_after; also when
|
||||
// "deleted" became zero when deleted all lines between two diffs
|
||||
if (dp->df_lnum[idx] - (deleted + inserted != 0) > line2 -
|
||||
(dp->is_linematched ? 1 : 0))
|
||||
if (dp->df_lnum[idx] - (deleted + inserted != 0) > line2)
|
||||
{
|
||||
if (amount_after == 0)
|
||||
break; // nothing left to change
|
||||
@ -516,7 +532,7 @@ diff_mark_adjust_tp(
|
||||
}
|
||||
|
||||
// check if this block touches the previous one, may merge them.
|
||||
if (dprev != NULL && !dp->is_linematched
|
||||
if (dprev != NULL && !dp->is_linematched && !diff_busy
|
||||
&& dprev->df_lnum[idx] + dprev->df_count[idx]
|
||||
== dp->df_lnum[idx])
|
||||
{
|
||||
@ -720,7 +736,7 @@ diff_redraw(
|
||||
#endif
|
||||
// A change may have made filler lines invalid, need to take care of
|
||||
// that for other windows.
|
||||
n = diff_check(wp, wp->w_topline);
|
||||
n = diff_check_fill(wp, wp->w_topline);
|
||||
if ((wp != curwin && wp->w_topfill > 0) || n > 0)
|
||||
{
|
||||
if (wp->w_topfill > n)
|
||||
@ -783,7 +799,7 @@ diff_write_buffer(buf_T *buf, diffin_T *din, linenr_T start, linenr_T end)
|
||||
if (end < 0)
|
||||
end = buf->b_ml.ml_line_count;
|
||||
|
||||
if (buf->b_ml.ml_flags & ML_EMPTY)
|
||||
if (buf->b_ml.ml_flags & ML_EMPTY || end < start)
|
||||
{
|
||||
din->din_mmfile.ptr = NULL;
|
||||
din->din_mmfile.size = 0;
|
||||
@ -868,31 +884,55 @@ diff_write_buffer(buf_T *buf, diffin_T *din, linenr_T start, linenr_T end)
|
||||
* Return FAIL for failure.
|
||||
*/
|
||||
static int
|
||||
diff_write(buf_T *buf, diffin_T *din)
|
||||
diff_write(buf_T *buf, diffin_T *din, linenr_T start, linenr_T end)
|
||||
{
|
||||
int r;
|
||||
int save_ml_flags;
|
||||
char_u *save_ff;
|
||||
int save_cmod_flags;
|
||||
|
||||
if (din->din_fname == NULL)
|
||||
return diff_write_buffer(buf, din, 1, -1);
|
||||
return diff_write_buffer(buf, din, start, end);
|
||||
|
||||
if (end < 0)
|
||||
end = buf->b_ml.ml_line_count;
|
||||
|
||||
// Always use 'fileformat' set to "unix".
|
||||
save_ml_flags = buf->b_ml.ml_flags;
|
||||
save_ff = buf->b_p_ff;
|
||||
buf->b_p_ff = vim_strsave((char_u *)FF_UNIX);
|
||||
save_cmod_flags = cmdmod.cmod_flags;
|
||||
// Writing the buffer is an implementation detail of performing the diff,
|
||||
// so it shouldn't update the '[ and '] marks.
|
||||
cmdmod.cmod_flags |= CMOD_LOCKMARKS;
|
||||
if (end < start)
|
||||
{
|
||||
// The line range specifies a completely empty file.
|
||||
end = start;
|
||||
buf->b_ml.ml_flags |= ML_EMPTY;
|
||||
}
|
||||
r = buf_write(buf, din->din_fname, NULL,
|
||||
(linenr_T)1, buf->b_ml.ml_line_count,
|
||||
start, end,
|
||||
NULL, FALSE, FALSE, FALSE, TRUE);
|
||||
cmdmod.cmod_flags = save_cmod_flags;
|
||||
free_string_option(buf->b_p_ff);
|
||||
buf->b_p_ff = save_ff;
|
||||
buf->b_ml.ml_flags = save_ml_flags;
|
||||
return r;
|
||||
}
|
||||
|
||||
static int
|
||||
lnum_compare(const void *s1, const void *s2)
|
||||
{
|
||||
linenr_T lnum1 = *(linenr_T*)s1;
|
||||
linenr_T lnum2 = *(linenr_T*)s2;
|
||||
if (lnum1 < lnum2)
|
||||
return -1;
|
||||
if (lnum1 > lnum2)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update the diffs for all buffers involved.
|
||||
*/
|
||||
@ -934,31 +974,113 @@ diff_try_update(
|
||||
buf_check_timestamp(buf, FALSE);
|
||||
}
|
||||
|
||||
// Write the first buffer to a tempfile or mmfile_t.
|
||||
buf = curtab->tp_diffbuf[idx_orig];
|
||||
if (diff_write(buf, &dio->dio_orig) == FAIL)
|
||||
goto theend;
|
||||
|
||||
// Make a difference between the first buffer and every other.
|
||||
for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
|
||||
// Parse and sort diff anchors if enabled
|
||||
int num_anchors = INT_MAX;
|
||||
linenr_T anchors[DB_COUNT][MAX_DIFF_ANCHORS];
|
||||
CLEAR_FIELD(anchors);
|
||||
if (diff_flags & DIFF_ANCHOR)
|
||||
{
|
||||
buf = curtab->tp_diffbuf[idx_new];
|
||||
if (buf == NULL || buf->b_ml.ml_mfp == NULL)
|
||||
continue; // skip buffer that isn't loaded
|
||||
for (int idx = 0; idx < DB_COUNT; idx++)
|
||||
{
|
||||
if (curtab->tp_diffbuf[idx] == NULL)
|
||||
continue;
|
||||
int buf_num_anchors = 0;
|
||||
if (parse_diffanchors(FALSE,
|
||||
curtab->tp_diffbuf[idx],
|
||||
anchors[idx],
|
||||
&buf_num_anchors) != OK)
|
||||
{
|
||||
emsg(_(e_failed_to_find_all_diff_anchors));
|
||||
num_anchors = 0;
|
||||
CLEAR_FIELD(anchors);
|
||||
break;
|
||||
}
|
||||
if (buf_num_anchors < num_anchors)
|
||||
num_anchors = buf_num_anchors;
|
||||
|
||||
// Write the other buffer and diff with the first one.
|
||||
if (diff_write(buf, &dio->dio_new) == FAIL)
|
||||
continue;
|
||||
if (diff_file(dio) == FAIL)
|
||||
continue;
|
||||
|
||||
// Read the diff output and add each entry to the diff list.
|
||||
diff_read(idx_orig, idx_new, dio);
|
||||
|
||||
clear_diffin(&dio->dio_new);
|
||||
clear_diffout(&dio->dio_diff);
|
||||
if (buf_num_anchors > 0)
|
||||
qsort((void *)anchors[idx],
|
||||
(size_t)buf_num_anchors,
|
||||
sizeof(linenr_T),
|
||||
lnum_compare);
|
||||
}
|
||||
}
|
||||
if (num_anchors == INT_MAX)
|
||||
num_anchors = 0;
|
||||
|
||||
// Split the files into multiple sections by anchors. Each section starts
|
||||
// from one anchor (inclusive) and ends at the next anchor (exclusive).
|
||||
// Diff each section separately before combining the results. If we don't
|
||||
// have any anchors, we will have one big section of the entire file.
|
||||
for (int anchor_i = 0; anchor_i <= num_anchors; anchor_i++)
|
||||
{
|
||||
diff_T *orig_diff = NULL;
|
||||
if (anchor_i != 0)
|
||||
{
|
||||
orig_diff = curtab->tp_first_diff;
|
||||
curtab->tp_first_diff = NULL;
|
||||
}
|
||||
linenr_T lnum_start = (anchor_i == 0) ? 1 : anchors[idx_orig][anchor_i - 1];
|
||||
linenr_T lnum_end = (anchor_i == num_anchors) ? -1 : anchors[idx_orig][anchor_i] - 1;
|
||||
|
||||
// Write the first buffer to a tempfile or mmfile_t.
|
||||
buf = curtab->tp_diffbuf[idx_orig];
|
||||
if (diff_write(buf, &dio->dio_orig, lnum_start, lnum_end) == FAIL)
|
||||
{
|
||||
if (orig_diff != NULL)
|
||||
{
|
||||
// Clean up in-progress diff blocks
|
||||
curtab->tp_first_diff = orig_diff;
|
||||
diff_clear(curtab);
|
||||
}
|
||||
goto theend;
|
||||
}
|
||||
|
||||
// Make a difference between the first buffer and every other.
|
||||
for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
|
||||
{
|
||||
buf = curtab->tp_diffbuf[idx_new];
|
||||
if (buf == NULL || buf->b_ml.ml_mfp == NULL)
|
||||
continue; // skip buffer that isn't loaded
|
||||
|
||||
lnum_start = anchor_i == 0 ? 1 : anchors[idx_new][anchor_i - 1];
|
||||
lnum_end = anchor_i == num_anchors ? -1 : anchors[idx_new][anchor_i] - 1;
|
||||
|
||||
// Write the other buffer and diff with the first one.
|
||||
if (diff_write(buf, &dio->dio_new, lnum_start, lnum_end) == FAIL)
|
||||
continue;
|
||||
if (diff_file(dio) == FAIL)
|
||||
continue;
|
||||
|
||||
// Read the diff output and add each entry to the diff list.
|
||||
diff_read(idx_orig, idx_new, dio);
|
||||
|
||||
clear_diffin(&dio->dio_new);
|
||||
clear_diffout(&dio->dio_diff);
|
||||
}
|
||||
clear_diffin(&dio->dio_orig);
|
||||
|
||||
if (anchor_i != 0)
|
||||
{
|
||||
// Combine the new diff blocks with the existing ones
|
||||
for (diff_T *dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
|
||||
{
|
||||
for (int idx = 0; idx < DB_COUNT; idx++)
|
||||
{
|
||||
if (anchors[idx][anchor_i - 1] > 0)
|
||||
dp->df_lnum[idx] += anchors[idx][anchor_i - 1] - 1;
|
||||
}
|
||||
}
|
||||
if (orig_diff != NULL)
|
||||
{
|
||||
diff_T *last_diff = orig_diff;
|
||||
while (last_diff->df_next != NULL)
|
||||
last_diff = last_diff->df_next;
|
||||
last_diff->df_next = curtab->tp_first_diff;
|
||||
curtab->tp_first_diff = orig_diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
clear_diffin(&dio->dio_orig);
|
||||
|
||||
theend:
|
||||
vim_free(dio->dio_orig.din_fname);
|
||||
@ -2025,10 +2147,15 @@ get_max_diff_length(const diff_T *dp)
|
||||
return maxlength;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the first diff block that includes the specified line. Also find the
|
||||
* next diff block that's not in the current chain of adjacent blocks that are
|
||||
* all touching each other directly.
|
||||
*/
|
||||
static void
|
||||
find_top_diff_block(
|
||||
diff_T **thistopdiff,
|
||||
diff_T **nextblockblock,
|
||||
diff_T **next_adjacent_blocks,
|
||||
int fromidx,
|
||||
int topline)
|
||||
{
|
||||
@ -2071,61 +2198,17 @@ find_top_diff_block(
|
||||
// block, set the marker of the next block and finish the iteration
|
||||
if (*thistopdiff)
|
||||
{
|
||||
(*nextblockblock) = topdiff->df_next;
|
||||
(*next_adjacent_blocks) = topdiff->df_next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
count_filler_lines_and_topline(
|
||||
int *curlinenum_to,
|
||||
int *linesfiller,
|
||||
const diff_T *thistopdiff,
|
||||
const int toidx,
|
||||
int virtual_lines_passed)
|
||||
{
|
||||
const diff_T *curdif = thistopdiff;
|
||||
int ch_virtual_lines = 0;
|
||||
int isfiller = FALSE;
|
||||
|
||||
while (virtual_lines_passed > 0)
|
||||
{
|
||||
if (ch_virtual_lines)
|
||||
{
|
||||
virtual_lines_passed--;
|
||||
ch_virtual_lines--;
|
||||
if (!isfiller)
|
||||
(*curlinenum_to)++;
|
||||
else
|
||||
(*linesfiller)++;
|
||||
}
|
||||
else
|
||||
{
|
||||
(*linesfiller) = 0;
|
||||
if (curdif)
|
||||
{
|
||||
ch_virtual_lines = get_max_diff_length(curdif);
|
||||
isfiller = (curdif->df_count[toidx] ? FALSE : TRUE);
|
||||
}
|
||||
if (isfiller)
|
||||
{
|
||||
while (curdif && curdif->df_next &&
|
||||
curdif->df_lnum[toidx] ==
|
||||
curdif->df_next->df_lnum[toidx] &&
|
||||
curdif->df_next->df_count[toidx] == 0)
|
||||
{
|
||||
curdif = curdif->df_next;
|
||||
ch_virtual_lines += get_max_diff_length(curdif);
|
||||
}
|
||||
}
|
||||
if (curdif)
|
||||
curdif = curdif->df_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculates topline/topfill of a target diff window to fit the source diff
|
||||
* window.
|
||||
*/
|
||||
static void
|
||||
calculate_topfill_and_topline(
|
||||
const int fromidx,
|
||||
@ -2135,15 +2218,19 @@ calculate_topfill_and_topline(
|
||||
int *topfill,
|
||||
linenr_T *topline)
|
||||
{
|
||||
// 1. find the position from the top of the diff block, and the start
|
||||
// of the next diff block
|
||||
// find the position from the top of the diff block, and the next diff
|
||||
// block that's no longer adjacent to the current block. "Adjacency" means
|
||||
// a chain of diff blocks that are directly touching each other, allowed by
|
||||
// linematch and diff anchors.
|
||||
diff_T *thistopdiff = NULL;
|
||||
diff_T *nextblockblock = NULL;
|
||||
diff_T *next_adjacent_blocks = NULL;
|
||||
int virtual_lines_passed = 0;
|
||||
|
||||
find_top_diff_block(&thistopdiff, &nextblockblock, fromidx, from_topline);
|
||||
find_top_diff_block(&thistopdiff, &next_adjacent_blocks, fromidx, from_topline);
|
||||
|
||||
// count the virtual lines that have been passed
|
||||
// count the virtual lines (either filler or concrete line) that have been
|
||||
// passed in the source buffer. There could be multiple diff blocks if
|
||||
// there are adjacent empty blocks (count == 0 at fromidx).
|
||||
diff_T *curdif = thistopdiff;
|
||||
while (curdif && (curdif->df_lnum[fromidx] + curdif->df_count[fromidx])
|
||||
<= from_topline)
|
||||
@ -2153,75 +2240,50 @@ calculate_topfill_and_topline(
|
||||
curdif = curdif->df_next;
|
||||
}
|
||||
|
||||
if (curdif != nextblockblock)
|
||||
if (curdif != next_adjacent_blocks)
|
||||
virtual_lines_passed += from_topline - curdif->df_lnum[fromidx];
|
||||
virtual_lines_passed -= from_topfill;
|
||||
|
||||
// count the same amount of virtual lines in the toidx buffer
|
||||
// clamp negative values in case from_topfill hasn't been updated yet and
|
||||
// is larger than total virtual lines, which could happen when setting
|
||||
// diffopt multiple times
|
||||
if (virtual_lines_passed < 0)
|
||||
virtual_lines_passed = 0;
|
||||
|
||||
// move the same amount of virtual lines in the target buffer to find the
|
||||
// cursor's line number
|
||||
int curlinenum_to = thistopdiff->df_lnum[toidx];
|
||||
int linesfiller = 0;
|
||||
|
||||
count_filler_lines_and_topline(&curlinenum_to, &linesfiller, thistopdiff,
|
||||
toidx, virtual_lines_passed);
|
||||
|
||||
// count the number of filler lines that would normally be above this line
|
||||
int maxfiller = 0;
|
||||
for (diff_T *dpfillertest = thistopdiff; dpfillertest != NULL;
|
||||
dpfillertest = dpfillertest->df_next)
|
||||
int virt_lines_left = virtual_lines_passed;
|
||||
curdif = thistopdiff;
|
||||
while (virt_lines_left > 0 && curdif != NULL && curdif != next_adjacent_blocks)
|
||||
{
|
||||
if (dpfillertest->df_lnum[toidx] == curlinenum_to)
|
||||
curlinenum_to += MIN(virt_lines_left, curdif->df_count[toidx]);
|
||||
virt_lines_left -= MIN(virt_lines_left, get_max_diff_length(curdif));
|
||||
curdif = curdif->df_next;
|
||||
}
|
||||
|
||||
// count the total number of virtual lines between the top diff block and
|
||||
// the found line in the target buffer
|
||||
int max_virt_lines = 0;
|
||||
for (diff_T *dp = thistopdiff; dp != NULL; dp = dp->df_next)
|
||||
{
|
||||
if (dp->df_lnum[toidx] + dp->df_count[toidx] <= curlinenum_to)
|
||||
max_virt_lines += get_max_diff_length(dp);
|
||||
else
|
||||
{
|
||||
while (dpfillertest && dpfillertest->df_lnum[toidx] ==
|
||||
curlinenum_to)
|
||||
{
|
||||
maxfiller += dpfillertest->df_count[toidx] ? 0 :
|
||||
get_max_diff_length(dpfillertest);
|
||||
dpfillertest = dpfillertest->df_next;
|
||||
}
|
||||
if (dp->df_lnum[toidx] <= curlinenum_to)
|
||||
max_virt_lines += curlinenum_to - dp->df_lnum[toidx];
|
||||
break;
|
||||
}
|
||||
}
|
||||
(*topfill) = maxfiller - linesfiller;
|
||||
|
||||
if (diff_flags & DIFF_FILLER)
|
||||
// should always be non-negative as max_virt_lines is larger
|
||||
(*topfill) = max_virt_lines - virtual_lines_passed;
|
||||
(*topline) = curlinenum_to;
|
||||
}
|
||||
|
||||
static int
|
||||
linematched_filler_lines(diff_T *dp, int idx, linenr_T lnum, int *linestatus)
|
||||
{
|
||||
int filler_lines_d1 = 0;
|
||||
|
||||
while (dp && dp->df_next &&
|
||||
lnum == (dp->df_lnum[idx] + dp->df_count[idx]) &&
|
||||
dp->df_next->df_lnum[idx] == lnum)
|
||||
{
|
||||
if (dp->df_count[idx] == 0)
|
||||
filler_lines_d1 += get_max_diff_length(dp);
|
||||
dp = dp->df_next;
|
||||
}
|
||||
|
||||
if (dp->df_count[idx] == 0)
|
||||
filler_lines_d1 += get_max_diff_length(dp);
|
||||
|
||||
if (lnum < dp->df_lnum[idx] + dp->df_count[idx])
|
||||
{
|
||||
int j = 0;
|
||||
|
||||
for (int i = 0; i < DB_COUNT; i++)
|
||||
{
|
||||
if (curtab->tp_diffbuf[i] != NULL)
|
||||
{
|
||||
if (dp->df_count[i])
|
||||
j++;
|
||||
}
|
||||
// is this an added line or a changed line?
|
||||
if (linestatus)
|
||||
(*linestatus) = (j == 1) ? -2 : -1;
|
||||
}
|
||||
}
|
||||
|
||||
return filler_lines_d1;
|
||||
}
|
||||
|
||||
// Apply results from the linematch algorithm and apply to 'dp' by splitting it
|
||||
// into multiple adjacent diff blocks.
|
||||
static void
|
||||
@ -2340,18 +2402,19 @@ run_linematch_algorithm(diff_T *dp)
|
||||
|
||||
/*
|
||||
* Check diff status for line "lnum" in buffer "buf":
|
||||
* Returns 0 for nothing special
|
||||
* Returns -1 for a line that should be highlighted as changed.
|
||||
* Returns -2 for a line that should be highlighted as added/deleted.
|
||||
* Returns > 0 for inserting that many filler lines above it (never happens
|
||||
* when 'diffopt' doesn't contain "filler").
|
||||
* when 'diffopt' doesn't contain "filler"). Otherwise returns 0.
|
||||
*
|
||||
* "linestatus" (can be NULL) will be set to:
|
||||
* 0 for nothing special.
|
||||
* -1 for a line that should be highlighted as changed.
|
||||
* -2 for a line that should be highlighted as added/deleted.
|
||||
*
|
||||
* This should only be used for windows where 'diff' is set.
|
||||
* When diffopt contains linematch, a changed/added/deleted line
|
||||
* may also have filler lines above it. In such a case, the possibilities
|
||||
* are no longer mutually exclusive. The number of filler lines is
|
||||
* returned from diff_check, and the integer 'linestatus' passed by
|
||||
* pointer is set to -1 to indicate a changed line, and -2 to indicate an
|
||||
* added line
|
||||
*
|
||||
* Note that it's possible for a changed/added/deleted line to also have filler
|
||||
* lines above it. This happens when using linematch or using diff anchors (at
|
||||
* the anchored lines).
|
||||
*/
|
||||
int
|
||||
diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
@ -2363,6 +2426,9 @@ diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
buf_T *buf = wp->w_buffer;
|
||||
int cmp;
|
||||
|
||||
if (linestatus != NULL)
|
||||
*linestatus = 0;
|
||||
|
||||
if (curtab->tp_diff_invalid)
|
||||
ex_diffupdate(NULL); // update after a big change
|
||||
|
||||
@ -2397,8 +2463,32 @@ diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
&& diff_check_sanity(curtab, dp))
|
||||
run_linematch_algorithm(dp);
|
||||
|
||||
if (dp->is_linematched)
|
||||
return linematched_filler_lines(dp, idx, lnum, linestatus);
|
||||
// Insert filler lines above the line just below the change. Will return 0
|
||||
// when this buf had the max count.
|
||||
int num_fill = 0;
|
||||
while (lnum == dp->df_lnum[idx] + dp->df_count[idx])
|
||||
{
|
||||
// Only calculate fill lines if 'diffopt' contains "filler". Otherwise
|
||||
// returns 0 filler lines.
|
||||
if (diff_flags & DIFF_FILLER)
|
||||
{
|
||||
maxcount = get_max_diff_length(dp);
|
||||
num_fill += maxcount - dp->df_count[idx];
|
||||
}
|
||||
|
||||
// If there are adjacent blocks (e.g. linematch or anchor), loop
|
||||
// through them. It's possible for multiple adjacent blocks to
|
||||
// contribute to filler lines.
|
||||
// This also helps us find the last diff block in the list of adjacent
|
||||
// blocks which is necessary when it is a change/inserted line right
|
||||
// after added lines.
|
||||
if (dp->df_next != NULL
|
||||
&& lnum >= dp->df_next->df_lnum[idx]
|
||||
&& lnum <= dp->df_next->df_lnum[idx] + dp->df_next->df_count[idx])
|
||||
dp = dp->df_next;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (lnum < dp->df_lnum[idx] + dp->df_count[idx])
|
||||
{
|
||||
@ -2416,7 +2506,11 @@ diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
else
|
||||
{
|
||||
if (dp->df_count[i] != dp->df_count[idx])
|
||||
return -1; // nr of lines changed.
|
||||
{
|
||||
if (linestatus)
|
||||
*linestatus = -1; // nr of lines changed.
|
||||
return num_fill;
|
||||
}
|
||||
cmp = TRUE;
|
||||
}
|
||||
}
|
||||
@ -2428,7 +2522,11 @@ diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
if (i != idx && curtab->tp_diffbuf[i] != NULL
|
||||
&& dp->df_count[i] != 0)
|
||||
if (!diff_equal_entry(dp, idx, i))
|
||||
return -1;
|
||||
{
|
||||
if (linestatus)
|
||||
*linestatus = -1;
|
||||
return num_fill;
|
||||
}
|
||||
}
|
||||
// If there is no buffer with zero lines then there is no difference
|
||||
// any longer. Happens when making a change (or undo) that removes
|
||||
@ -2436,24 +2534,12 @@ diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus)
|
||||
// updating the window. Just report the text as unchanged. Other
|
||||
// windows might still show the change though.
|
||||
if (zero == FALSE)
|
||||
return 0;
|
||||
return -2;
|
||||
return num_fill;
|
||||
if (linestatus)
|
||||
*linestatus = -2;
|
||||
return num_fill;
|
||||
}
|
||||
|
||||
// If 'diffopt' doesn't contain "filler", return 0.
|
||||
if (!(diff_flags & DIFF_FILLER))
|
||||
return 0;
|
||||
|
||||
// Insert filler lines above the line just below the change. Will return
|
||||
// 0 when this buf had the max count.
|
||||
maxcount = get_max_diff_length(dp);
|
||||
return maxcount - dp->df_count[idx];
|
||||
}
|
||||
|
||||
int
|
||||
diff_check(win_T *wp, linenr_T lnum)
|
||||
{
|
||||
return diff_check_with_linestatus(wp, lnum, NULL);
|
||||
return num_fill;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2578,7 +2664,7 @@ diff_check_fill(win_T *wp, linenr_T lnum)
|
||||
// be quick when there are no filler lines
|
||||
if (!(diff_flags & DIFF_FILLER))
|
||||
return 0;
|
||||
n = diff_check(wp, lnum);
|
||||
n = diff_check_with_linestatus(wp, lnum, NULL);
|
||||
if (n <= 0)
|
||||
return 0;
|
||||
return n;
|
||||
@ -2596,8 +2682,6 @@ diff_set_topline(win_T *fromwin, win_T *towin)
|
||||
int fromidx;
|
||||
int toidx;
|
||||
diff_T *dp;
|
||||
int max_count;
|
||||
int i;
|
||||
|
||||
fromidx = diff_buf_idx(frombuf);
|
||||
if (fromidx == DB_COUNT)
|
||||
@ -2629,66 +2713,11 @@ diff_set_topline(win_T *fromwin, win_T *towin)
|
||||
towin->w_topline = lnum + (dp->df_lnum[toidx] - dp->df_lnum[fromidx]);
|
||||
if (lnum >= dp->df_lnum[fromidx])
|
||||
{
|
||||
if (dp->is_linematched)
|
||||
{
|
||||
calculate_topfill_and_topline(fromidx, toidx,
|
||||
fromwin->w_topline,
|
||||
fromwin->w_topfill,
|
||||
&towin->w_topfill,
|
||||
&towin->w_topline);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Inside a change: compute filler lines. With three or more
|
||||
// buffers we need to know the largest count.
|
||||
max_count = 0;
|
||||
for (i = 0; i < DB_COUNT; ++i)
|
||||
if (curtab->tp_diffbuf[i] != NULL
|
||||
&& max_count < dp->df_count[i])
|
||||
max_count = dp->df_count[i];
|
||||
|
||||
if (dp->df_count[toidx] == dp->df_count[fromidx])
|
||||
{
|
||||
// same number of lines: use same filler count
|
||||
towin->w_topfill = fromwin->w_topfill;
|
||||
}
|
||||
else if (dp->df_count[toidx] > dp->df_count[fromidx])
|
||||
{
|
||||
if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
|
||||
{
|
||||
// more lines in towin and fromwin doesn't show diff
|
||||
// lines, only filler lines
|
||||
if (max_count - fromwin->w_topfill >= dp->df_count[toidx])
|
||||
{
|
||||
// towin also only shows filler lines
|
||||
towin->w_topline = dp->df_lnum[toidx]
|
||||
+ dp->df_count[toidx];
|
||||
towin->w_topfill = fromwin->w_topfill;
|
||||
}
|
||||
else
|
||||
// towin still has some diff lines to show
|
||||
towin->w_topline = dp->df_lnum[toidx]
|
||||
+ max_count - fromwin->w_topfill;
|
||||
}
|
||||
}
|
||||
else if (towin->w_topline >= dp->df_lnum[toidx]
|
||||
+ dp->df_count[toidx])
|
||||
{
|
||||
// less lines in towin and no diff lines to show: compute
|
||||
// filler lines
|
||||
towin->w_topline = dp->df_lnum[toidx] + dp->df_count[toidx];
|
||||
if (diff_flags & DIFF_FILLER)
|
||||
{
|
||||
if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
|
||||
// fromwin is also out of diff lines
|
||||
towin->w_topfill = fromwin->w_topfill;
|
||||
else
|
||||
// fromwin has some diff lines
|
||||
towin->w_topfill = dp->df_lnum[fromidx] +
|
||||
max_count - lnum;
|
||||
}
|
||||
}
|
||||
}
|
||||
calculate_topfill_and_topline(fromidx, toidx,
|
||||
fromwin->w_topline,
|
||||
fromwin->w_topfill,
|
||||
&towin->w_topfill,
|
||||
&towin->w_topline);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2716,6 +2745,100 @@ diff_set_topline(win_T *fromwin, win_T *towin)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the diff anchors. If "check_only" is set, will only make sure the
|
||||
* syntax is correct.
|
||||
*/
|
||||
static int
|
||||
parse_diffanchors(int check_only, buf_T *buf, linenr_T *anchors, int *num_anchors)
|
||||
{
|
||||
int i;
|
||||
char_u *dia = (*buf->b_p_dia == NUL) ? p_dia : buf->b_p_dia;
|
||||
|
||||
buf_T *orig_curbuf = curbuf;
|
||||
win_T *orig_curwin = curwin;
|
||||
|
||||
win_T *bufwin = NULL;
|
||||
if (check_only)
|
||||
bufwin = curwin;
|
||||
else
|
||||
{
|
||||
// Find the first window tied to this buffer and ignore the rest. Will
|
||||
// only matter for window-specific addresses like `.` or `''`.
|
||||
FOR_ALL_WINDOWS(bufwin)
|
||||
if (bufwin->w_buffer == buf && bufwin->w_p_diff)
|
||||
break;
|
||||
if (bufwin == NULL)
|
||||
return FAIL; // should not really happen
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_DIFF_ANCHORS && *dia != NUL; i++)
|
||||
{
|
||||
if (*dia == ',') // don't allow empty values
|
||||
return FAIL;
|
||||
|
||||
curbuf = buf;
|
||||
curwin = bufwin;
|
||||
linenr_T lnum = get_address(NULL, &dia, ADDR_LINES, check_only, TRUE, FALSE, 1);
|
||||
curbuf = orig_curbuf;
|
||||
curwin = orig_curwin;
|
||||
|
||||
if (dia == NULL) // error detected
|
||||
return FAIL;
|
||||
if (*dia != ',' && *dia != NUL)
|
||||
return FAIL;
|
||||
|
||||
if (!check_only
|
||||
&& (lnum == MAXLNUM || lnum <= 0 || lnum > buf->b_ml.ml_line_count + 1))
|
||||
{
|
||||
emsg(_(e_invalid_range));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
if (anchors != NULL)
|
||||
anchors[i] = lnum;
|
||||
|
||||
if (*dia == ',')
|
||||
dia++;
|
||||
}
|
||||
if (i == MAX_DIFF_ANCHORS && *dia != NUL)
|
||||
{
|
||||
semsg(_(e_cannot_have_more_than_nr_diff_anchors), MAX_DIFF_ANCHORS);
|
||||
return FAIL;
|
||||
}
|
||||
if (num_anchors != NULL)
|
||||
*num_anchors = i;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called when 'diffanchors' is changed.
|
||||
*/
|
||||
int
|
||||
diffanchors_changed(int buflocal)
|
||||
{
|
||||
int result = parse_diffanchors(TRUE, curbuf, NULL, NULL);
|
||||
if (result == OK && (diff_flags & DIFF_ANCHOR))
|
||||
{
|
||||
tabpage_T *tp;
|
||||
FOR_ALL_TABPAGES(tp)
|
||||
{
|
||||
if (!buflocal)
|
||||
tp->tp_diff_invalid = TRUE;
|
||||
else
|
||||
{
|
||||
for (int idx = 0; idx < DB_COUNT; ++idx)
|
||||
if (tp->tp_diffbuf[idx] == curbuf)
|
||||
{
|
||||
tp->tp_diff_invalid = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called when 'diffopt' is changed.
|
||||
*/
|
||||
@ -2740,6 +2863,11 @@ diffopt_changed(void)
|
||||
p += 6;
|
||||
diff_flags_new |= DIFF_FILLER;
|
||||
}
|
||||
else if (STRNCMP(p, "anchor", 6) == 0)
|
||||
{
|
||||
p += 6;
|
||||
diff_flags_new |= DIFF_ANCHOR;
|
||||
}
|
||||
else if (STRNCMP(p, "context:", 8) == 0 && VIM_ISDIGIT(p[8]))
|
||||
{
|
||||
p += 8;
|
||||
@ -2873,6 +3001,9 @@ diffopt_changed(void)
|
||||
p += 10;
|
||||
linematch_lines_new = getdigits(&p);
|
||||
diff_flags_new |= DIFF_LINEMATCH;
|
||||
|
||||
// linematch does not make sense without filler set
|
||||
diff_flags_new |= DIFF_FILLER;
|
||||
}
|
||||
|
||||
if (*p != ',' && *p != NUL)
|
||||
@ -3574,15 +3705,8 @@ diff_find_change(
|
||||
|
||||
// search for a change that includes "lnum" in the list of diffblocks.
|
||||
FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
|
||||
if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
|
||||
if (lnum < dp->df_lnum[idx] + dp->df_count[idx])
|
||||
break;
|
||||
if (dp->is_linematched)
|
||||
{
|
||||
while (dp && dp->df_next
|
||||
&& lnum == dp->df_count[idx] + dp->df_lnum[idx]
|
||||
&& dp->df_next->df_lnum[idx] == lnum)
|
||||
dp = dp->df_next;
|
||||
}
|
||||
if (dp == NULL || diff_check_sanity(curtab, dp) == FAIL)
|
||||
return FALSE;
|
||||
|
||||
@ -3923,9 +4047,11 @@ ex_diffgetput(exarg_T *eap)
|
||||
{
|
||||
if (!eap->addr_count)
|
||||
{
|
||||
// handle the case with adjacent diff blocks
|
||||
while (dp->is_linematched
|
||||
&& dp->df_next
|
||||
// Handle the case with adjacent diff blocks (e.g. using linematch
|
||||
// or anchors) at/above the cursor. Since a range wasn't specified,
|
||||
// we just want to grab one diff block rather than all of them in
|
||||
// the vicinity.
|
||||
while (dp->df_next
|
||||
&& dp->df_next->df_lnum[idx_cur] == dp->df_lnum[idx_cur] +
|
||||
dp->df_count[idx_cur]
|
||||
&& dp->df_next->df_lnum[idx_cur] == eap->line1 + off + 1)
|
||||
@ -4548,7 +4674,6 @@ f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
|
||||
static int change_end = 0;
|
||||
static hlf_T hlID = (hlf_T)0;
|
||||
int cache_results = TRUE;
|
||||
int filler_lines;
|
||||
int col;
|
||||
diffline_T diffline;
|
||||
|
||||
@ -4578,10 +4703,10 @@ f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
|
||||
{
|
||||
// New line, buffer, change: need to get the values.
|
||||
int linestatus = 0;
|
||||
filler_lines = diff_check_with_linestatus(curwin, lnum, &linestatus);
|
||||
if (filler_lines < 0 || linestatus < 0)
|
||||
diff_check_with_linestatus(curwin, lnum, &linestatus);
|
||||
if (linestatus < 0)
|
||||
{
|
||||
if (filler_lines == -1 || linestatus == -1)
|
||||
if (linestatus == -1)
|
||||
{
|
||||
change_start = MAXCOL;
|
||||
change_end = -1;
|
||||
|
||||
@ -1476,9 +1476,9 @@ win_line(
|
||||
|
||||
CLEAR_FIELD(line_changes);
|
||||
|
||||
if (wlv.filler_lines < 0 || linestatus < 0)
|
||||
if (linestatus < 0)
|
||||
{
|
||||
if (wlv.filler_lines == -1 || linestatus == -1)
|
||||
if (linestatus == -1)
|
||||
{
|
||||
if (diff_find_change(wp, lnum, &line_changes))
|
||||
{
|
||||
@ -1509,9 +1509,6 @@ win_line(
|
||||
else
|
||||
wlv.diff_hlf = HLF_ADD;
|
||||
|
||||
if (linestatus == 0)
|
||||
wlv.filler_lines = 0;
|
||||
|
||||
area_highlighting = TRUE;
|
||||
}
|
||||
|
||||
|
||||
@ -3736,3 +3736,9 @@ EXTERN char e_cannot_not_support_redrawtabpanel[]
|
||||
EXTERN char e_wayland_connection_unavailable[]
|
||||
INIT(= N_("E1548: Wayland connection is unavailable"));
|
||||
#endif
|
||||
#if defined(FEAT_DIFF)
|
||||
EXTERN char e_cannot_have_more_than_nr_diff_anchors[]
|
||||
INIT(= N_("E1549: Cannot have more than %d diff anchors"));
|
||||
EXTERN char e_failed_to_find_all_diff_anchors[]
|
||||
INIT(= N_("E1550: Failed to find all diff anchors"));
|
||||
#endif
|
||||
|
||||
@ -66,7 +66,6 @@ static int getargopt(exarg_T *eap);
|
||||
#endif
|
||||
|
||||
static linenr_T default_address(exarg_T *eap);
|
||||
static linenr_T get_address(exarg_T *, char_u **, cmd_addr_T addr_type, int skip, int silent, int to_other_file, int address_count);
|
||||
static void address_default_all(exarg_T *eap);
|
||||
static void get_flags(exarg_T *eap);
|
||||
#if !defined(FEAT_PERL) \
|
||||
@ -4358,7 +4357,7 @@ default_address(exarg_T *eap)
|
||||
*
|
||||
* Return MAXLNUM when no Ex address was found.
|
||||
*/
|
||||
static linenr_T
|
||||
linenr_T
|
||||
get_address(
|
||||
exarg_T *eap UNUSED,
|
||||
char_u **ptr,
|
||||
@ -4552,7 +4551,7 @@ get_address(
|
||||
else
|
||||
curwin->w_cursor.col = 0;
|
||||
searchcmdlen = 0;
|
||||
flags = silent ? 0 : SEARCH_HIS | SEARCH_MSG;
|
||||
flags = silent ? SEARCH_KEEP : SEARCH_HIS | SEARCH_MSG;
|
||||
if (!do_search(NULL, c, c, cmd, STRLEN(cmd), 1L, flags, NULL))
|
||||
{
|
||||
curwin->w_cursor = pos;
|
||||
|
||||
@ -2057,7 +2057,7 @@ retnomove:
|
||||
for (first = TRUE; curwin->w_topline > 1; )
|
||||
{
|
||||
#ifdef FEAT_DIFF
|
||||
if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
|
||||
if (curwin->w_topfill < diff_check_fill(curwin, curwin->w_topline))
|
||||
++count;
|
||||
else
|
||||
#endif
|
||||
@ -2069,7 +2069,7 @@ retnomove:
|
||||
(void)hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
|
||||
#endif
|
||||
#ifdef FEAT_DIFF
|
||||
if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
|
||||
if (curwin->w_topfill < diff_check_fill(curwin, curwin->w_topline))
|
||||
++curwin->w_topfill;
|
||||
else
|
||||
#endif
|
||||
|
||||
@ -1783,7 +1783,7 @@ scrolldown(
|
||||
for (int todo = line_count; todo > 0; --todo)
|
||||
{
|
||||
#ifdef FEAT_DIFF
|
||||
if (curwin->w_topfill < diff_check(curwin, curwin->w_topline)
|
||||
if (curwin->w_topfill < diff_check_fill(curwin, curwin->w_topline)
|
||||
&& curwin->w_topfill < curwin->w_height - 1)
|
||||
{
|
||||
++curwin->w_topfill;
|
||||
|
||||
15
src/option.c
15
src/option.c
@ -6462,6 +6462,11 @@ unset_global_local_option(char_u *name, void *from)
|
||||
case PV_DICT:
|
||||
clear_string_option(&buf->b_p_dict);
|
||||
break;
|
||||
# ifdef FEAT_DIFF
|
||||
case PV_DIA:
|
||||
clear_string_option(&buf->b_p_dia);
|
||||
break;
|
||||
# endif
|
||||
case PV_TSR:
|
||||
clear_string_option(&buf->b_p_tsr);
|
||||
break;
|
||||
@ -6583,6 +6588,9 @@ get_varp_scope(struct vimoption *p, int scope)
|
||||
case PV_COT: return (char_u *)&(curbuf->b_p_cot);
|
||||
case PV_ISE: return (char_u *)&(curbuf->b_p_ise);
|
||||
case PV_DICT: return (char_u *)&(curbuf->b_p_dict);
|
||||
#ifdef FEAT_DIFF
|
||||
case PV_DIA: return (char_u *)&(curbuf->b_p_dia);
|
||||
#endif
|
||||
case PV_TSR: return (char_u *)&(curbuf->b_p_tsr);
|
||||
#ifdef FEAT_COMPL_FUNC
|
||||
case PV_TSRFU: return (char_u *)&(curbuf->b_p_tsrfu);
|
||||
@ -6668,6 +6676,10 @@ get_varp(struct vimoption *p)
|
||||
? (char_u *)&(curbuf->b_p_ise) : p->var;
|
||||
case PV_DICT: return *curbuf->b_p_dict != NUL
|
||||
? (char_u *)&(curbuf->b_p_dict) : p->var;
|
||||
#ifdef FEAT_DIFF
|
||||
case PV_DIA: return *curbuf->b_p_dia != NUL
|
||||
? (char_u *)&(curbuf->b_p_dia) : p->var;
|
||||
#endif
|
||||
case PV_TSR: return *curbuf->b_p_tsr != NUL
|
||||
? (char_u *)&(curbuf->b_p_tsr) : p->var;
|
||||
#ifdef FEAT_COMPL_FUNC
|
||||
@ -7499,6 +7511,9 @@ buf_copy_options(buf_T *buf, int flags)
|
||||
buf->b_p_cot = empty_option;
|
||||
buf->b_cot_flags = 0;
|
||||
buf->b_p_dict = empty_option;
|
||||
#ifdef FEAT_DIFF
|
||||
buf->b_p_dia = empty_option;
|
||||
#endif
|
||||
buf->b_p_tsr = empty_option;
|
||||
buf->b_p_ise = empty_option;
|
||||
#ifdef FEAT_COMPL_FUNC
|
||||
|
||||
@ -571,6 +571,7 @@ EXTERN char_u *p_def; // 'define'
|
||||
EXTERN char_u *p_inc;
|
||||
#endif
|
||||
#ifdef FEAT_DIFF
|
||||
EXTERN char_u *p_dia; // 'diffanchors'
|
||||
EXTERN char_u *p_dip; // 'diffopt'
|
||||
# ifdef FEAT_EVAL
|
||||
EXTERN char_u *p_dex; // 'diffexpr'
|
||||
@ -1189,6 +1190,9 @@ enum
|
||||
, BV_COT
|
||||
, BV_CPT
|
||||
, BV_DICT
|
||||
#ifdef FEAT_DIFF
|
||||
, BV_DIA
|
||||
#endif
|
||||
, BV_TSR
|
||||
#ifdef BACKSLASH_IN_FILENAME
|
||||
, BV_CSL
|
||||
|
||||
@ -54,6 +54,9 @@
|
||||
#define PV_COT OPT_BOTH(OPT_BUF(BV_COT))
|
||||
#define PV_CPT OPT_BUF(BV_CPT)
|
||||
#define PV_DICT OPT_BOTH(OPT_BUF(BV_DICT))
|
||||
#ifdef FEAT_DIFF
|
||||
# define PV_DIA OPT_BOTH(OPT_BUF(BV_DIA))
|
||||
#endif
|
||||
#define PV_TSR OPT_BOTH(OPT_BUF(BV_TSR))
|
||||
#define PV_FFU OPT_BOTH(OPT_BUF(BV_FFU))
|
||||
#define PV_CSL OPT_BUF(BV_CSL)
|
||||
@ -859,6 +862,13 @@ static struct vimoption options[] =
|
||||
(char_u *)NULL, PV_NONE, NULL, NULL,
|
||||
#endif
|
||||
{(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
|
||||
{"diffanchors", "dia", P_STRING|P_VI_DEF|P_ONECOMMA,
|
||||
#ifdef FEAT_DIFF
|
||||
(char_u *)&p_dia, PV_DIA, did_set_diffanchors, NULL,
|
||||
#else
|
||||
(char_u *)NULL, PV_NONE, NULL, NULL,
|
||||
#endif
|
||||
{(char_u *)"", (char_u *)NULL} SCTX_INIT},
|
||||
{"diffexpr", "dex", P_STRING|P_VI_DEF|P_SECURE|P_CURSWANT,
|
||||
#if defined(FEAT_DIFF) && defined(FEAT_EVAL)
|
||||
(char_u *)&p_dex, PV_NONE, did_set_optexpr, NULL,
|
||||
|
||||
@ -35,7 +35,7 @@ static char *(p_tplo_align_values[]) = {"left", "right", NULL};
|
||||
#endif
|
||||
#if defined(FEAT_DIFF)
|
||||
// Note: Keep this in sync with diffopt_changed()
|
||||
static char *(p_dip_values[]) = {"filler", "context:", "iblank", "icase", "iwhite", "iwhiteall", "iwhiteeol", "horizontal", "vertical", "closeoff", "hiddenoff", "foldcolumn:", "followwrap", "internal", "indent-heuristic", "algorithm:", "inline:", "linematch:", NULL};
|
||||
static char *(p_dip_values[]) = {"filler", "anchor", "context:", "iblank", "icase", "iwhite", "iwhiteall", "iwhiteeol", "horizontal", "vertical", "closeoff", "hiddenoff", "foldcolumn:", "followwrap", "internal", "indent-heuristic", "algorithm:", "inline:", "linematch:", NULL};
|
||||
static char *(p_dip_algorithm_values[]) = {"myers", "minimal", "patience", "histogram", NULL};
|
||||
static char *(p_dip_inline_values[]) = {"none", "simple", "char", "word", NULL};
|
||||
#endif
|
||||
@ -341,6 +341,9 @@ check_buf_options(buf_T *buf)
|
||||
check_string_option(&buf->b_p_tags);
|
||||
check_string_option(&buf->b_p_tc);
|
||||
check_string_option(&buf->b_p_dict);
|
||||
#ifdef FEAT_DIFF
|
||||
check_string_option(&buf->b_p_dia);
|
||||
#endif
|
||||
check_string_option(&buf->b_p_tsr);
|
||||
check_string_option(&buf->b_p_lw);
|
||||
check_string_option(&buf->b_p_bkc);
|
||||
@ -2047,6 +2050,18 @@ expand_set_debug(optexpand_T *args, int *numMatches, char_u ***matches)
|
||||
}
|
||||
|
||||
#if defined(FEAT_DIFF) || defined(PROTO)
|
||||
/*
|
||||
* The 'diffanchors' option is changed.
|
||||
*/
|
||||
char *
|
||||
did_set_diffanchors(optset_T *args)
|
||||
{
|
||||
if (diffanchors_changed(args->os_flags & OPT_LOCAL) == FAIL)
|
||||
return e_invalid_argument;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* The 'diffopt' option is changed.
|
||||
*/
|
||||
|
||||
579
src/po/vim.pot
579
src/po/vim.pot
File diff suppressed because it is too large
Load Diff
@ -14,9 +14,9 @@ void diff_win_options(win_T *wp, int addbuf);
|
||||
void ex_diffoff(exarg_T *eap);
|
||||
void diff_clear(tabpage_T *tp);
|
||||
int diff_check_with_linestatus(win_T *wp, linenr_T lnum, int *linestatus);
|
||||
int diff_check(win_T *wp, linenr_T lnum);
|
||||
int diff_check_fill(win_T *wp, linenr_T lnum);
|
||||
void diff_set_topline(win_T *fromwin, win_T *towin);
|
||||
int diffanchors_changed(int local);
|
||||
int diffopt_changed(void);
|
||||
int diffopt_horizontal(void);
|
||||
int diffopt_hiddenoff(void);
|
||||
|
||||
@ -16,6 +16,7 @@ int cmdmod_error(int ignore_silent);
|
||||
void apply_cmdmod(cmdmod_T *cmod);
|
||||
void undo_cmdmod(cmdmod_T *cmod);
|
||||
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
|
||||
linenr_T get_address(exarg_T *eap, char_u **ptr, cmd_addr_T addr_type, int skip, int silent, int to_other_file, int address_count);
|
||||
char_u *skip_option_env_lead(char_u *start);
|
||||
int number_method(char_u *cmd);
|
||||
char_u *find_ex_command(exarg_T *eap, int *full, int (*lookup)(char_u *, size_t, int cmd, cctx_T *), cctx_T *cctx);
|
||||
|
||||
@ -64,6 +64,7 @@ char *did_set_cursorlineopt(optset_T *args);
|
||||
int expand_set_cursorlineopt(optexpand_T *args, int *numMatches, char_u ***matches);
|
||||
char *did_set_debug(optset_T *args);
|
||||
int expand_set_debug(optexpand_T *args, int *numMatches, char_u ***matches);
|
||||
char *did_set_diffanchors(optset_T *args);
|
||||
char *did_set_diffopt(optset_T *args);
|
||||
int expand_set_diffopt(optexpand_T *args, int *numMatches, char_u ***matches);
|
||||
char *did_set_display(optset_T *args);
|
||||
|
||||
@ -3385,6 +3385,9 @@ struct file_buffer
|
||||
char_u *b_p_tc; // 'tagcase' local value
|
||||
unsigned b_tc_flags; // flags for 'tagcase'
|
||||
char_u *b_p_dict; // 'dictionary' local value
|
||||
#ifdef FEAT_DIFF
|
||||
char_u *b_p_dia; // 'diffanchors' local value
|
||||
#endif
|
||||
char_u *b_p_tsr; // 'thesaurus' local value
|
||||
#ifdef FEAT_COMPL_FUNC
|
||||
char_u *b_p_tsrfu; // 'thesaurusfunc' local value
|
||||
@ -3577,9 +3580,11 @@ struct file_buffer
|
||||
* and how many lines it occupies in that buffer. When the lines are missing
|
||||
* in the buffer the df_count[] is zero. This is all counted in
|
||||
* buffer lines.
|
||||
* There is always at least one unchanged line in between the diffs (unless
|
||||
* linematch is used). Otherwise it would have been included in the diff above
|
||||
* or below it.
|
||||
* Usually there is always at least one unchanged line in between the diffs as
|
||||
* otherwise it would have been included in the diff above or below it. When
|
||||
* linematch or diff anchors are used, this is no longer guaranteed, and we may
|
||||
* have adjacent diff blocks. In all cases they will not overlap, although it
|
||||
* is possible to have multiple 0-count diff blocks at the same line.
|
||||
* df_lnum[] + df_count[] is the lnum below the change. When in one buffer
|
||||
* lines have been inserted, in the other buffer df_lnum[] is the line below
|
||||
* the insertion and df_count[] is zero. When appending lines at the end of
|
||||
|
||||
20
src/testdir/dumps/Test_diff_anchors_00.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_00.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_01.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_01.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_02.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_02.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|1| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18
|
||||
| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_03.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_03.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2+2&#ff404010| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3+2&#ff404010| +0&#ffd7ff255@18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|2| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A+2&#ff404010|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_04.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_04.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|1+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|2+2&#ff404010| +0&#ffd7ff255@13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|A|3+2&#ff404010| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @21||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20||+1&&| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @20
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_05.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_05.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @15||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|B| @14
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0|3| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_06.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_06.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|1| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @19||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18||+1&&| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0@1| @18
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|1| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|2| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|B| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|4| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|5| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|B| @14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0|3| @18
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|2+0&#ffd7ff255| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|X+3#0000000#ffffff0|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|1|,|1| @5|T|o|p| |X|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
20
src/testdir/dumps/Test_diff_anchors_07.dump
Normal file
20
src/testdir/dumps/Test_diff_anchors_07.dump
Normal file
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|1| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0@1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0@1| +0&#ffd7ff255@18
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010| +0&#ffd7ff255@21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|1| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @21||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0@1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|1| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|2| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|2| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|3| +0&#ffd7ff255@18
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|0|3| @19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|B| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+2#0000000#ff404010|n|c|h|o|r|A|3| +0&#ffd7ff255@13
|
||||
| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|5| +0&#ffd7ff255@19||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255|0+2&#ff404010|3| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#ffd7ff255| @20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|4| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|2+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+2#0000000#ff404010|0|5| +0&#ffd7ff255@18||+1&#ffffff0| +0#0000e05#a8a8a8255@1|3+2#0000000#ff404010| +0&#ffd7ff255@20
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#5fd7ff255|n|c|h|o|r|A|2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|3+0#0000000#5fd7ff255| @20||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X+3&&|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28
|
||||
| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+3&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1
|
||||
|:+0&&> @73
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28
|
||||
| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|3|,|1| @11|B|o|t| |X+3&&|d|i|f|i|l|e|2| @10|3|,|1| @11|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|3|,|1| @11|B|o|t| |X+3&&|d|i|f|i|l|e|2| @10|3|,|1| @11|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|3|,|1| @11|B|o|t| |X+3&&|d|i|f|i|l|e|2| @10|3|,|1| @11|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|1| @27
|
||||
| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+3&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1
|
||||
|:+0&&> @73
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|1|a| @28||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|a| @28
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|3|,|1| @11|B|o|t| |X+3&&|d|i|f|i|l|e|2| @10|3|,|1| @11|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffffff0|n|c|h|o|r|2| @27||+1&&| +0#0000e05#a8a8a8255@1>a+0#0000000#ffffff0|n|c|h|o|r|2| @27
|
||||
|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @10|3|,|1| @11|B|o|t| |X+3&&|d|i|f|i|l|e|2| @10|3|,|1| @11|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X+3&&|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X+1&&|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1>a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|B|o|t| |X+1&&|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|a+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|a+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|2|b| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|1|,|1| @5|A|l@1| |X+3&&|d|i|f|i|l|e|3| @3|1|,|1| @5|A|l@1
|
||||
|:+0&&> @73
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|c+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|c+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X+3&&|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|2+2&#ff404010|d+0&#ffd7ff255| @15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|d+0#0000000#ffd7ff255|i|f@1|3+2&#ff404010|d+0&#ffd7ff255| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X+3&&|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|3+2&#ff404010| +0&#ffd7ff255@14
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X+3&&|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -0,0 +1,20 @@
|
||||
| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|1+2&#ff404010| +0&#ffd7ff255@15||+1&#ffffff0| +0#0000e05#a8a8a8255@1|a+0#0000000#ffd7ff255|n|c|h|o|r|2+2&#ff404010| +0&#ffd7ff255@14||+1&#ffffff0| +0#0000e05#a8a8a8255@1>d+0#0000000#5fd7ff255|i|f@1|3|e| @15
|
||||
|~+0#4040ff13#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|X+1#0000000&|d|i|f|i|l|e|1| @4|1|,|1| @5|A|l@1| |X|d|i|f|i|l|e|2| @3|5|,|1| @5|B|o|t| |X+3&&|d|i|f|i|l|e|3| @3|5|,|1| @5|B|o|t
|
||||
| +0&&@74
|
||||
@ -1,13 +1,13 @@
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@22||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@21||+1&&| +0#0000e05#a8a8a8255@1> +0#0000000#ffffff0@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @9||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @8||+1&&| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@1|c|o|m@1|o|n| |l|i|n|e| @8
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|<@6| |H|E|A|D| @7||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @13||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|A@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|=@6| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#ffd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12||+1&#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@5|B@2| @12
|
||||
| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@22||+1#0000000#ffffff0| +0#0000e05#a8a8a8255@1| +0#0000000#5fd7ff255@1|>@6| |b|r|a|n|c|h|1| @4||+1&#ffffff0| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@21
|
||||
|~+0&#ffffff0| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|~| @23||+1#0000000&|~+0#4040ff13&| @22||+1#0000000&|~+0#4040ff13&| @22
|
||||
|
||||
@ -17,4 +17,4 @@
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|~| @35||+1#0000000&|~+0#4040ff13&| @35
|
||||
|X+3#0000000&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1
|
||||
|"+0&&|X|d|i|f|i|l|e|2|"| |3|L|,| |1|2|B| @56
|
||||
|:+0&&| @73
|
||||
|
||||
@ -2859,7 +2859,14 @@ func Test_linematch_diff()
|
||||
call WriteDiffFiles(buf, ['// abc d?',
|
||||
\ '// d?',
|
||||
\ '// d?' ],
|
||||
\ ['!',
|
||||
\ 'abc d!',
|
||||
\ 'd!'])
|
||||
call term_sendkeys(buf, ":\<CR>") " clear cmdline
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff1', {})
|
||||
|
||||
" test that filler is always implicitly set by linematch
|
||||
call term_sendkeys(buf, ":set diffopt-=filler\<CR>")
|
||||
call term_sendkeys(buf, ":\<CR>") " clear cmdline
|
||||
call VerifyScreenDump(buf, 'Test_linematch_diff1', {})
|
||||
|
||||
@ -3072,4 +3079,440 @@ func Test_linematch_3diffs_sanity_check()
|
||||
let buf = RunVimInTerminal('-d -S Xlinematch_3diffs.vim Xfile_linematch1 Xfile_linematch2 Xfile_linematch3', {})
|
||||
call VerifyScreenDump(buf, 'Test_linematch_3diffs2', {})
|
||||
|
||||
" clean up
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
func Test_diffanchors()
|
||||
CheckScreendump
|
||||
call WriteDiffFiles3(0,
|
||||
\ ["anchorA1", "1", "2", "3",
|
||||
\ "100", "101", "102", "anchorB", "103", "104", "105"],
|
||||
\ ["100", "101", "102", "anchorB", "103", "104", "105",
|
||||
\ "anchorA2", "1", "2", "3"],
|
||||
\ ["100", "anchorB", "103",
|
||||
\ "anchorA3", "1", "2", "3"])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2 Xdifile3', {})
|
||||
|
||||
" Simple diff without any anchors
|
||||
call VerifyInternal(buf, "Test_diff_anchors_00", "")
|
||||
|
||||
" Setting diffopt+=anchor or diffanchors without the other won't do anything
|
||||
call VerifyInternal(buf, "Test_diff_anchors_00", " diffopt+=anchor")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_00", " dia=1/anchorA/")
|
||||
|
||||
" Use a single anchor by specifying a pattern. Test both internal and
|
||||
" external diff to make sure both paths work.
|
||||
call VerifyBoth(buf, "Test_diff_anchors_01", " dia=1/anchorA/ diffopt+=anchor")
|
||||
|
||||
" Use 2 anchors. They should be sorted by line number, so in file 2/3
|
||||
" anchorB is used before anchorA.
|
||||
call VerifyBoth(buf, "Test_diff_anchors_02", " dia=1/anchorA/,1/anchorB/ diffopt+=anchor")
|
||||
|
||||
" Set marks and specify addresses using marks and repeat the test
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:1/anchorA/mark a\<CR>")
|
||||
call term_sendkeys(buf, ":1/anchorB/mark b\<CR>")
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>:1/anchorA/mark a\<CR>")
|
||||
call term_sendkeys(buf, ":1/anchorB/mark b\<CR>")
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:1/anchorA/mark a\<CR>")
|
||||
call term_sendkeys(buf, ":1/anchorB/mark b\<CR>")
|
||||
|
||||
call VerifyInternal(buf, "Test_diff_anchors_01", " dia='a diffopt+=anchor")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_02", " dia='a,'b diffopt+=anchor")
|
||||
|
||||
" Update marks to point somewhere else. When we first set the mark the diff
|
||||
" won't be updated until we manually invoke :diffupdate.
|
||||
call VerifyInternal(buf, "Test_diff_anchors_01", " dia='a diffopt+=anchor")
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:1/anchorB/mark a\<CR>:")
|
||||
call term_wait(buf)
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_01", {})
|
||||
call term_sendkeys(buf, ":diffupdate\<CR>:")
|
||||
call term_wait(buf)
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_03", {})
|
||||
|
||||
" Use local diff anchors with line numbers, and repeat the same test
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:setlocal dia=8\<CR>")
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>:setlocal dia=4\<CR>")
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_01", " diffopt+=anchor")
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:setlocal dia=8,4\<CR>")
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>:setlocal dia=4,2\<CR>")
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1,8\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_02", " diffopt+=anchor")
|
||||
|
||||
" Test multiple diff anchors on the same line in file 1.
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1,1\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_04", " diffopt+=anchor")
|
||||
|
||||
" Test that if one file has fewer diff anchors than others. Vim should only
|
||||
" use the minimum in this case.
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=8\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_05", " diffopt+=anchor")
|
||||
|
||||
" $+1 should anchor everything past the last line
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=$+1\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_06", " diffopt+=anchor")
|
||||
|
||||
" Sorting of diff anchors should work with multiple anchors
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1,10,8,2\<CR>")
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:setlocal dia=1,2,3,4\<CR>")
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>:setlocal dia=4,3,2,1\<CR>")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_07", " diffopt+=anchor")
|
||||
|
||||
" Intentionally set an invalid anchor with wrong line number. Should fall
|
||||
" back to treat it as if no anchors are used at all.
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1,10,8,2,1000 | silent! diffupdate\<CR>:")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_00", {})
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
" Test that scrollbind and topline calculations work correctly, even when diff
|
||||
" anchors create adjacent diff blocks which complicates the calculations.
|
||||
func Test_diffanchors_scrollbind_topline()
|
||||
CheckScreendump
|
||||
|
||||
" Simple overlapped line anchored to be adjacent to each other
|
||||
call WriteDiffFiles(0,
|
||||
\ ["anchor1", "diff1a", "anchor2"],
|
||||
\ ["anchor1", "diff2a", "anchor2"])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2', {})
|
||||
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=2\<CR>")
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:setlocal dia=3\<CR>")
|
||||
|
||||
call VerifyInternal(buf, "Test_diff_anchors_scrollbind_topline_01", " diffopt+=anchor")
|
||||
call term_sendkeys(buf, "\<Esc>\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_02", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_03", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_04", {})
|
||||
|
||||
" Also test no-filler
|
||||
call term_sendkeys(buf, "gg")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_scrollbind_topline_05", " diffopt+=anchor diffopt-=filler")
|
||||
call term_sendkeys(buf, "\<Esc>\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_06", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_07", {})
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
func Test_diffanchors_scrollbind_topline2()
|
||||
CheckScreendump
|
||||
|
||||
" More-complicated case with 3 files and multiple overlapping diff blocks
|
||||
call WriteDiffFiles3(0,
|
||||
\ ["anchor1"],
|
||||
\ ["diff2a", "diff2b", "diff2c", "diff2d", "anchor2"],
|
||||
\ ["diff3a", "diff3c", "diff3d", "anchor3", "diff3e"])
|
||||
let buf = RunVimInTerminal('-d Xdifile1 Xdifile2 Xdifile3', {})
|
||||
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>:setlocal dia=1,1,2\<CR>")
|
||||
call term_sendkeys(buf, ":2wincmd w\<CR>:setlocal dia=3,5,6\<CR>")
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>:setlocal dia=2,4,5\<CR>")
|
||||
|
||||
call VerifyInternal(buf, "Test_diff_anchors_scrollbind_topline_08", " diffopt+=anchor")
|
||||
call term_sendkeys(buf, ":1wincmd w\<CR>")
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_09", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_10", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_11", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_12", {})
|
||||
|
||||
" Also test no-filler
|
||||
call term_sendkeys(buf, ":3wincmd w\<CR>gg")
|
||||
call VerifyInternal(buf, "Test_diff_anchors_scrollbind_topline_13", " diffopt+=anchor diffopt-=filler")
|
||||
call term_sendkeys(buf, "\<Esc>\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_14", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_15", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_16", {})
|
||||
call term_sendkeys(buf, "\<C-E>")
|
||||
call VerifyScreenDump(buf, "Test_diff_anchors_scrollbind_topline_17", {})
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
||||
" Test that setting 'diffanchors' will update the diff.
|
||||
func Test_diffanchors_option_set_update()
|
||||
set diffanchors='a diffopt=internal,filler,anchor
|
||||
|
||||
" Set up 3 tabs that share some buffers, and set up marks on each of them.
|
||||
" We want to make sure only relevant tabs are updated if buffer-local diff
|
||||
" anchors are updated, but all tabs should refresh if global diff anchors
|
||||
" are updated (see diffanchors_changed() in code).
|
||||
|
||||
" Tab 1. A buffer here will be reused.
|
||||
call setline(1, range(1, 10))
|
||||
3mark a
|
||||
4mark b
|
||||
diffthis
|
||||
new
|
||||
call setline(1, range(21, 25))
|
||||
let buf = bufnr()
|
||||
1mark a
|
||||
2mark b
|
||||
diffthis
|
||||
call assert_equal(2, diff_filler(1))
|
||||
call assert_equal(0, diff_filler(2))
|
||||
|
||||
" Tab 2. "buf" is here but intentionally not participating in diff.
|
||||
tabnew
|
||||
exec 'buf ' .. buf
|
||||
diffoff
|
||||
new
|
||||
call setline(1, range(31, 40))
|
||||
8mark a
|
||||
9mark b
|
||||
diffthis
|
||||
new
|
||||
call setline(1, range(41, 50))
|
||||
5mark a
|
||||
6mark b
|
||||
diffthis
|
||||
|
||||
call assert_equal(3, diff_filler(5))
|
||||
call assert_equal(0, diff_filler(6))
|
||||
call assert_equal(0, diff_filler(7))
|
||||
|
||||
" Update mark a location, and check that the diff has *not* updated. When
|
||||
" updating marks diff's won't automatically update.
|
||||
7mark a
|
||||
call assert_equal(3, diff_filler(5))
|
||||
call assert_equal(0, diff_filler(6))
|
||||
call assert_equal(0, diff_filler(7))
|
||||
|
||||
" Tab 3. "buf" is used here and also in a diff.
|
||||
tabnew
|
||||
call setline(1, range(51, 65))
|
||||
10mark a
|
||||
11mark b
|
||||
diffthis
|
||||
exec 'sbuffer ' .. buf
|
||||
diffthis
|
||||
|
||||
" Change local diff anchor of "buf" to mark b
|
||||
setlocal diffanchors='b
|
||||
|
||||
" Tab 1 should immediately update the diff to use mark b because the buf
|
||||
" local diff anchor has been changed in "buf".
|
||||
1tabnext
|
||||
call assert_equal(0, diff_filler(1))
|
||||
call assert_equal(1, diff_filler(2))
|
||||
|
||||
" Tab 2 should not immediately update because "buf" is not a diff buffer
|
||||
" here.
|
||||
2tabnext
|
||||
call assert_equal(3, diff_filler(5))
|
||||
call assert_equal(0, diff_filler(6))
|
||||
call assert_equal(0, diff_filler(7))
|
||||
|
||||
" Manual diff update would refresh the diff since we previously changed mark
|
||||
" a's location above.
|
||||
diffupdate
|
||||
call assert_equal(0, diff_filler(5))
|
||||
call assert_equal(0, diff_filler(6))
|
||||
call assert_equal(1, diff_filler(7))
|
||||
|
||||
" Go back to tab 1. Reset diff anchor to global value and make sure it uses
|
||||
" mark a again.
|
||||
1tabnext
|
||||
set diffanchors<
|
||||
call assert_equal(2, diff_filler(1))
|
||||
call assert_equal(0, diff_filler(2))
|
||||
|
||||
" Now, change the global diff anchor to mark b. This should affect all tabs
|
||||
" including tab 2 which should update automatically.
|
||||
set diffanchors='b
|
||||
call assert_equal(0, diff_filler(1))
|
||||
call assert_equal(2, diff_filler(2))
|
||||
|
||||
2tabnext
|
||||
call assert_equal(0, diff_filler(5))
|
||||
call assert_equal(3, diff_filler(6))
|
||||
call assert_equal(0, diff_filler(7))
|
||||
|
||||
%bw!
|
||||
set diffopt&
|
||||
set diffanchors&
|
||||
endfunc
|
||||
|
||||
" Test that using diff anchors with window/buffer-local addresses will work as
|
||||
" expected and use the relevant window/buffer instead of curbuf/curwin.
|
||||
func Test_diffanchors_buf_win_local_addresses()
|
||||
" Win 1-3 point to buffer 1. Set up different window-specific jump history
|
||||
" Win 2 is the one we activate diff mode on.
|
||||
call setline(1, range(1, 15))
|
||||
norm 2gg
|
||||
norm 3gg
|
||||
|
||||
split
|
||||
norm 4gg
|
||||
norm 5gg
|
||||
|
||||
split
|
||||
norm 11gg
|
||||
norm 12gg
|
||||
call setline(10, 'new text 1') " update the '. mark to line 10
|
||||
|
||||
" Win 4 points to buffer 2
|
||||
botright vert new
|
||||
call setline(1, range(101, 110))
|
||||
norm 8gg
|
||||
norm 9gg
|
||||
call setline(3, 'new text 2') " update the '. mark to line 3
|
||||
|
||||
2wincmd w
|
||||
diffthis
|
||||
4wincmd w
|
||||
diffthis
|
||||
|
||||
" Test buffer-local marks using '. Should be anchored to lines 10 / 3.
|
||||
set diffopt=internal,filler,anchor
|
||||
set diffanchors='.
|
||||
4wincmd w
|
||||
call assert_equal(7, diff_filler(3))
|
||||
|
||||
" Test window-local marks using '' Should be anchored to lines 4 / 8.
|
||||
" Note that windows 1 & 3 point to the buffer being diff'ed but are not used
|
||||
" for diffing themselves and therefore should not be used. Windows 2 & 4
|
||||
" should be used.
|
||||
set diffanchors=''
|
||||
2wincmd w
|
||||
call assert_equal(4, diff_filler(4))
|
||||
|
||||
" Also test "." for the current cursor position, which is also
|
||||
" window-specific. Make sure the cursor position at the longer file doesn't
|
||||
" result in the other file using out of bounds line number.
|
||||
4wincmd w
|
||||
norm G
|
||||
2wincmd w
|
||||
norm G
|
||||
set diffanchors=.
|
||||
diffupdate
|
||||
4wincmd w
|
||||
call assert_equal(5, diff_filler(10))
|
||||
|
||||
%bw!
|
||||
set diffopt&
|
||||
set diffanchors&
|
||||
endfunc
|
||||
|
||||
" Test diff anchors error handling for anchors that fail to resolve to a line.
|
||||
" These are not handled during option parsing because they depend on the
|
||||
" specifics of the buffer at diff time.
|
||||
func Test_diffanchors_invalid()
|
||||
call setline(1, range(1, 5))
|
||||
new
|
||||
call setline(1, range(11, 20))
|
||||
set diffopt=internal,filler,anchor
|
||||
windo diffthis
|
||||
1wincmd w
|
||||
|
||||
" Line numbers that are out of bounds should be an error
|
||||
set diffanchors=0
|
||||
call assert_fails('diffupdate', 'E16:')
|
||||
set diffanchors=1
|
||||
diffupdate
|
||||
set diffanchors=$
|
||||
diffupdate
|
||||
set diffanchors=$+1
|
||||
diffupdate
|
||||
set diffanchors=$+2
|
||||
call assert_fails('diffupdate', 'E16:')
|
||||
|
||||
" Test that non-existent marks in any one buffer will be detected
|
||||
set diffanchors='a
|
||||
call assert_fails('diffupdate', 'E20:')
|
||||
2mark a
|
||||
call assert_fails('diffupdate', 'E20:')
|
||||
|
||||
set diffanchors=1
|
||||
setlocal diffanchors='a
|
||||
diffupdate
|
||||
|
||||
set diffanchors<
|
||||
windo 2mark a
|
||||
set diffanchors='b
|
||||
call assert_fails('diffupdate', 'E20:')
|
||||
set diffanchors='a
|
||||
diffupdate
|
||||
|
||||
" File marks are ok to use for anchors only if it is in the same file
|
||||
1wincmd w
|
||||
3mark C
|
||||
setlocal diffanchors='C
|
||||
diffupdate
|
||||
set diffanchors='C
|
||||
call assert_fails('diffupdate', 'E20:')
|
||||
|
||||
" Buffer-local marks also can only be used in buffers that have them.
|
||||
set diffanchors=1
|
||||
exec "norm 1ggVj\<Esc>"
|
||||
setlocal diffanchors='<
|
||||
diffupdate
|
||||
set diffanchors='<
|
||||
call assert_fails('diffupdate', 'E20:')
|
||||
|
||||
" Pattern search that failed will be an error too
|
||||
let @/='orig_search_pat'
|
||||
set diffanchors=1/5/
|
||||
diffupdate
|
||||
call assert_equal('orig_search_pat', @/) " also check we don't pollute the search register
|
||||
set diffanchors=1/does_not_exist/
|
||||
call assert_fails('diffupdate', 'E1550:')
|
||||
call assert_equal('orig_search_pat', @/)
|
||||
|
||||
%bw!
|
||||
set diffopt&
|
||||
set diffanchors&
|
||||
endfunc
|
||||
|
||||
" Test diffget/diffput behaviors when using diff anchors which could create
|
||||
" adjacent diff blocks.
|
||||
func Test_diffget_diffput_diffanchors()
|
||||
set diffanchors=1/anchor/
|
||||
set diffopt=internal,filler,anchor
|
||||
|
||||
call setline(1, ['1', 'anchor1', '4'])
|
||||
diffthis
|
||||
new
|
||||
call setline(1, ['2', '3', 'anchor2', '4', '5'])
|
||||
diffthis
|
||||
wincmd w
|
||||
|
||||
" Test using no-range diffget. It should grab the closest diff block only,
|
||||
" even if there are multiple adjacent blocks.
|
||||
2
|
||||
diffget
|
||||
call assert_equal(['1', 'anchor2', '4'], getline(1, '$'))
|
||||
diffget
|
||||
call assert_equal(['2', '3', 'anchor2', '4'], getline(1, '$'))
|
||||
|
||||
" Test using a range to get/put all the adjacent diff blocks.
|
||||
1,$delete
|
||||
call setline(1, ['anchor1', '4'])
|
||||
0,1 diffget
|
||||
call assert_equal(['2', '3', 'anchor2', '4'], getline(1, '$'))
|
||||
|
||||
1,$delete
|
||||
call setline(1, ['anchor1', '4'])
|
||||
0,$+1 diffget
|
||||
call assert_equal(['2', '3', 'anchor2', '4', '5'], getline(1, '$'))
|
||||
|
||||
1,$delete
|
||||
call setline(1, ['anchor1', '4'])
|
||||
0,1 diffput
|
||||
wincmd w
|
||||
call assert_equal(['anchor1', '4', '5'], getline(1,'$'))
|
||||
|
||||
%bw!
|
||||
set diffopt&
|
||||
set diffanchors&
|
||||
|
||||
@ -290,13 +290,13 @@ endfun
|
||||
|
||||
func Test_set_completion()
|
||||
call feedkeys(":set di\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"set dictionary diff diffexpr diffopt digraph directory display', @:)
|
||||
call assert_equal('"set dictionary diff diffanchors diffexpr diffopt digraph directory display', @:)
|
||||
|
||||
call feedkeys(":setlocal di\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"setlocal dictionary diff diffexpr diffopt digraph directory display', @:)
|
||||
call assert_equal('"setlocal dictionary diff diffanchors diffexpr diffopt digraph directory display', @:)
|
||||
|
||||
call feedkeys(":setglobal di\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"setglobal dictionary diff diffexpr diffopt digraph directory display', @:)
|
||||
call assert_equal('"setglobal dictionary diff diffanchors diffexpr diffopt digraph directory display', @:)
|
||||
|
||||
" Expand boolean options. When doing :set no<Tab> Vim prefixes the option
|
||||
" names with "no".
|
||||
@ -348,7 +348,7 @@ func Test_set_completion()
|
||||
call assert_match(' ./samples/.* ./test10.in', @:)
|
||||
|
||||
call feedkeys(":set tags=./\\\\ dif\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal('"set tags=./\\ diff diffexpr diffopt', @:)
|
||||
call assert_equal('"set tags=./\\ diff diffanchors diffexpr diffopt', @:)
|
||||
|
||||
" Expand files with spaces/commas in them. Make sure we delimit correctly.
|
||||
"
|
||||
@ -733,7 +733,7 @@ func Test_set_completion_string_values()
|
||||
set diffopt=
|
||||
call assert_equal([], getcompletion('set diffopt-=', 'cmdline'))
|
||||
" Test all possible values
|
||||
call assert_equal(['filler', 'context:', 'iblank', 'icase', 'iwhite', 'iwhiteall', 'iwhiteeol', 'horizontal',
|
||||
call assert_equal(['filler', 'anchor', 'context:', 'iblank', 'icase', 'iwhite', 'iwhiteall', 'iwhiteeol', 'horizontal',
|
||||
\ 'vertical', 'closeoff', 'hiddenoff', 'foldcolumn:', 'followwrap', 'internal', 'indent-heuristic', 'algorithm:', 'inline:', 'linematch:'],
|
||||
\ getcompletion('set diffopt=', 'cmdline'))
|
||||
set diffopt&
|
||||
|
||||
@ -182,12 +182,17 @@ let test_values = {
|
||||
\ 'line,number'],
|
||||
\ ['', 'xxx', 'line,screenline']],
|
||||
\ 'debug': [['', 'msg', 'throw', 'beep'], ['xxx']],
|
||||
\ 'diffanchors': [['', "'a", '/foo/', "'a-1,'>,/foo,xxx/,'b,123",
|
||||
\ '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20',
|
||||
\ '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'],
|
||||
\ [',', '12,,34', 'xxx', '123,xxx',
|
||||
\ '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21']],
|
||||
\ 'diffopt': [['', 'filler', 'context:0', 'context:999', 'iblank',
|
||||
\ 'icase', 'iwhite', 'iwhiteall', 'horizontal', 'vertical',
|
||||
\ 'closeoff', 'hiddenoff', 'foldcolumn:0', 'foldcolumn:12',
|
||||
\ 'followwrap', 'internal', 'indent-heuristic', 'algorithm:myers',
|
||||
\ 'icase,iwhite', 'algorithm:minimal', 'algorithm:patience',
|
||||
\ 'algorithm:histogram', 'inline:none', 'inline:simple',
|
||||
\ 'anchor', 'algorithm:histogram', 'inline:none', 'inline:simple',
|
||||
\ 'inline:char', 'inline:word', 'inline:char,inline:word', 'linematch:5'],
|
||||
\ ['xxx', 'foldcolumn:', 'foldcolumn:x', 'foldcolumn:xxx',
|
||||
\ 'linematch:', 'linematch:x', 'linematch:xxx', 'algorithm:',
|
||||
|
||||
@ -719,6 +719,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1557,
|
||||
/**/
|
||||
1556,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user