[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] scratch/add-vdiff 13f553f 163/258: Fix fold logic for diff3
From: |
Justin Burkett |
Subject: |
[elpa] scratch/add-vdiff 13f553f 163/258: Fix fold logic for diff3 |
Date: |
Wed, 17 May 2017 08:13:43 -0400 (EDT) |
branch: scratch/add-vdiff
commit 13f553f3def89e1292d38ec1bcec32f6d78e1f1d
Author: justbur <address@hidden>
Commit: justbur <address@hidden>
Fix fold logic for diff3
---
vdiff.el | 159 +++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 94 insertions(+), 65 deletions(-)
diff --git a/vdiff.el b/vdiff.el
index e160a9d..f5d3ce2 100644
--- a/vdiff.el
+++ b/vdiff.el
@@ -471,7 +471,8 @@ because those are handled differently.")
(setq b-el nil)
(setq c-el nil))
((eobp)
- (push (list a-el b-el c-el) res)
+ (when (or a-el b-el)
+ (push (list a-el b-el c-el) res))
(throw 'final-res (nreverse res))))
(forward-line 1)))))))
@@ -833,52 +834,71 @@ of a \"word\"."
(>= (point) (overlay-start fold))
(<= (point) (overlay-end fold))))
-(defun vdiff--add-folds (a-buffer b-buffer folds)
+(defun vdiff--add-folds (a-buffer b-buffer c-buffer folds)
(let (new-folds)
(dolist (fold folds)
- (let ((a-range (vdiff--narrow-fold-range (car fold)))
- (b-range (vdiff--narrow-fold-range (cdr fold))))
- (cond ((assoc a-range vdiff--folds)
- ;; Restore any overlays on same range
- (let* ((a-fold (cadr (assoc a-range vdiff--folds)))
- (b-fold (cl-caddr (assoc a-range vdiff--folds)))
- (a-beg (vdiff--pos-at-line-beginning
- (car a-range) a-buffer))
- (a-end (vdiff--pos-at-line-beginning
- (cdr a-range) a-buffer))
- (b-beg (vdiff--pos-at-line-beginning
- (car b-range) b-buffer))
- (b-end (vdiff--pos-at-line-beginning
- (cdr b-range) b-buffer)))
- (move-overlay a-fold a-beg a-end a-buffer)
- (move-overlay b-fold b-beg b-end b-buffer)
- (push (list a-range a-fold b-fold) new-folds)))
- ((> (1+ (- (cdr a-range) (car a-range))) vdiff-min-fold-size)
- ;; Ranges include padding
- (let ((a-fold (vdiff--make-fold a-buffer a-range))
- (b-fold (vdiff--make-fold b-buffer b-range)))
- (dolist (fold (list a-fold b-fold))
- (cond ((or (vdiff--point-in-fold-p a-fold)
- (vdiff--point-in-fold-p b-fold)
- vdiff--all-folds-open)
- (vdiff--set-open-fold-props fold))
- (t
- (vdiff--set-closed-fold-props fold))))
- (overlay-put a-fold 'vdiff-other-fold b-fold)
- (overlay-put b-fold 'vdiff-other-fold a-fold)
- (push (list a-range a-fold b-fold) new-folds))))))
+ (let ((a-range (vdiff--narrow-fold-range (nth 0 fold)))
+ (b-range (vdiff--narrow-fold-range (nth 1 fold)))
+ (c-range (when c-buffer
+ (vdiff--narrow-fold-range (nth 2 fold)))))
+ (cond
+ ;; ((assoc a-range vdiff--folds)
+ ;; ;; Restore any overlays on same range
+ ;; (let* ((a-fold (cadr (assoc a-range vdiff--folds)))
+ ;; (b-fold (cl-caddr (assoc a-range vdiff--folds)))
+ ;; (a-beg (vdiff--pos-at-line-beginning
+ ;; (car a-range) a-buffer))
+ ;; (a-end (vdiff--pos-at-line-beginning
+ ;; (cdr a-range) a-buffer))
+ ;; (b-beg (vdiff--pos-at-line-beginning
+ ;; (car b-range) b-buffer))
+ ;; (b-end (vdiff--pos-at-line-beginning
+ ;; (cdr b-range) b-buffer)))
+ ;; (move-overlay a-fold a-beg a-end a-buffer)
+ ;; (move-overlay b-fold b-beg b-end b-buffer)
+ ;; (push (list a-range a-fold b-fold) new-folds)))
+ ((> (1+ (- (cdr a-range) (car a-range))) vdiff-min-fold-size)
+ ;; Ranges include padding
+ (let ((a-fold (vdiff--make-fold a-buffer a-range))
+ (b-fold (vdiff--make-fold b-buffer b-range))
+ (c-fold (when c-buffer
+ (vdiff--make-fold c-buffer c-range))))
+ (dolist (fold (list a-fold b-fold c-fold))
+ (when fold
+ (cond ((or (vdiff--point-in-fold-p a-fold)
+ (vdiff--point-in-fold-p b-fold)
+ (and c-fold
+ (vdiff--point-in-fold-p c-fold))
+ vdiff--all-folds-open)
+ (vdiff--set-open-fold-props fold))
+ (t
+ (vdiff--set-closed-fold-props fold)))))
+ (overlay-put a-fold 'vdiff-other-folds
+ (if c-fold
+ (list b-fold c-fold)
+ (list b-fold)))
+ (overlay-put b-fold 'vdiff-other-folds
+ (if c-fold
+ (list a-fold c-fold)
+ (list a-fold)))
+ (when c-fold
+ (overlay-put c-fold 'vdiff-other-folds (list a-fold b-fold)))
+ (push (list a-range a-fold b-fold c-fold) new-folds))))))
(setq vdiff--folds new-folds)))
(defun vdiff--remove-fold-overlays (_)
(setq vdiff--folds nil))
(defun vdiff--add-diff-overlay (this-len other-len-1 other-len-2)
- (cond ((null other-len-1)
- (vdiff--add-hunk-overlay this-len t))
- ((null this-len)
- (vdiff--add-subtraction-overlay other-len-1))
- (t
- (vdiff--add-hunk-overlay this-len nil (- other-len-1 this-len)))))
+ (let ((max-other-len (max (if other-len-1 other-len-1 0)
+ (if other-len-2 other-len-2 0))))
+ (cond ((and (null other-len-1) (null other-len-2))
+ (vdiff--add-hunk-overlay this-len t))
+ ((null this-len)
+ (vdiff--add-subtraction-overlay other-len-1))
+ (t
+ (vdiff--add-hunk-overlay this-len nil
+ (- max-other-len this-len))))))
(defun vdiff--refresh-overlays ()
"Delete and recreate overlays in both buffers."
@@ -918,13 +938,22 @@ of a \"word\"."
(b-post (if b-end (1+ b-end) b-beg))
(b-insert (null b-end))
(b-len (when b-end (1+ (- b-end b-beg))))
- c-len)
-
- (push (cons (cons a-last-post (1- a-beg))
- (cons b-last-post (1- b-beg)))
+ c-beg c-end c-post c-len)
+ (when c-buffer
+ (setq c-beg (car c-range))
+ (setq c-end (cdr c-range))
+ (setq c-post (if c-end (1+ c-end) c-beg))
+ (setq c-len (when c-end (1+ (- c-end c-beg)))))
+
+ (push (list (cons a-last-post (1- a-beg))
+ (cons b-last-post (1- b-beg))
+ (when c-beg
+ (cons c-last-post (1- c-beg))))
folds)
(setq a-last-post a-post)
(setq b-last-post b-post)
+ (when c-buffer
+ (setq c-last-post c-post))
(let (ovr-a ovr-b ovr-c)
(with-current-buffer a-buffer
@@ -935,33 +964,33 @@ of a \"word\"."
(forward-line (- b-beg b-line))
(setq b-line b-beg)
(setq ovr-b (vdiff--add-diff-overlay b-len a-len c-len)))
- (when vdiff-3way-mode
- (let* ((c-beg (car c-range))
- (c-end (cdr c-range))
- (c-post (if c-end (1+ c-end) c-beg))
- (c-len (when c-end (1+ (- c-end c-beg)))))
- (with-current-buffer c-buffer
- (forward-line (- c-beg c-line))
- (setq c-line c-beg)
- (setq ovr-c (vdiff--add-diff-overlay c-len a-len b-len)))))
- (let ((ovr-group (if vdiff-3way-mode
+ (when c-buffer
+ (with-current-buffer c-buffer
+ (forward-line (- c-beg c-line))
+ (setq c-line c-beg)
+ (setq ovr-c (vdiff--add-diff-overlay c-len a-len b-len))))
+ (let ((ovr-group (if c-buffer
(list ovr-a ovr-b ovr-c)
(list ovr-a ovr-b))))
(overlay-put ovr-a 'vdiff-a t)
(overlay-put ovr-a 'vdiff-hunk-overlays ovr-group)
(overlay-put ovr-b 'vdiff-b t)
(overlay-put ovr-b 'vdiff-hunk-overlays ovr-group)
- (when vdiff-3way-mode
+ (when c-buffer
(overlay-put ovr-c 'vdiff-c t)
(overlay-put ovr-c 'vdiff-hunk-overlays ovr-group))))))
- (push (cons (cons a-last-post
+ (push (list (cons a-last-post
(with-current-buffer a-buffer
(line-number-at-pos (point-max))))
(cons b-last-post
(with-current-buffer b-buffer
- (line-number-at-pos (point-max)))))
+ (line-number-at-pos (point-max))))
+ (when c-buffer
+ (cons c-last-post
+ (with-current-buffer c-buffer
+ (line-number-at-pos (point-max))))))
folds))
- (vdiff--add-folds a-buffer b-buffer folds)))
+ (vdiff--add-folds a-buffer b-buffer c-buffer folds)))
;; * Send/Receive changes
@@ -1324,8 +1353,8 @@ in the region."
(interactive (vdiff--region-or-close-overlay))
(dolist (ovr (overlays-in beg end))
(when (eq (overlay-get ovr 'vdiff-type) 'fold)
- (let ((other-fold (overlay-get ovr 'vdiff-other-fold)))
- (vdiff--set-open-fold-props ovr)
+ (vdiff--set-open-fold-props ovr)
+ (dolist (other-fold (overlay-get ovr 'vdiff-other-folds))
(vdiff--set-open-fold-props other-fold)))))
(defun vdiff-close-fold (beg end)
@@ -1336,10 +1365,10 @@ folds in the region."
(interactive (vdiff--region-or-close-overlay))
(dolist (ovr (overlays-in beg end))
(when (eq (overlay-get ovr 'vdiff-type) 'fold)
- (let ((other-fold (overlay-get ovr 'vdiff-other-fold)))
- (setq vdiff--all-folds-open nil)
- (goto-char (overlay-start ovr))
- (vdiff--set-closed-fold-props ovr)
+ (setq vdiff--all-folds-open nil)
+ (goto-char (overlay-start ovr))
+ (vdiff--set-closed-fold-props ovr)
+ (dolist (other-fold (overlay-get ovr 'vdiff-other-folds))
(vdiff--set-closed-fold-props other-fold)))))
(defun vdiff-open-all-folds ()
@@ -1364,8 +1393,8 @@ folds in the region."
(not (vdiff--point-in-fold-p ovr)))
(setq vdiff--all-folds-open nil)
(vdiff--set-closed-fold-props ovr)
- (vdiff--set-closed-fold-props
- (overlay-get ovr 'vdiff-other-fold)))))
+ (dolist (other-fold (overlay-get ovr 'vdiff-other-folds))
+ (vdiff--set-closed-fold-props other-fold)))))
;; * Movement
- [elpa] scratch/add-vdiff 5f2c72c 105/258: Change alignment algorithm, (continued)
- [elpa] scratch/add-vdiff 5f2c72c 105/258: Change alignment algorithm, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff f481a82 112/258: Add refresh timer delay, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 28d28b7 116/258: Add restore windows command, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 905be9c 122/258: Map remove refinements command, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 717d5b6 121/258: Allow failed line translation, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff b267885 137/258: Merge branch 'gvol-master', Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 8daa391 133/258: Add case and whitespace toggles, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 95a1230 154/258: Fix vscroll bug, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff e556705 151/258: Simplify scroll function, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff f36b6b2 162/258: Fix line-translation error, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 13f553f 163/258: Fix fold logic for diff3,
Justin Burkett <=
- [elpa] scratch/add-vdiff 88e7f1c 178/258: Remove min-window-width, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 679617c 199/258: Force update of window-start on manual scroll-function, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff dcf811e 188/258: Add new on-quit options, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff c82f2b5 090/258: Add docs on refinements, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 3fcf4b9 101/258: Fix sign problem in adding hunk overlays, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 9346e46 106/258: Simplify method for setting vscroll, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff c46b76b 111/258: Set window point on scroll, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff fd8c973 109/258: Remove post-command-hook, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 25a7516 128/258: Only run scroll-function once per command, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 25ec344 134/258: Require diff-mode so that diff-mode faces are available, Justin Burkett, 2017/05/17