# HG changeset patch # User Miles Bader # Date 1192847426 0 # Node ID 12589730c028aec704c50ab1ba106c04d022b6f1 # Parent 4b09bb044f3848549decd5b05e702bd5358a7a30# Parent 13362e3adf7c4b93c4fe00c0619056691b593a62 Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 901) - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-273 diff -r 4b09bb044f38 -r 12589730c028 etc/NEWS --- a/etc/NEWS Sat Oct 20 02:22:59 2007 +0000 +++ b/etc/NEWS Sat Oct 20 02:30:26 2007 +0000 @@ -166,8 +166,14 @@ * Changes in Specialized Modes and Packages in Emacs 23.1 -** diff-fine-highlight highlights char-level details of changes in a diff hunk. +** smerge-refine highlights word-level details of changes in conflict. +It's used automatically as you move through conflicts, see smerge-auto-refine. + +** diff-refine-hunk highlights word-level details of changes in a diff hunk. +It's used automatically as you move through hunks, see diff-auto-refine. + ** archive-mode has basic support to browse Rar archives. + ** talk.el has been extended for multiple tty support. ** compilation-auto-jump-to-first-error tells `compile' to jump to diff -r 4b09bb044f38 -r 12589730c028 etc/TODO --- a/etc/TODO Sat Oct 20 02:22:59 2007 +0000 +++ b/etc/TODO Sat Oct 20 02:30:26 2007 +0000 @@ -181,6 +181,8 @@ * Other features we would like: +** Allow frames(terminals) created by emacsclient to inherit their environment +from the emacsclient process. ** Remove the default toggling behavior of minor modes when called from elisp rather than interactively. This a trivial one-liner in easy-mode.el. @@ -609,6 +611,7 @@ * Other known bugs: +** `make-frame' forgets unhandled parameters, at least for X11 frames. ** The \\{...} keymap dump output does not correctly remove shadowed entries: From: "Drew Adams" diff -r 4b09bb044f38 -r 12589730c028 lisp/ChangeLog --- a/lisp/ChangeLog Sat Oct 20 02:22:59 2007 +0000 +++ b/lisp/ChangeLog Sat Oct 20 02:30:26 2007 +0000 @@ -5,6 +5,25 @@ 2007-10-20 Stefan Monnier + * diff-mode.el (diff-auto-refine): New var. + (diff-hunk): Use it. + (diff-ignore-whitespace-hunk): Rename diff-refine-ignore-spaces-hunk. + (diff-refine-change): Rename from diff-fine-change. Change it. + (diff-refine-preproc): Rename from diff-fine-highlight-preproc. + (diff-refine-hunk): Rename from diff-fine-highlight. + +2007-10-20 John Paul Wallington + + * help-fns.el (describe-variable-custom-version-info): New function + to return variable's version or package version note. + (describe-variable): Use it, display result. + +2007-10-20 Stefan Monnier + + * smerge-mode.el (smerge-auto-refine): New var. + (smerge-next, smerge-prev): Use it. + (smerge-batch-resolve): Ad-hoc trick for Arch's .rej files. + * emacs-lisp/easy-mmode.el (easy-mmode-define-navigation): Add `body' arg. Cleanup the check-narrow-maybe/re-narrow-maybe mess. diff -r 4b09bb044f38 -r 12589730c028 lisp/diff-mode.el --- a/lisp/diff-mode.el Sat Oct 20 02:22:59 2007 +0000 +++ b/lisp/diff-mode.el Sat Oct 20 02:30:26 2007 +0000 @@ -90,6 +90,9 @@ :type 'boolean :group 'diff-mode) +(defcustom diff-auto-refine t + "Automatically highlight changes in detail as the user visits hunks." + :type 'boolean) (defcustom diff-mode-hook nil "Run after setting up the `diff-mode' major mode." @@ -149,14 +152,14 @@ ("\C-c\C-a" . diff-apply-hunk) ("\C-c\C-e" . diff-ediff-patch) ("\C-c\C-n" . diff-restrict-view) - ("\C-c\C-r" . diff-reverse-direction) ("\C-c\C-s" . diff-split-hunk) ("\C-c\C-t" . diff-test-hunk) + ("\C-c\C-r" . diff-reverse-direction) ("\C-c\C-u" . diff-context->unified) ;; `d' because it duplicates the context :-( --Stef ("\C-c\C-d" . diff-unified->context) - ("\C-c\C-w" . diff-refine-ignore-spaces-hunk) - ("\C-c\C-b" . diff-fine-highlight) ;No reason for `b' :-( + ("\C-c\C-w" . diff-ignore-whitespace-hunk) + ("\C-c\C-b" . diff-refine-hunk) ;No reason for `b' :-( ("\C-c\C-f" . next-error-follow-minor-mode)) "Keymap for `diff-mode'. See also `diff-mode-shared-map'.") @@ -174,8 +177,8 @@ ;;["Fixup Headers" diff-fixup-modifs (not buffer-read-only)] "-----" ["Split hunk" diff-split-hunk (diff-splittable-p)] - ["Ignore whitespace changes" diff-refine-ignore-spaces-hunk t] - ["Highlight fine changes" diff-fine-highlight t] + ["Ignore whitespace changes" diff-ignore-whitespace-hunk t] + ["Highlight fine changes" diff-refine-hunk t] ["Kill current hunk" diff-hunk-kill t] ["Kill current file's hunks" diff-file-kill t] "-----" @@ -458,7 +461,10 @@ ;; Define diff-{hunk,file}-{prev,next} (easy-mmode-define-navigation - diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view) + diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view + (if diff-auto-refine + (condition-case-no-debug nil (diff-refine-hunk) (error nil)))) + (easy-mmode-define-navigation diff-file diff-file-header-re "file" diff-end-of-hunk) @@ -1604,8 +1610,8 @@ (goto-char (+ (car pos) (cdr src))) (add-log-current-defun)))))) -(defun diff-refine-ignore-spaces-hunk () - "Refine the current hunk by ignoring space differences." +(defun diff-ignore-whitespace-hunk () + "Re-diff the current hunk, ignoring whitespace differences." (interactive) (let* ((char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder) (point)))) @@ -1651,12 +1657,20 @@ ;;; Fine change highlighting. -(defface diff-fine-change - '((t :background "yellow")) - "Face used for char-based changes shown by `diff-fine-highlight'." +(defface diff-refine-change + '((((class color) (min-colors 88) (background light)) + :background "grey90") + (((class color) (min-colors 88) (background dark)) + :background "grey40") + (((class color) (background light)) + :background "yellow") + (((class color) (background dark)) + :background "green") + (t :weight bold)) + "Face used for char-based changes shown by `diff-refine-hunk'." :group 'diff-mode) -(defun diff-fine-highlight-preproc () +(defun diff-refine-preproc () (while (re-search-forward "^[+>]" nil t) ;; Remove spurious changes due to the fact that one side of the hunk is ;; marked with leading + or > and the other with leading - or <. @@ -1668,7 +1682,7 @@ (replace-match (cdr (assq (char-before) '((?+ . "-") (?> . "<")))))) ) -(defun diff-fine-highlight () +(defun diff-refine-hunk () "Highlight changes of hunk at point at a finer granularity." (interactive) (require 'smerge-mode) @@ -1676,7 +1690,7 @@ (diff-beginning-of-hunk 'try-harder) (let* ((style (diff-hunk-style)) ;Skips the hunk header as well. (beg (point)) - (props '((diff-mode . fine) (face diff-fine-change))) + (props '((diff-mode . fine) (face diff-refine-change))) (end (progn (diff-end-of-hunk) (point)))) (remove-overlays beg end 'diff-mode 'fine) @@ -1688,7 +1702,7 @@ end t) (smerge-refine-subst (match-beginning 0) (match-end 1) (match-end 1) (match-end 0) - props 'diff-fine-highlight-preproc))) + props 'diff-refine-preproc))) (context (let* ((middle (save-excursion (re-search-forward "^---"))) (other middle)) @@ -1700,14 +1714,14 @@ (setq other (match-end 0)) (match-beginning 0)) other - props 'diff-fine-highlight-preproc)))) + props 'diff-refine-preproc)))) (t ;; Normal diffs. (let ((beg1 (1+ (point)))) (when (re-search-forward "^---.*\n" end t) ;; It's a combined add&remove, so there's something to do. (smerge-refine-subst beg1 (match-beginning 0) (match-end 0) end - props 'diff-fine-highlight-preproc)))))))) + props 'diff-refine-preproc)))))))) ;; provide the package diff -r 4b09bb044f38 -r 12589730c028 lisp/help-fns.el --- a/lisp/help-fns.el Sat Oct 20 02:22:59 2007 +0000 +++ b/lisp/help-fns.el Sat Oct 20 02:30:26 2007 +0000 @@ -456,6 +456,28 @@ (and (or any-symbol (boundp sym)) sym))))) 0)) +(defun describe-variable-custom-version-info (variable) + (let ((custom-version (get variable 'custom-version)) + (cpv (get variable 'custom-package-version)) + (output nil)) + (if custom-version + (setq output + (format "This variable was introduced, or its default value was changed, in\nversion %s of Emacs.\n" + custom-version)) + (when cpv + (let* ((package (car-safe cpv)) + (version (car (cdr-safe cpv))) + (pkg-versions (assq package customize-package-emacs-version-alist)) + (emacsv (cdr (assoc version pkg-versions)))) + (if (and package version) + (setq output + (format (concat "This variable was introduced, or its default value was changed, in\nversion %s of the %s package" + (if emacsv + (format " that is part of Emacs %s" emacsv)) + ".\n") + version package)))))) + output)) + ;;;###autoload (defun describe-variable (variable &optional buffer frame) "Display the full documentation of VARIABLE (a symbol). @@ -646,16 +668,23 @@ (with-current-buffer standard-output (insert (or doc "Not documented as a variable.")))) ;; Make a link to customize if this variable can be customized. - (if (custom-variable-p variable) - (let ((customize-label "customize")) + (when (custom-variable-p variable) + (let ((customize-label "customize")) + (terpri) + (terpri) + (princ (concat "You can " customize-label " this variable.")) + (with-current-buffer standard-output + (save-excursion + (re-search-backward + (concat "\\(" customize-label "\\)") nil t) + (help-xref-button 1 'help-customize-variable variable)))) + ;; Note variable's version or package version + (let ((output (describe-variable-custom-version-info variable))) + (when output (terpri) (terpri) - (princ (concat "You can " customize-label " this variable.")) - (with-current-buffer standard-output - (save-excursion - (re-search-backward - (concat "\\(" customize-label "\\)") nil t) - (help-xref-button 1 'help-customize-variable variable))))) + (princ output)))) + (print-help-return-message) (save-excursion (set-buffer standard-output) diff -r 4b09bb044f38 -r 12589730c028 lisp/smerge-mode.el --- a/lisp/smerge-mode.el Sat Oct 20 02:22:59 2007 +0000 +++ b/lisp/smerge-mode.el Sat Oct 20 02:30:26 2007 +0000 @@ -79,6 +79,10 @@ :group 'smerge :type 'boolean) +(defcustom smerge-auto-refine t + "Automatically highlight changes in detail as the user visits conflicts." + :type 'boolean) + (defface smerge-mine '((((min-colors 88) (background light)) (:foreground "blue1")) @@ -252,7 +256,9 @@ ;;;; ;; Define smerge-next and smerge-prev -(easy-mmode-define-navigation smerge smerge-begin-re "conflict") +(easy-mmode-define-navigation smerge smerge-begin-re "conflict" nil nil + (if smerge-auto-refine + (condition-case nil (smerge-refine) (error nil)))) (defconst smerge-match-names ["conflict" "mine" "base" "other"]) @@ -433,6 +439,12 @@ (error "`smerge-batch-resolve' is to be used only with -batch")) (while command-line-args-left (let ((file (pop command-line-args-left))) + (if (string-match "\\.rej\\'" file) + ;; .rej files should never contain diff3 markers, on the other hand, + ;; in Arch, .rej files are sometimes used to indicate that the + ;; main file has diff3 markers. So you can pass **/*.rej and + ;; it will DTRT. + (setq file (substring file 0 (match-beginning 0)))) (message "Resolving conflicts in %s..." file) (when (file-readable-p file) (with-current-buffer (find-file-noselect file)