Commit fd691799 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

(diff-beginning-of-file-and-junk): New function.

(diff-file-kill): Use it.
(diff-beginning-of-hunk): Add arg `try-harder' using it.
(diff-restrict-view, diff-find-source-location, diff-refine-hunk):
Use it so they find the hunk even when we're in the file header.
parent 53cc90ab
2007-07-22 Stefan Monnier <monnier@iro.umontreal.ca>
* diff-mode.el (diff-beginning-of-file-and-junk): New function.
(diff-file-kill): Use it.
(diff-beginning-of-hunk): Add arg `try-harder' using it.
(diff-restrict-view, diff-find-source-location, diff-refine-hunk):
Use it so they find the hunk even when we're in the file header.
2007-07-22 Dan Nicolaescu <dann@ics.uci.edu> 2007-07-22 Dan Nicolaescu <dann@ics.uci.edu>
* vc-git.el (vc-git-revision-granularity,vc-git-root), * vc-git.el (vc-git-revision-granularity,vc-git-root),
...@@ -28,7 +36,7 @@ ...@@ -28,7 +36,7 @@
2007-07-22 Stefan Monnier <monnier@iro.umontreal.ca> 2007-07-22 Stefan Monnier <monnier@iro.umontreal.ca>
* textmodes/tex-mode.el (tex-font-script-display): Change default to 0.2. * textmodes/tex-mode.el (tex-font-script-display): Change default.
2007-07-22 Dan Nicolaescu <dann@ics.uci.edu> 2007-07-22 Dan Nicolaescu <dann@ics.uci.edu>
......
...@@ -390,13 +390,20 @@ when editing big diffs)." ...@@ -390,13 +390,20 @@ when editing big diffs)."
;; The return value is used by easy-mmode-define-navigation. ;; The return value is used by easy-mmode-define-navigation.
(goto-char (or end (point-max))))) (goto-char (or end (point-max)))))
(defun diff-beginning-of-hunk () (defun diff-beginning-of-hunk (&optional try-harder)
"Move back to beginning of hunk.
If TRY-HARDER is non-nil, try to cater to the case where we're not in a hunk
but in the file header instead, in which case move forward to the first hunk."
(beginning-of-line) (beginning-of-line)
(unless (looking-at diff-hunk-header-re) (unless (looking-at diff-hunk-header-re)
(forward-line 1) (forward-line 1)
(condition-case () (condition-case ()
(re-search-backward diff-hunk-header-re) (re-search-backward diff-hunk-header-re)
(error (error "Can't find the beginning of the hunk"))))) (error
(if (not try-harder)
(error "Can't find the beginning of the hunk")
(diff-beginning-of-file-and-junk)
(diff-hunk-next))))))
(defun diff-beginning-of-file () (defun diff-beginning-of-file ()
(beginning-of-line) (beginning-of-line)
...@@ -425,7 +432,7 @@ when editing big diffs)." ...@@ -425,7 +432,7 @@ when editing big diffs)."
If the prefix ARG is given, restrict the view to the current file instead." If the prefix ARG is given, restrict the view to the current file instead."
(interactive "P") (interactive "P")
(save-excursion (save-excursion
(if arg (diff-beginning-of-file) (diff-beginning-of-hunk)) (if arg (diff-beginning-of-file) (diff-beginning-of-hunk 'try-harder))
(narrow-to-region (point) (narrow-to-region (point)
(progn (if arg (diff-end-of-file) (diff-end-of-hunk)) (progn (if arg (diff-end-of-file) (diff-end-of-hunk))
(point))) (point)))
...@@ -453,18 +460,37 @@ If the prefix ARG is given, restrict the view to the current file instead." ...@@ -453,18 +460,37 @@ If the prefix ARG is given, restrict the view to the current file instead."
(diff-end-of-hunk) (diff-end-of-hunk)
(kill-region start (point))))) (kill-region start (point)))))
(defun diff-beginning-of-file-and-junk ()
"Go to the beginning of file-related diff-info.
This is like `diff-beginning-of-file' except it tries to skip back over leading
data such as \"Index: ...\" and such."
(let ((start (point))
(file (condition-case err (progn (diff-beginning-of-file) (point))
(error err)))
;; prevhunk is one of the limits.
(prevhunk (save-excursion (ignore-errors (diff-hunk-prev) (point))))
err)
(when (consp file)
;; Presumably, we started before the file header, in the leading junk.
(setq err file)
(diff-file-next)
(setq file (point)))
(let ((index (save-excursion
(re-search-backward "^Index: " prevhunk t))))
(when index (setq file index))
(if (<= file start)
(goto-char file)
;; File starts *after* the starting point: we really weren't in
;; a file diff but elsewhere.
(goto-char start)
(signal (car err) (cdr err))))))
(defun diff-file-kill () (defun diff-file-kill ()
"Kill current file's hunks." "Kill current file's hunks."
(interactive) (interactive)
(diff-beginning-of-file) (diff-beginning-of-file-and-junk)
(let* ((start (point)) (let* ((start (point))
(prevhunk (save-excursion
(ignore-errors
(diff-hunk-prev) (point))))
(index (save-excursion
(re-search-backward "^Index: " prevhunk t)))
(inhibit-read-only t)) (inhibit-read-only t))
(when index (setq start index))
(diff-end-of-file) (diff-end-of-file)
(if (looking-at "^\n") (forward-char 1)) ;`tla' generates such diffs. (if (looking-at "^\n") (forward-char 1)) ;`tla' generates such diffs.
(kill-region start (point)))) (kill-region start (point))))
...@@ -1289,7 +1315,8 @@ SRC and DST are the two variants of text as returned by `diff-hunk-text'. ...@@ -1289,7 +1315,8 @@ SRC and DST are the two variants of text as returned by `diff-hunk-text'.
SWITCHED is non-nil if the patch is already applied." SWITCHED is non-nil if the patch is already applied."
(save-excursion (save-excursion
(let* ((other (diff-xor other-file diff-jump-to-old-file)) (let* ((other (diff-xor other-file diff-jump-to-old-file))
(char-offset (- (point) (progn (diff-beginning-of-hunk) (point)))) (char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder)
(point))))
;; Check that the hunk is well-formed. Otherwise diff-mode and ;; Check that the hunk is well-formed. Otherwise diff-mode and
;; the user may disagree on what constitutes the hunk ;; the user may disagree on what constitutes the hunk
;; (e.g. because an empty line truncates the hunk mid-course), ;; (e.g. because an empty line truncates the hunk mid-course),
...@@ -1464,7 +1491,8 @@ For use in `add-log-current-defun-function'." ...@@ -1464,7 +1491,8 @@ For use in `add-log-current-defun-function'."
(defun diff-refine-hunk () (defun diff-refine-hunk ()
"Refine the current hunk by ignoring space differences." "Refine the current hunk by ignoring space differences."
(interactive) (interactive)
(let* ((char-offset (- (point) (progn (diff-beginning-of-hunk) (point)))) (let* ((char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder)
(point))))
(opts (case (char-after) (?@ "-bu") (?* "-bc") (t "-b"))) (opts (case (char-after) (?@ "-bu") (?* "-bc") (t "-b")))
(line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)") (line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)")
(error "Can't find line number")) (error "Can't find line number"))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment