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