76 lines
1.8 KiB
VimL
76 lines
1.8 KiB
VimL
|
|
exec xpt#once#init
|
||
|
|
let s:oldcpo = &cpo
|
||
|
|
set cpo-=< cpo+=B
|
||
|
|
fun! xpt#diff#Diff(a,b)
|
||
|
|
let [a,b] = [a:a,a:b]
|
||
|
|
let [astart,aend,bstart,bend] = [0,len(a),0,len(b)]
|
||
|
|
let [i,lmin] = [0,min([aend,bend])]
|
||
|
|
while i < lmin && a[i] == b[i] | let i += 1 | endwhile
|
||
|
|
let [astart,bstart] = [i,i]
|
||
|
|
let m = min([aend - astart,bend - bstart])
|
||
|
|
let i = 1
|
||
|
|
while i <= m && a[aend-i] == b[bend-i]
|
||
|
|
let i += 1
|
||
|
|
endwhile
|
||
|
|
let [aend,bend] = [aend-i+1,bend-i+1]
|
||
|
|
if type(a) == type('')
|
||
|
|
let [a,b] = [strpart(a,astart,aend-astart),strpart(b,bstart,bend-bstart)]
|
||
|
|
else
|
||
|
|
let [a,b] = [a[astart :],b[bstart :]]
|
||
|
|
if len(a) > aend - astart
|
||
|
|
call remove(a,aend-astart,-1)
|
||
|
|
endif
|
||
|
|
if len(b) > bend - bstart
|
||
|
|
call remove(b,bend-bstart,-1)
|
||
|
|
endif
|
||
|
|
endif
|
||
|
|
let [la,lb] = [len(a),len(b)]
|
||
|
|
let matrix = []
|
||
|
|
let i = 0
|
||
|
|
while i < la + 1
|
||
|
|
let s = []
|
||
|
|
let j = 0
|
||
|
|
while j < lb + 1
|
||
|
|
let s += [[0,0,0]]
|
||
|
|
let j += 1
|
||
|
|
endwhile
|
||
|
|
let matrix += [s]
|
||
|
|
let i += 1
|
||
|
|
endwhile
|
||
|
|
let [i] = [1]
|
||
|
|
while i < la + 1
|
||
|
|
let matrix[i][0] = [i-1,0,0]
|
||
|
|
let i += 1
|
||
|
|
endwhile
|
||
|
|
let [j] = [1]
|
||
|
|
while j < lb + 1
|
||
|
|
let matrix[0][j] = [0,j-1,0]
|
||
|
|
let j += 1
|
||
|
|
endwhile
|
||
|
|
let [i,j] = [0,0]
|
||
|
|
while i < la
|
||
|
|
let j = 0
|
||
|
|
while j < lb
|
||
|
|
let matrix[i+1][j+1] = a[i] == b[j] ? [i,j,matrix[i][j][2] + 1] : (matrix[i][j+1][2] > matrix[i+1][j][2] ? [i,j+1,matrix[i][j+1][2]] : [i+1,j,matrix[i+1][j][2]])
|
||
|
|
let j += 1
|
||
|
|
endwhile
|
||
|
|
let i += 1
|
||
|
|
endwhile
|
||
|
|
let lst = []
|
||
|
|
let [i,j] = [la,lb]
|
||
|
|
while i > 0 || j > 0
|
||
|
|
while (i > 0 || j > 0) && matrix[i][j][0] < i && matrix[i][j][1] < j
|
||
|
|
let [i,j] = matrix[i][j][: 1]
|
||
|
|
endwhile
|
||
|
|
let [ii,jj] = [i,j]
|
||
|
|
while (ii > 0 || jj > 0) && (matrix[ii][jj][0] == ii || matrix[ii][jj][1] == jj)
|
||
|
|
let [ii,jj] = matrix[ii][jj][: 1]
|
||
|
|
endwhile
|
||
|
|
let chg = [[astart+ii,astart+i],[bstart+jj,bstart+j]]
|
||
|
|
let lst = [chg] + lst
|
||
|
|
let [i,j] = [ii,jj]
|
||
|
|
endwhile
|
||
|
|
return lst
|
||
|
|
endfunction
|
||
|
|
let &cpo = s:oldcpo
|