Mercurial > emacs
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) |