Add arch taglines
[bpt/emacs.git] / lisp / ediff-help.el
CommitLineData
f49e1445
MK
1;;; ediff-help.el --- Code related to the contents of Ediff help buffers
2
50a07e18 3;; Copyright (C) 1996, 97, 98, 99, 2000, 01, 02 Free Software Foundation, Inc.
f49e1445 4
50a07e18 5;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
f49e1445
MK
6
7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software; you can redistribute it and/or modify
10;; it under the terms of the GNU General Public License as published by
11;; the Free Software Foundation; either version 2, or (at your option)
12;; any later version.
13
14;; GNU Emacs is distributed in the hope that it will be useful,
15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17;; GNU General Public License for more details.
18
19;; You should have received a copy of the GNU General Public License
20;; along with GNU Emacs; see the file COPYING. If not, write to the
21;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22;; Boston, MA 02111-1307, USA.
23
3afbc435
PJ
24;;; Commentary:
25
f49e1445 26;;; Code:
71296446 27
ddc90f39 28(provide 'ediff-help)
f49e1445
MK
29
30;; Compiler pacifier start
31(defvar ediff-multiframe)
ddc90f39
MK
32
33(eval-when-compile
34 (let ((load-path (cons (expand-file-name ".") load-path)))
35 (or (featurep 'ediff-init)
36 (load "ediff-init.el" nil nil 'nosuffix))
37 ))
f49e1445
MK
38;; end pacifier
39
ddc90f39
MK
40(require 'ediff-init)
41
f49e1445
MK
42;; Help messages
43
44(defconst ediff-long-help-message-head
45 " Move around | Toggle features | Manipulate
46=====================|===========================|============================="
47 "The head of the full help message.")
48(defconst ediff-long-help-message-tail
49 "=====================|===========================|=============================
71296446
JB
50 R -show registry | = -compare regions | M -show session group
51 D -diff output | E -browse Ediff manual| G -send bug report
52 i -status info | ? -help off | z/q -suspend/quit
f49e1445
MK
53-------------------------------------------------------------------------------
54For help on a specific command: Click Button 2 over it; or
55 Put the cursor over it and type RET."
56 "The tail of the full-help message.")
57
58(defconst ediff-long-help-message-compare3
59 "
60p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y
61n,SPC -next diff | h -hilighting | rx -restore buf X's old diff
71296446
JB
62 j -jump to diff | @ -auto-refinement | * -refine current region
63 gx -goto X's point| | ! -update diff regions
f49e1445 64 C-l -recenter | ## -ignore whitespace |
71296446
JB
65 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
66 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
f49e1445
MK
67 ~ -rotate buffers| m -wide display |
68"
69 "Help message usually used for 3-way comparison.
3af0304a 70Normally, not a user option. See `ediff-help-message' for details.")
71296446 71
f49e1445
MK
72(defconst ediff-long-help-message-compare2
73 "
74p,DEL -previous diff | | -vert/horiz split |a/b -copy A/B's region to B/A
75n,SPC -next diff | h -hilighting | rx -restore buf X's old diff
71296446
JB
76 j -jump to diff | @ -auto-refinement | * -refine current region
77 gx -goto X's point| | ! -update diff regions
f49e1445 78 C-l -recenter | ## -ignore whitespace |
71296446
JB
79 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
80 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
81 ~ -swap variants | m -wide display |
f49e1445
MK
82"
83 "Help message usually used for 2-way comparison.
3af0304a 84Normally, not a user option. See `ediff-help-message' for details.")
71296446 85
f49e1445
MK
86(defconst ediff-long-help-message-narrow2
87 "
88p,DEL -previous diff | | -vert/horiz split |a/b -copy A/B's region to B/A
89n,SPC -next diff | h -hilighting | rx -restore buf X's old diff
71296446
JB
90 j -jump to diff | @ -auto-refinement | * -refine current region
91 gx -goto X's point| % -narrow/widen buffs | ! -update diff regions
f49e1445 92 C-l -recenter | ## -ignore whitespace |
71296446
JB
93 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
94 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
95 ~ -swap variants | m -wide display |
f49e1445
MK
96"
97 "Help message when comparing windows or regions line-by-line.
3af0304a 98Normally, not a user option. See `ediff-help-message' for details.")
71296446 99
f49e1445
MK
100(defconst ediff-long-help-message-word-mode
101 "
102p,DEL -previous diff | | -vert/horiz split | xy -copy buf X's region to Y
103n,SPC -next diff | h -hilighting | rx -restore buf X's old diff
71296446
JB
104 j -jump to diff | |
105 gx -goto X's point| % -narrow/widen buffs | ! -recompute diffs
f49e1445 106 C-l -recenter | |
71296446
JB
107 v/V -scroll up/dn | #f/#h -focus/hide regions | wx -save buf X
108 </> -scroll lt/rt | X -read-only in buf X | wd -save diff output
109 ~ -swap variants | m -wide display |
f49e1445
MK
110"
111 "Help message when comparing windows or regions word-by-word.
3af0304a 112Normally, not a user option. See `ediff-help-message' for details.")
71296446 113
f49e1445
MK
114(defconst ediff-long-help-message-merge
115 "
116p,DEL -previous diff | | -vert/horiz split | x -copy buf X's region to C
117n,SPC -next diff | h -hilighting | r -restore buf C's old diff
71296446
JB
118 j -jump to diff | @ -auto-refinement | * -refine current region
119 gx -goto X's point| ## -ignore whitespace | ! -update diff regions
120 C-l -recenter | #f/#h -focus/hide regions | + -combine diff regions
121 v/V -scroll up/dn | X -read-only in buf X | wx -save buf X
122 </> -scroll lt/rt | m -wide display | wd -save diff output
123 ~ -swap variants | s -shrink window C | / -show ancestor buff
124 | $$ -show clashes only | & -merge w/new default
3af0304a 125 | $* -skip changed regions |
f49e1445 126"
3af0304a
MK
127 "Help message for merge sessions.
128Normally, not a user option. See `ediff-help-message' for details.")
f49e1445
MK
129
130;; The actual long help message.
131(ediff-defvar-local ediff-long-help-message ""
3af0304a 132 "Normally, not a user option. See `ediff-help-message' for details.")
71296446 133
f49e1445 134(defconst ediff-brief-message-string
3af0304a 135 " ? -quick help "
f49e1445
MK
136 "Contents of the brief help message.")
137;; The actual brief help message
138(ediff-defvar-local ediff-brief-help-message ""
3af0304a 139 "Normally, not a user option. See `ediff-help-message' for details.")
71296446 140
f49e1445
MK
141(ediff-defvar-local ediff-brief-help-message-function nil
142 "The brief help message that the user can customize.
143If the user sets this to a parameter-less function, Ediff will use it to
3af0304a 144produce the brief help message. This function must return a string.")
f49e1445
MK
145(ediff-defvar-local ediff-long-help-message-function nil
146 "The long help message that the user can customize.
147See `ediff-brief-help-message-function' for more.")
148
7d027816
MK
149(defcustom ediff-use-long-help-message nil
150 "*If t, Ediff displays a long help message. Short help message otherwise."
151 :type 'boolean
152 :group 'ediff-window)
f49e1445
MK
153
154;; The actual help message.
155(ediff-defvar-local ediff-help-message ""
156 "The actual help message.
3af0304a 157Normally, the user shouldn't touch this. However, if you want Ediff to
f49e1445
MK
158start up with different help messages for different jobs, you can change
159the value of this variable and the variables `ediff-help-message-*' in
71296446 160`ediff-startup-hook'.")
f49e1445
MK
161
162
163;; the keymap that defines clicks over the quick help regions
164(defvar ediff-help-region-map (make-sparse-keymap))
165
166(define-key
167 ediff-help-region-map
168 (if ediff-emacs-p [mouse-2] [button2])
169 'ediff-help-for-quick-help)
170
171;; runs in the control buffer
172(defun ediff-set-help-overlays ()
173 (goto-char (point-min))
174 (let (overl beg end cmd)
175 (while (re-search-forward " *\\([^ \t\n|]+\\||\\) +-[^|\n]+" nil 'noerror)
176 (setq beg (match-beginning 0)
177 end (match-end 0)
178 cmd (buffer-substring (match-beginning 1) (match-end 1)))
179 (setq overl (ediff-make-overlay beg end))
180 (if ediff-emacs-p
181 (ediff-overlay-put overl 'mouse-face 'highlight)
182 (ediff-overlay-put overl 'highlight t))
183 (ediff-overlay-put overl 'ediff-help-info cmd))))
184
185
186(defun ediff-help-for-quick-help ()
187 "Explain Ediff commands in more detail."
188 (interactive)
189 (ediff-barf-if-not-control-buffer)
ddc90f39 190 (let ((pos (ediff-event-point last-command-event))
f49e1445
MK
191 overl cmd)
192
50a07e18
MK
193 (ediff-cond-compile-for-xemacs-or-emacs
194 ;; xemacs
195 (setq overl (extent-at pos (current-buffer) 'ediff-help-info)
196 cmd (ediff-overlay-get overl 'ediff-help-info))
197 ;; emacs
198 (setq cmd (car (mapcar (lambda (elt)
199 (overlay-get elt 'ediff-help-info))
200 (overlays-at pos))))
201 )
71296446 202
f49e1445 203 (if (not (stringp cmd))
3af0304a 204 (error "Hmm... I don't see an Ediff command around here..."))
71296446 205
f49e1445 206 (ediff-documentation "Quick Help Commands")
71296446 207
f49e1445
MK
208 (let (case-fold-search)
209 (cond ((string= cmd "?") (re-search-forward "^`\\?'"))
210 ((string= cmd "G") (re-search-forward "^`G'"))
211 ((string= cmd "E") (re-search-forward "^`E'"))
212 ((string= cmd "wd") (re-search-forward "^`wd'"))
213 ((string= cmd "wx") (re-search-forward "^`wa'"))
214 ((string= cmd "a/b") (re-search-forward "^`a'"))
215 ((string= cmd "x") (re-search-forward "^`a'"))
216 ((string= cmd "xy") (re-search-forward "^`ab'"))
217 ((string= cmd "p,DEL") (re-search-forward "^`p'"))
218 ((string= cmd "n,SPC") (re-search-forward "^`n'"))
219 ((string= cmd "j") (re-search-forward "^`j'"))
220 ((string= cmd "gx") (re-search-forward "^`ga'"))
221 ((string= cmd "!") (re-search-forward "^`!'"))
222 ((string= cmd "*") (re-search-forward "^`\\*'"))
223 ((string= cmd "m") (re-search-forward "^`m'"))
224 ((string= cmd "|") (re-search-forward "^`|'"))
225 ((string= cmd "@") (re-search-forward "^`@'"))
226 ((string= cmd "h") (re-search-forward "^`h'"))
227 ((string= cmd "r") (re-search-forward "^`r'"))
228 ((string= cmd "rx") (re-search-forward "^`ra'"))
229 ((string= cmd "##") (re-search-forward "^`##'"))
230 ((string= cmd "#f/#h") (re-search-forward "^`#f'"))
231 ((string= cmd "X") (re-search-forward "^`A'"))
232 ((string= cmd "v/V") (re-search-forward "^`v'"))
233 ((string= cmd "</>") (re-search-forward "^`<'"))
234 ((string= cmd "~") (re-search-forward "^`~'"))
235 ((string= cmd "i") (re-search-forward "^`i'"))
236 ((string= cmd "D") (re-search-forward "^`D'"))
237 ((string= cmd "R") (re-search-forward "^`R'"))
238 ((string= cmd "M") (re-search-forward "^`M'"))
239 ((string= cmd "z/q") (re-search-forward "^`z'"))
240 ((string= cmd "%") (re-search-forward "^`%'"))
241 ((string= cmd "C-l") (re-search-forward "^`C-l'"))
3af0304a
MK
242 ((string= cmd "$$") (re-search-forward "^`\\$\\$'"))
243 ((string= cmd "$*") (re-search-forward "^`\\$\\*'"))
f49e1445
MK
244 ((string= cmd "/") (re-search-forward "^`/'"))
245 ((string= cmd "&") (re-search-forward "^`&'"))
246 ((string= cmd "s") (re-search-forward "^`s'"))
247 ((string= cmd "+") (re-search-forward "^`\\+'"))
248 ((string= cmd "=") (re-search-forward "^`='"))
249 (t (error "Undocumented command! Type `G' in Ediff Control Panel to drop a note to the Ediff maintainer")))
250 ) ; let case-fold-search
251 ))
252
253
254;; assuming we are in control window, calculate length of the first line in
255;; help message
256(defun ediff-help-message-line-length ()
257 (save-excursion
258 (goto-char (point-min))
259 (if ediff-use-long-help-message
260 (next-line 1))
261 (end-of-line)
262 (current-column)))
71296446 263
f49e1445
MK
264
265(defun ediff-indent-help-message ()
266 (let* ((shift (/ (max 0 (- (window-width (selected-window))
267 (ediff-help-message-line-length)))
268 2))
269 (str (make-string shift ?\ )))
270 (save-excursion
271 (goto-char (point-min))
272 (while (< (point) (point-max))
273 (insert str)
274 (beginning-of-line)
275 (forward-line 1)))))
71296446 276
f49e1445
MK
277
278;; compose the help message as a string
279(defun ediff-set-help-message ()
280 (setq ediff-long-help-message
281 (cond ((and ediff-long-help-message-function
282 (or (symbolp ediff-long-help-message-function)
283 (consp ediff-long-help-message-function)))
284 (funcall ediff-long-help-message-function))
71296446 285 (ediff-word-mode
f49e1445
MK
286 (concat ediff-long-help-message-head
287 ediff-long-help-message-word-mode
288 ediff-long-help-message-tail))
289 (ediff-narrow-job
290 (concat ediff-long-help-message-head
291 ediff-long-help-message-narrow2
292 ediff-long-help-message-tail))
71296446 293 (ediff-merge-job
f49e1445
MK
294 (concat ediff-long-help-message-head
295 ediff-long-help-message-merge
296 ediff-long-help-message-tail))
297 (ediff-diff3-job
298 (concat ediff-long-help-message-head
299 ediff-long-help-message-compare3
300 ediff-long-help-message-tail))
71296446 301 (t
f49e1445
MK
302 (concat ediff-long-help-message-head
303 ediff-long-help-message-compare2
304 ediff-long-help-message-tail))))
71296446 305 (setq ediff-brief-help-message
f49e1445
MK
306 (cond ((and ediff-brief-help-message-function
307 (or (symbolp ediff-brief-help-message-function)
308 (consp ediff-brief-help-message-function)))
309 (funcall ediff-brief-help-message-function))
310 ((stringp ediff-brief-help-message-function)
311 ediff-brief-help-message-function)
312 ((ediff-multiframe-setup-p) ediff-brief-message-string)
313 (t ; long brief msg, not multiframe --- put in the middle
314 ediff-brief-message-string)
315 ))
316 (setq ediff-help-message (if ediff-use-long-help-message
317 ediff-long-help-message
318 ediff-brief-help-message))
319 (run-hooks 'ediff-display-help-hook))
320
55d7ff38 321;;;###autoload
3af0304a
MK
322(defun ediff-customize ()
323 (interactive)
324 (customize-group "ediff"))
325
f49e1445 326
ab5796a9 327;;; arch-tag: 05659813-7fcf-4274-964f-d2f577431a9d
f49e1445 328;;; ediff-help.el ends here