comparison lisp/diff-mode.el @ 80152:f200e5de5464

(diff-file-junk-re): New const. (diff-beginning-of-file-and-junk): Use it. (diff-file-kill): Make sure we were really inside a file diff.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 19 Feb 2008 21:31:20 +0000
parents 533d83b5f687
children 3629f9a94638
comparison
equal deleted inserted replaced
80151:533d83b5f687 80152:f200e5de5464
499 ;; It's the only hunk for this file, so kill the file. 499 ;; It's the only hunk for this file, so kill the file.
500 (diff-file-kill) 500 (diff-file-kill)
501 (diff-end-of-hunk) 501 (diff-end-of-hunk)
502 (kill-region start (point))))) 502 (kill-region start (point)))))
503 503
504 (defconst diff-file-junk-re "diff \\|index ") ; "index " is output by git-diff.
505
504 (defun diff-beginning-of-file-and-junk () 506 (defun diff-beginning-of-file-and-junk ()
505 "Go to the beginning of file-related diff-info. 507 "Go to the beginning of file-related diff-info.
506 This is like `diff-beginning-of-file' except it tries to skip back over leading 508 This is like `diff-beginning-of-file' except it tries to skip back over leading
507 data such as \"Index: ...\" and such." 509 data such as \"Index: ...\" and such."
508 (let ((start (point)) 510 (let ((orig (point))
511 ;; Skip forward over what might be "leading junk" so as to get
512 ;; closer to the actual diff.
513 (_ (progn (beginning-of-line)
514 (while (looking-at diff-file-junk-re)
515 (forward-line 1))))
516 (start (point))
509 (file (condition-case err (progn (diff-beginning-of-file) (point)) 517 (file (condition-case err (progn (diff-beginning-of-file) (point))
510 (error err))) 518 (error err)))
511 ;; prevhunk is one of the limits. 519 ;; prevhunk is one of the limits.
512 (prevhunk (save-excursion (ignore-errors (diff-hunk-prev) (point)))) 520 (prevhunk (save-excursion (ignore-errors (diff-hunk-prev) (point))))
513 err) 521 err)
519 (let ((index (save-excursion 527 (let ((index (save-excursion
520 (forward-line 1) ;In case we're looking at "Index:". 528 (forward-line 1) ;In case we're looking at "Index:".
521 (re-search-backward "^Index: " prevhunk t)))) 529 (re-search-backward "^Index: " prevhunk t))))
522 (when index (setq file index)) 530 (when index (setq file index))
523 (if (<= file start) 531 (if (<= file start)
524 (goto-char file) 532 (progn
533 (goto-char file)
534 ;; Now skip backward over the leading junk we may have before the
535 ;; diff itself.
536 (while (save-excursion
537 (and (zerop (forward-line -1))
538 (looking-at diff-file-junk-re)))
539 (forward-line -1)))
525 ;; File starts *after* the starting point: we really weren't in 540 ;; File starts *after* the starting point: we really weren't in
526 ;; a file diff but elsewhere. 541 ;; a file diff but elsewhere.
527 (goto-char start) 542 (goto-char orig)
528 (signal (car err) (cdr err)))))) 543 (signal (car err) (cdr err))))))
529 544
530 (defun diff-file-kill () 545 (defun diff-file-kill ()
531 "Kill current file's hunks." 546 "Kill current file's hunks."
532 (interactive) 547 (interactive)
533 (diff-beginning-of-file-and-junk) 548 (let ((orig (point))
534 (let* ((start (point)) 549 (start (progn (diff-beginning-of-file-and-junk) (point)))
535 (inhibit-read-only t)) 550 (inhibit-read-only t))
536 (diff-end-of-file) 551 (diff-end-of-file)
537 (if (looking-at "^\n") (forward-char 1)) ;`tla' generates such diffs. 552 (if (looking-at "^\n") (forward-char 1)) ;`tla' generates such diffs.
553 (if (> orig (point)) (error "Not inside a file diff"))
538 (kill-region start (point)))) 554 (kill-region start (point))))
539 555
540 (defun diff-kill-junk () 556 (defun diff-kill-junk ()
541 "Kill spurious empty diffs." 557 "Kill spurious empty diffs."
542 (interactive) 558 (interactive)