[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] scratch/add-vdiff 305e723 024/258: Add count to next/prev change
From: |
Justin Burkett |
Subject: |
[elpa] scratch/add-vdiff 305e723 024/258: Add count to next/prev change and simplify |
Date: |
Wed, 17 May 2017 08:13:14 -0400 (EDT) |
branch: scratch/add-vdiff
commit 305e7235a9bc533d4bd3778e5e76ea2a7f2fac08
Author: justbur <address@hidden>
Commit: justbur <address@hidden>
Add count to next/prev change and simplify
---
vdiff.el | 120 +++++++++++++++++++++++++++++++++------------------------------
1 file changed, 63 insertions(+), 57 deletions(-)
diff --git a/vdiff.el b/vdiff.el
index 831f175..8d7afbe 100644
--- a/vdiff.el
+++ b/vdiff.el
@@ -209,30 +209,36 @@ lines hidden."
(goto-char (point-min))
(forward-line (1- n)))
-(defun vdiff--overlay-at-point (&optional prior pos)
+(defun vdiff--overlay-at-pos (&optional pos)
(let ((pos (or pos (point))))
(catch 'yes
- (dolist (ovr (overlays-at
- (if prior
- (max (point-min)
- (1- pos))
- pos)))
- (when (overlay-get ovr 'vdiff--type)
+ (dolist (ovr (overlays-at pos))
+ (when (overlay-get ovr 'vdiff-type)
(throw 'yes ovr))))))
+(defun vdiff--change-at-point-p ()
+ (let ((ovr (vdiff--overlay-at-pos)))
+ (and (overlayp ovr)
+ (overlay-get ovr 'vdiff-type)
+ (not (eq (overlay-get ovr 'vdiff-type) 'fold)))))
+
(defun vdiff--overlays-in-region (beg end)
(let (ovrs)
(dolist (ovr (overlays-in beg end))
- (when (overlay-get ovr 'vdiff--type)
+ (when (overlay-get ovr 'vdiff-type)
(push ovr ovrs)))
(nreverse ovrs)))
-(defun vdiff--maybe-exit-overlay (&optional up)
- (let* ((ovr (vdiff--overlay-at-point up))
- (type (when ovr (overlay-get ovr 'vdiff--type))))
- (when (memq type '(addition change))
- (let ((range (overlay-get ovr 'vdiff--range)))
- (goto-char (if up (car range) (cdr range)))))))
+(defun vdiff--maybe-exit-overlay (&optional up no-fold)
+ (let* ((ovr (vdiff--overlay-at-pos))
+ (type (when ovr (overlay-get ovr 'vdiff-type))))
+ (when (and type
+ (or (not no-fold)
+ (not (eq type 'fold))))
+ (goto-char
+ (if up
+ (1- (overlay-start ovr))
+ (1+ (overlay-end ovr)))))))
(defmacro vdiff--with-other-window (&rest body)
`(when (and (vdiff--buffer-p)
@@ -329,8 +335,8 @@ lines hidden."
(ovr (make-overlay position (1+ position))))
(overlay-put ovr 'before-string
(vdiff--make-subtraction-string amount))
- (overlay-put ovr 'vdiff--target-range target-range)
- (overlay-put ovr 'vdiff--type 'subtraction))))
+ (overlay-put ovr 'vdiff-target-range target-range)
+ (overlay-put ovr 'vdiff-type 'subtraction))))
(defun vdiff--add-change-overlays
(buffer start-line lines target-range
@@ -344,11 +350,10 @@ lines hidden."
(overlay-put ovr 'face (if addition
'vdiff-addition-face
'vdiff-change-face))
- (overlay-put ovr 'vdiff--type (if addition
+ (overlay-put ovr 'vdiff-type (if addition
'addition
'change))
- (overlay-put ovr 'vdiff--range (cons beg end))
- (overlay-put ovr 'vdiff--target-range target-range)
+ (overlay-put ovr 'vdiff-target-range target-range)
(when subtraction-padding
(overlay-put ovr 'after-string
(vdiff--make-subtraction-string
subtraction-padding)))))))
@@ -472,10 +477,12 @@ lines hidden."
(defun vdiff--region-or-close-overlay ()
(if (region-active-p)
- (list (region-beginning) (region-end))
+ (prog1
+ (list (region-beginning) (region-end))
+ (deactivate-mark))
(list (if (or (= (line-number-at-pos) 1)
- (vdiff--overlay-at-point
- nil (line-beginning-position)))
+ (vdiff--overlay-at-pos
+ (line-beginning-position)))
(line-beginning-position)
(save-excursion
(forward-line -1)
@@ -492,13 +499,10 @@ changes under point or on the immediately preceding line."
(vdiff--region-or-close-overlay))
(let* ((ovrs (overlays-in beg end)))
(dolist (ovr ovrs)
- (cond ((memq (overlay-get ovr 'vdiff--type)
+ (cond ((memq (overlay-get ovr 'vdiff-type)
'(change addition))
(vdiff--transmit-change-overlay ovr receive))
- ((eq (overlay-get ovr 'vdiff--type) 'change-subtraction)
- (vdiff--transmit-subtraction-overlay
- (overlay-get ovr 'vdiff--change-overlay) receive))
- ((eq (overlay-get ovr 'vdiff--type) 'subtraction)
+ ((eq (overlay-get ovr 'vdiff-type) 'subtraction)
(vdiff--transmit-subtraction-overlay ovr receive))))
(vdiff-refresh)))
@@ -514,14 +518,14 @@ changes under point or on the immediately preceding line."
(cond ((not (overlayp chg-ovr))
(message "No change found"))
(receive
- (let* ((target-rng (overlay-get chg-ovr 'vdiff--target-range))
+ (let* ((target-rng (overlay-get chg-ovr 'vdiff-target-range))
(pos (vdiff--pos-at-line-beginning
(car target-rng) (vdiff--other-buffer))))
(vdiff--with-other-window
(vdiff-send-changes pos (1+ pos)))))
(t
- (let* ((addition (eq 'addition (overlay-get chg-ovr 'vdiff--type)))
- (target-rng (overlay-get chg-ovr 'vdiff--target-range))
+ (let* ((addition (eq 'addition (overlay-get chg-ovr 'vdiff-type)))
+ (target-rng (overlay-get chg-ovr 'vdiff-target-range))
(text (buffer-substring-no-properties
(overlay-start chg-ovr)
(overlay-end chg-ovr))))
@@ -541,14 +545,14 @@ changes under point or on the immediately preceding line."
(cond ((not (overlayp sub-ovr))
(message "No change found"))
(receive
- (let* ((target-rng (overlay-get sub-ovr 'vdiff--target-range))
+ (let* ((target-rng (overlay-get sub-ovr 'vdiff-target-range))
(pos (vdiff--pos-at-line-beginning
(car target-rng) (vdiff--other-buffer))))
(vdiff--with-other-window
(vdiff-send-changes pos (1+ pos)))))
(t
(let* ((target-rng
- (overlay-get sub-ovr 'vdiff--target-range)))
+ (overlay-get sub-ovr 'vdiff-target-range)))
(when target-rng
(with-current-buffer (vdiff--other-buffer)
(vdiff--move-to-line (car target-rng))
@@ -729,33 +733,35 @@ folds in the region."
;; * Movement
-(defun vdiff-next-change ()
+(defun vdiff--nth-change (&optional n)
+ (let* ((n (or n 1))
+ (reverse (< n 0))
+ pnt)
+ (save-excursion
+ (dotimes (i (abs n))
+ ;; Escape current overlay
+ (vdiff--maybe-exit-overlay reverse)
+ (setq pnt (point))
+ ;; Find next overlay
+ (while (and (not (or (eobp) (bobp)))
+ (not (vdiff--change-at-point-p)))
+ (setq pnt
+ (goto-char (if reverse
+ (previous-overlay-change pnt)
+ (next-overlay-change pnt)))))))
+ pnt))
+
+(defun vdiff-next-change (arg)
"Jump to next change in this buffer."
- (interactive)
- (vdiff--maybe-exit-overlay)
- (let ((next (next-overlay-change (point))))
- (if (= next (point-max))
- (message "No more changes")
- (goto-char next)
- (while (and (not (eobp))
- (not (vdiff--overlay-at-point)))
- (goto-char next)
- (setq next (next-overlay-change (point))))
- (vdiff-sync-and-center))))
-
-(defun vdiff-previous-change ()
+ (interactive "p")
+ (let ((count (or arg 1)))
+ (goto-char (vdiff--nth-change count))))
+
+(defun vdiff-previous-change (arg)
"Jump to previous change in this buffer."
- (interactive)
- (vdiff--maybe-exit-overlay t)
- (let ((next (previous-overlay-change (point))))
- (if (= next (point-min))
- (message "No more changes")
- (goto-char next)
- (while (and (not (bobp))
- (not (vdiff--overlay-at-point)))
- (goto-char next)
- (setq next (previous-overlay-change (point))))
- (vdiff-sync-and-center))))
+ (interactive "p")
+ (let ((count (or (- arg) -1)))
+ (goto-char (vdiff--nth-change count))))
;; * Entry points
- [elpa] scratch/add-vdiff a88d313 200/258: Sync scroll after fold toggle, (continued)
- [elpa] scratch/add-vdiff a88d313 200/258: Sync scroll after fold toggle, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 74feddf 206/258: Adjust width of subtraction string, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 9d89a66 211/258: Add melpa badge, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff b705857 006/258: Remove window-starts variable, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff aadf726 011/258: Add TODO item, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 23a8f14 013/258: One more TODO, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 3ef30aa 020/258: Update screenshot, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff dec9dc5 026/258: Small README change, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 2c113c4 029/258: Merge pull request #1 from syohex/cl-lib, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 4312bb1 034/258: Make subtraction overlays zero width, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 305e723 024/258: Add count to next/prev change and simplify,
Justin Burkett <=
- [elpa] scratch/add-vdiff 12f4a21 042/258: Add quit command, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 72d8dfc 038/258: Avoid making new folds, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff ad37c86 009/258: Factor out subtraction overlay and prefix internal vars, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 04f5436 001/258: Initial commit, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff f54616f 039/258: Don't close folds if all are open, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff f77f184 062/258: Fix alignment of folds problem caused by recent change, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff f2aaa2e 067/258: Fix goto-corresponding-line, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 9a748df 065/258: Update README, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff 9b4e829 069/258: Update requirements for vdiff-hydra, Justin Burkett, 2017/05/17
- [elpa] scratch/add-vdiff d6a399f 076/258: Annouce exit, Justin Burkett, 2017/05/17