(electric-help-mode-hook): Add defcustom.
[bpt/emacs.git] / lisp / pcvs-defs.el
CommitLineData
5b467bf4
SM
1;;; pcvs-defs.el --- variable definitions for PCL-CVS
2
e7cff550 3;; Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
5b467bf4
SM
4
5;; Author: Stefan Monnier <monnier@cs.yale.edu>
6;; Keywords: pcl-cvs
619d6bfc 7;; Revision: $Id: pcvs-defs.el,v 1.10 2000/12/18 03:17:31 monnier Exp $
5b467bf4
SM
8
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
13;; the Free Software Foundation; either version 2, or (at your option)
14;; any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
22;; along with GNU Emacs; see the file COPYING. If not, write to the
23;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24;; Boston, MA 02111-1307, USA.
25
26;;; Commentary:
27
28
29;;; Code:
30
5b467bf4
SM
31(eval-when-compile (require 'cl))
32(require 'pcvs-util)
33
34;;;; -------------------------------------------------------
35;;;; START OF THINGS TO CHECK WHEN INSTALLING
36
37(defvar cvs-program "cvs"
38 "*Name or full path of the cvs executable.")
39
40(defvar cvs-version
41 (ignore-errors
42 (with-temp-buffer
43 (call-process "cvs" nil t nil "-v")
44 (goto-char (point-min))
45 (when (re-search-forward "(CVS) \\([0-9]+\\)\\.\\([0-9]+\\)" nil t)
46 (cons (string-to-number (match-string 1))
47 (string-to-number (match-string 2))))))
48 "*Version of `cvs' installed on your system.
49It must be in the (MAJOR . MINOR) format.")
50
51;; FIXME: this is only used by cvs-mode-diff-backup
52(defvar cvs-diff-program (or (and (boundp 'diff-command) diff-command) "diff")
53 "*Name or full path of the best diff program you've got.
54NOTE: there are some nasty bugs in the context diff variants of some vendor
55versions, such as the one in SunOS-4.")
56
57;;;; END OF THINGS TO CHECK WHEN INSTALLING
58;;;; --------------------------------------------------------
59
60;;;;
61;;;; User configuration variables:
62;;;;
63;;;; NOTE: these should be set in your ~/.emacs (or site-lisp/default.el) file.
64;;;;
65
66(defgroup pcl-cvs nil
67 "Special support for the CVS versioning system."
f4fbc2ff 68 :version "21.1"
5b467bf4
SM
69 :group 'tools
70 :prefix "cvs-")
71
72;;
73;; cvsrc options
74;;
75
76(defcustom cvs-cvsrc-file "~/.cvsrc"
77 "Path to your cvsrc file."
78 :group 'pcl-cvs
79 :type '(file))
80
81(defvar cvs-shared-start 4
82 "Index of the first shared flag.
83If set to 4, for instance, a numeric argument smaller than 4 will
84select a non-shared flag, while a numeric argument greater than 3
85will select a shared-flag.")
86
87(defvar cvs-shared-flags (make-list cvs-shared-start nil)
88 "List of flags whose settings is shared among several commands.")
89
90(defvar cvs-cvsroot nil
91 "*Specifies where the (current) cvs master repository is.
92Overrides the environment variable $CVSROOT by sending \" -d dir\" to
93all CVS commands. This switch is useful if you have multiple CVS
94repositories. It can be set interactively with \\[cvs-change-cvsroot.]
95There is no need to set this if $CVSROOT is set to a correct value.")
96
97(defcustom cvs-auto-remove-handled nil
98 "*If up-to-date files should be acknowledged automatically.
99If T, they will be removed from the *cvs* buffer after every command.
100If DELAYED, they will be removed from the *cvs* buffer before every command.
101If STATUS, they will only be removed after a `cvs-mode-status' command.
102Else, they will never be automatically removed from the *cvs* buffer."
103 :group 'pcl-cvs
104 :type '(choice (const nil) (const status) (const delayed) (const t)))
105
106(defcustom cvs-auto-remove-directories 'handled
107 "*If ALL, directory entries will never be shown.
108If HANLDED, only non-handled directories will be shown.
109If EMPTY, only non-empty directories will be shown."
110 :group 'pcl-cvs
111 :type '(choice (const :tag "No" nil) (const all) (const handled) (const empty)))
112
113(defcustom cvs-auto-revert t
114 "*Non-nil if changed files should automatically be reverted."
115 :group 'pcl-cvs
116 :type '(boolean))
117
118(defcustom cvs-sort-ignore-file t
119 "*Non-nil if `cvs-mode-ignore' should sort the .cvsignore automatically."
120 :group 'pcl-cvs
121 :type '(boolean))
122
123(defcustom cvs-force-dir-tag t
124 "*If non-nil, tagging can only be applied to directories.
125Tagging should generally be applied a directory at a time, but sometimes it is
126useful to be able to tag a single file. The normal way to do that is to use
127`cvs-mode-force-command' so as to temporarily override the restrictions,"
128 :group 'pcl-cvs
129 :type '(boolean))
130
131(defcustom cvs-default-ignore-marks nil
132 "*Non-nil if cvs mode commands should ignore any marked files.
133Normally they run on the files that are marked (with `cvs-mode-mark'),
134or the file under the cursor if no files are marked. If this variable
135is set to a non-nil value they will by default run on the file on the
2c0ec709 136current line. See also `cvs-invert-ignore-marks'"
5b467bf4
SM
137 :group 'pcl-cvs
138 :type '(boolean))
139
140(defvar cvs-diff-ignore-marks t
2c0ec709 141 "Obsolete: use `cvs-invert-ignore-marks' instead.")
5b467bf4
SM
142
143(defcustom cvs-invert-ignore-marks
144 (let ((l ()))
145 (unless (equal cvs-diff-ignore-marks cvs-default-ignore-marks)
146 (push "diff" l))
147 (when (and cvs-force-dir-tag (not cvs-default-ignore-marks))
148 (push "tag" l))
149 l)
150 "*List of cvs commands that invert the default ignore-mark behavior.
151Commands in this set will use the opposite default from the one set
152in `cvs-default-ignore-marks'."
153 :group 'pcl-cvs
154 :type '(set (const "diff")
155 (const "tag")
156 (const "ignore")))
157
158(defcustom cvs-confirm-removals t
159 "*Ask for confirmation before removing files.
160Non-nil means that PCL-CVS will ask confirmation before removing files
161except for files whose content can readily be recovered from the repository.
138e1bd0 162A value of `list' means that the list of files to be deleted will be
5b467bf4
SM
163displayed when asking for confirmation."
164 :group 'pcl-cvs
165 :type '(choice (const list)
166 (const t)
167 (const nil)))
168
169(defcustom cvs-add-default-message nil
170 "*Default message to use when adding files.
171If set to NIL, `cvs-mode-add' will always prompt for a message."
172 :group 'pcl-cvs
173 :type '(choice (const :tag "Prompt" nil)
174 (string)))
175
176(defvar cvs-diff-buffer-name "*cvs-diff*"
177 "Obsolete variable: use `cvs-buffer-name-alist' instead.")
178
2c0ec709 179(defcustom cvs-find-file-and-jump nil
5b467bf4
SM
180 "Jump to the modified area when finding a file.
181If non-nil, `cvs-mode-file-file' will place the cursor at the beginning of
182the modified area. If the file is not locally modified, this will obviously
183have no effect."
184 :group 'pcl-cvs
185 :type '(boolean))
186
187(defcustom cvs-buffer-name-alist
188 '(("diff" cvs-diff-buffer-name diff-mode)
189 ("status" "*cvs-info*" cvs-status-mode)
619d6bfc 190 ("tree" "*cvs-info*" cvs-status-mode)
5b467bf4
SM
191 ("message" "*cvs-commit*" nil log-edit)
192 ("log" "*cvs-info*" log-view-mode))
193 "*Buffer name and mode to be used for each command.
194This is a list of elements of the form
195
196 (CMD BUFNAME MODE &optional POSTPROC)
197
198CMD is the name of the command.
199BUFNAME is an expression that should evaluate to a string used as
200 a buffer name. It can use the variable CMD if it wants to.
201MODE is the command to use to setup the buffer.
202POSTPROC is a function that should be executed when the command terminates
203
204The CMD used for `cvs-mode-commit' is \"message\". For that special
205 case, POSTPROC is called just after MODE with special arguments."
206 :group 'pcl-cvs
207 :type '(repeat
208 (list (choice (const "diff")
209 (const "status")
210 (const "tree")
211 (const "message")
212 (const "log")
213 (string))
214 (choice (const "*vc-diff*")
215 (const "*cvs-info*")
216 (const "*cvs-commit*")
217 (const (expand-file-name "*cvs-commit*"))
218 (const (format "*cvs-%s*" cmd))
219 (const (expand-file-name (format "*cvs-%s*" cmd)))
220 (sexp :value "my-cvs-info-buffer")
221 (const nil))
222 (choice (function-item diff-mode)
223 (function-item cvs-edit-mode)
224 (function-item cvs-status-mode)
225 function
226 (const nil))
227 (set :inline t
228 (choice (function-item cvs-status-cvstrees)
229 (function-item cvs-status-trees)
230 function)))))
231
232(defvar cvs-buffer-name '(expand-file-name "*cvs*" dir) ;; "*cvs*"
233 "Name of the cvs buffer.
234This expression will be evaluated in an environment where DIR is set to
235the directory name of the cvs buffer.")
236
237(defvar cvs-temp-buffer-name '(expand-file-name " *cvs-tmp*" dir)
238 "*Name of the cvs temporary buffer.
239Output from cvs is placed here for asynchronous commands.")
240
241(defcustom cvs-idiff-imerge-handlers
242 (if (fboundp 'ediff)
243 '(cvs-ediff-diff . cvs-ediff-merge)
244 '(cvs-emerge-diff . cvs-emerge-merge))
245 "*Pair of functions to be used for resp. diff'ing and merg'ing interactively."
246 :group 'pcl-cvs
247 :type '(choice (const :tag "Ediff" (cvs-ediff-diff . cvs-ediff-merge))
248 (const :tag "Emerge" (cvs-emerge-diff . cvs-emerge-merge))))
249
250(defvar pcl-cvs-load-hook nil
251 "Run after loading pcl-cvs.")
252
253(defvar cvs-mode-hook nil
254 "Run after `cvs-mode' was setup.")
255
256\f
257;;;;
258;;;; Internal variables, used in the process buffer.
259;;;;
260
261(defvar cvs-postprocess nil
262 "(Buffer local) what to do once the process exits.")
263
264;;;;
265;;;; Internal variables for the *cvs* buffer.
266;;;;
267
268(defcustom cvs-reuse-cvs-buffer 'subdir
269 "When to reuse an existing cvs buffer.
270Alternatives are:
271 CURRENT: just reuse the current buffer if it is a cvs buffer
272 SAMEDIR: reuse any cvs buffer displaying the same directory
273 SUBDIR: or reuse any cvs buffer displaying any sub- or super- directory
274 ALWAYS: reuse any cvs buffer."
275 :group 'pcl-cvs
276 :type '(choice (const always) (const subdir) (const samedir) (const current)))
277
278(defvar cvs-temp-buffer nil
279 "(Buffer local) The temporary buffer associated with this *cvs* buffer.")
280
281(defvar cvs-lock-file nil
282 "Full path to a lock file that CVS is waiting for (or was waiting for).
283This variable is buffer local and only used in the *cvs* buffer.")
284
285(defvar cvs-lock-file-regexp "^#cvs\\.\\([trw]fl\\.[-.a-z0-9]+\\|lock\\)\\'"
286 "Regexp matching the possible names of locks in the CVS repository.")
287
288(defconst cvs-cursor-column 22
289 "Column to position cursor in in `cvs-mode'.")
290
291;;;;
292;;;; Global internal variables
293;;;;
294
5b467bf4
SM
295(defconst cvs-vendor-branch "1.1.1"
296 "The default branch used by CVS for vendor code.")
297
5b467bf4 298(easy-mmode-defmap cvs-mode-diff-map
4f5a9d2b
SM
299 '(("E" "imerge" . cvs-mode-imerge)
300 ("=" . cvs-mode-diff)
301 ("e" "idiff" . cvs-mode-idiff)
302 ("2" "other" . cvs-mode-idiff-other)
303 ("d" "diff" . cvs-mode-diff)
304 ("b" "backup" . cvs-mode-diff-backup)
305 ("h" "head" . cvs-mode-diff-head)
306 ("v" "vendor" . cvs-mode-diff-vendor))
307 "Keymap for diff-related operations in `cvs-mode'."
308 :name "Diff")
2c0ec709
SM
309;; This is necessary to allow correct handling of \\[cvs-mode-diff-map]
310;; in substitute-command-keys.
311(fset 'cvs-mode-diff-map cvs-mode-diff-map)
5b467bf4
SM
312
313(easy-mmode-defmap cvs-mode-map
314 ;;(define-prefix-command 'cvs-mode-map-diff-prefix)
315 ;;(define-prefix-command 'cvs-mode-map-control-c-prefix)
316 `(;; simulate `suppress-keymap'
317 (self-insert-command . undefined)
318 (("0" "1" "2" "3" "4" "5" "6" "7" "8" "9") . digit-argument)
319 ("-" . negative-argument)
320 ;; various
321 (undo . cvs-mode-undo)
322 ("?" . cvs-help)
323 ("h" . cvs-help)
324 ("q" . cvs-bury-buffer)
325 ;;("Q" . kill-buffer)
326 ("F" . cvs-mode-set-flags)
327 ("\M-f" . cvs-mode-force-command)
328 ("\C-c\C-c" . cvs-mode-kill-process)
329 ;; marking
330 ("m" . cvs-mode-mark)
331 ("M" . cvs-mode-mark-all-files)
332 ("u" . cvs-mode-unmark)
333 ("\C-?". cvs-mode-unmark-up)
334 ("%" . cvs-mode-mark-matching-files)
335 ("T" . cvs-mode-toggle-marks)
336 ("\M-\C-?" . cvs-mode-unmark-all-files)
337 ;; navigation keys
338 (" " . cvs-mode-next-line)
339 ("n" . cvs-mode-next-line)
340 ("p" . cvs-mode-previous-line)
341 ;; M- keys are usually those that operate on modules
342 ;;("\M-C". cvs-mode-rcs2log) ; i.e. "Create a ChangeLog"
343 ;;("\M-t". cvs-rtag)
344 ;;("\M-l". cvs-rlog)
345 ("\M-c". cvs-checkout)
346 ("\M-e". cvs-examine)
347 ("g" . cvs-mode-revert-buffer)
348 ("\M-u". cvs-update)
349 ("\M-s". cvs-status)
350 ;; diff commands
351 ("=" . cvs-mode-diff)
2c0ec709 352 ("d" . cvs-mode-diff-map)
5b467bf4
SM
353 ;; keys that operate on individual files
354 ("\C-k". cvs-mode-acknowledge)
355 ("A" . cvs-mode-add-change-log-entry-other-window)
356 ;;("B" . cvs-mode-byte-compile-files)
357 ("C" . cvs-mode-commit-setup)
358 ("O" . cvs-mode-update)
359 ("U" . cvs-mode-undo)
360 ("I" . cvs-mode-insert)
361 ("a" . cvs-mode-add)
362 ("b" . cvs-set-branch-prefix)
363 ("B" . cvs-set-secondary-branch-prefix)
364 ("c" . cvs-mode-commit)
365 ("e" . cvs-mode-examine)
366 ("f" . cvs-mode-find-file)
367 ("i" . cvs-mode-ignore)
368 ("l" . cvs-mode-log)
369 ("o" . cvs-mode-find-file-other-window)
370 ("r" . cvs-mode-remove)
371 ("s" . cvs-mode-status)
372 ("t" . cvs-mode-tag)
373 ;;("v" . cvs-mode-diff-vendor)
374 ("x" . cvs-mode-remove-handled)
375 ;; cvstree bindings
376 ("+" . cvs-mode-tree)
377 ;; mouse bindings
2c0ec709 378 ([mouse-2] . cvs-mode-find-file)
5b467bf4
SM
379 ([(down-mouse-3)] . cvs-menu)
380 ;; Emacs-21 toolbar
381 ;;([tool-bar item1] . (menu-item "Examine" cvs-examine :image (image :file "/usr/share/icons/xpaint.xpm" :type xpm)))
382 ;;([tool-bar item2] . (menu-item "Update" cvs-update :image (image :file "/usr/share/icons/mail1.xpm" :type xpm)))
383 )
384 "Keymap for `cvs-mode'."
385 :dense t)
386
387(fset 'cvs-mode-map cvs-mode-map)
388
8e41e2e5
SM
389(easy-menu-define cvs-menu cvs-mode-map "Menu used in `cvs-mode'."
390 '("CVS"
391 ["Open file.." cvs-mode-find-file t]
392 [" ..other window" cvs-mode-find-file-other-window t]
393 ["Interactive merge" cvs-mode-imerge t]
394 ("View diff"
395 ["Interactive diff" cvs-mode-idiff t]
396 ["Current diff" cvs-mode-diff t]
397 ["Diff with head" cvs-mode-diff-head t]
398 ["Diff with vendor" cvs-mode-diff-vendor t]
399 ["Diff with backup" cvs-mode-diff-backup t])
400 ["View log" cvs-mode-log t]
401 ["View status" cvs-mode-status t]
402 ["View tag tree" cvs-mode-tree t]
403 "----"
404 ["Insert" cvs-mode-insert]
405 ["Update" cvs-mode-update (cvs-enabledp 'update)]
406 ["Re-examine" cvs-mode-examine t]
407 ["Commit" cvs-mode-commit-setup (cvs-enabledp 'commit)]
408 ["Undo changes" cvs-mode-undo (cvs-enabledp 'undo)]
409 ["Add" cvs-mode-add (cvs-enabledp 'add)]
410 ["Remove" cvs-mode-remove (cvs-enabledp 'remove)]
411 ["Ignore" cvs-mode-ignore (cvs-enabledp 'ignore)]
412 ["Add ChangeLog" cvs-mode-add-change-log-entry-other-window t]
413 "----"
414 ["Mark all" cvs-mode-mark-all-files t]
415 ["Unmark all" cvs-mode-unmark-all-files t]
416 ["Hide handled" cvs-mode-remove-handled t]
417 "----"
418 ["Quit" cvs-mode-quit t]))
5b467bf4
SM
419
420;;;;
421;;;; CVS-Minor mode
422;;;;
423
424(defcustom cvs-minor-mode-prefix "\C-xc"
425 "Prefix key for the `cvs-mode' bindings in `cvs-minor-mode'."
426 :group 'pcl-cvs)
427
428(easy-mmode-defmap cvs-minor-mode-map
429 `((,cvs-minor-mode-prefix . cvs-mode-map))
4f5a9d2b 430 "Keymap for `cvs-minor-mode', used in buffers related to PCL-CVS.")
5b467bf4
SM
431
432(defvar cvs-buffer nil
433 "(Buffer local) The *cvs* buffer associated with this buffer.")
434(put 'cvs-buffer 'permanent-local t)
435;;(make-variable-buffer-local 'cvs-buffer)
436
437(defvar cvs-minor-wrap-function nil
438 "Function to call when switching to the *cvs* buffer.
439Takes two arguments:
440- a *cvs* buffer.
441- a zero-arg function which is guaranteed not to switch buffer.
442It is expected to call the function.")
443;;(make-variable-buffer-local 'cvs-minor-wrap-function)
444
445(defvar cvs-minor-current-files)
446;;"Current files in a `cvs-minor-mode' buffer."
447;; This should stay `void' because we want to be able to tell the difference
448;; between an empty list and no list at all.
449
450(defconst cvs-pcl-cvs-dirchange-re "^pcl-cvs: descending directory \\(.*\\)$")
451
452;;;;
cb3430a1 453;;;; autoload the global menu
5b467bf4
SM
454;;;;
455
cb3430a1
SM
456;;;###autoload
457(defvar cvs-global-menu
458 (let ((m (make-sparse-keymap "PCL-CVS")))
459 (define-key m [status]
460 '(menu-item "Directory Status" cvs-status
461 :help "A more verbose status of a workarea"))
462 (define-key m [checkout]
463 '(menu-item "Checkout Module" cvs-checkout
464 :help "Check out a module from the repository"))
465 (define-key m [update]
466 '(menu-item "Update Directory" cvs-update
467 :help "Fetch updates from the repository"))
468 (define-key m [examine]
469 '(menu-item "Examine Directory" cvs-examine
470 :help "Examine the current state of a workarea"))
471 m))
5b467bf4
SM
472
473
474;; cvs-1.10 and above can take file arguments in other directories
475;; while others need to be executed once per directory
476(defvar cvs-execute-single-dir
477 (if (and (consp cvs-version)
478 (or (>= (cdr cvs-version) 10) (> (car cvs-version) 1)))
479 '("status")
480 t)
481 "Whether cvs commands should be executed a directory at a time.
482If a list, specifies for which commands the single-dir mode should be used.
483If T, single-dir mode should be used for all operations.
484
485CVS versions before 1.10 did not allow passing them arguments in different
486directories, so pcl-cvs checks what version you're using to determine
487whether to use the new feature or not.
488Sadly, even with a new cvs executable, if you connect to an older cvs server
489\(typically a cvs-1.9 on the server), the old restriction applies. In such
490a case the sanity check made by pcl-cvs fails and you will have to manually
491set this variable to T (until the cvs server is upgraded).
492When the above problem occurs, pcl-cvs should (hopefully) catch cvs' error
493message and replace it with a message tell you to change this variable.")
494
495;;
496(provide 'pcvs-defs)
497
498;;; pcl-cvs-defs.el ends here