(mouse-insert-selection): Test mouse-yank-at-point.
[bpt/emacs.git] / lisp / novice.el
CommitLineData
6594deb0
ER
1;;; novice.el --- handling of disabled commands ("novice mode") for Emacs.
2
8f1204db 3;; Copyright (C) 1985, 1986, 1987, 1994 Free Software Foundation, Inc.
9750e079 4
e5167999 5;; Maintainer: FSF
d7b4d18f 6;; Keywords: internal, help
e5167999 7
a2535589
JA
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
e5167999 12;; the Free Software Foundation; either version 2, or (at your option)
a2535589
JA
13;; any later version.
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
21;; along with GNU Emacs; see the file COPYING. If not, write to
22;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23
edbd2f74
ER
24;;; Commentary:
25
26;; This mode provides a hook which is, by default, attached to various
27;; putatively dangerous commands in a (probably futile) attempt to
28;; prevent lusers from shooting themselves in the feet.
29
aae56ea7 30;;; Code:
a2535589
JA
31
32;; This function is called (by autoloading)
33;; to handle any disabled command.
34;; The command is found in this-command
35;; and the keys are returned by (this-command-keys).
36
7229064d 37;;;###autoload
73fa8346
BP
38(setq disabled-command-hook 'disabled-command-hook)
39
1c599895 40;;;###autoload
a2535589
JA
41(defun disabled-command-hook (&rest ignore)
42 (let (char)
43 (save-window-excursion
44 (with-output-to-temp-buffer "*Help*"
61563ba0
RS
45 (if (eq (aref (this-command-keys) 0)
46 (if (stringp (this-command-keys))
47 (aref "\M-x" 0)
48 ?\M-x))
a2535589
JA
49 (princ "You have invoked the disabled command ")
50 (princ "You have typed ")
51 (princ (key-description (this-command-keys)))
52 (princ ", invoking disabled command "))
53 (princ this-command)
54 (princ ":\n")
55 ;; Print any special message saying why the command is disabled.
56 (if (stringp (get this-command 'disabled))
57 (princ (get this-command 'disabled)))
58 (princ (or (condition-case ()
59 (documentation this-command)
60 (error nil))
61 "<< not documented >>"))
62 ;; Keep only the first paragraph of the documentation.
63 (save-excursion
64 (set-buffer "*Help*")
65 (goto-char (point-min))
66 (if (search-forward "\n\n" nil t)
67 (delete-region (1- (point)) (point-max))
68 (goto-char (point-max))))
69 (princ "\n\n")
70 (princ "You can now type
71Space to try the command just this once,
72 but leave it disabled,
73Y to try it and enable it (no questions if you use it again),
74N to do nothing (command remains disabled)."))
75 (message "Type y, n or Space: ")
76 (let ((cursor-in-echo-area t))
77 (while (not (memq (setq char (downcase (read-char)))
78 '(? ?y ?n)))
79 (ding)
80 (message "Please type y, n or Space: "))))
81 (if (= char ?y)
7435bd25
RS
82 (if (and user-init-file
83 (not (string= "" user-init-file))
84 (y-or-n-p "Enable command for future editing sessions also? "))
a2535589
JA
85 (enable-command this-command)
86 (put this-command 'disabled nil)))
87 (if (/= char ?n)
88 (call-interactively this-command))))
89
7229064d 90;;;###autoload
a2535589
JA
91(defun enable-command (command)
92 "Allow COMMAND to be executed without special confirmation from now on.
93The user's .emacs file is altered so that this will apply
94to future sessions."
95 (interactive "CEnable command: ")
96 (put command 'disabled nil)
97 (save-excursion
7435bd25 98 (set-buffer (find-file-noselect
bb79850e 99 (substitute-in-file-name user-init-file)))
a2535589
JA
100 (goto-char (point-min))
101 (if (search-forward (concat "(put '" (symbol-name command) " ") nil t)
102 (delete-region
103 (progn (beginning-of-line) (point))
104 (progn (forward-line 1) (point)))
105 ;; Must have been disabled by default.
106 (goto-char (point-max))
107 (insert "\n(put '" (symbol-name command) " 'disabled nil)\n"))
a2535589
JA
108 (save-buffer)))
109
7229064d 110;;;###autoload
a2535589
JA
111(defun disable-command (command)
112 "Require special confirmation to execute COMMAND from now on.
113The user's .emacs file is altered so that this will apply
114to future sessions."
115 (interactive "CDisable command: ")
5b817cf2
RS
116 (if (not (commandp command))
117 (error "Invalid command name `%s'" command))
a2535589
JA
118 (put command 'disabled t)
119 (save-excursion
7435bd25 120 (set-buffer (find-file-noselect
bb79850e 121 (substitute-in-file-name user-init-file)))
a2535589
JA
122 (goto-char (point-min))
123 (if (search-forward (concat "(put '" (symbol-name command) " ") nil t)
124 (delete-region
125 (progn (beginning-of-line) (point))
126 (progn (forward-line 1) (point))))
127 (goto-char (point-max))
128 (insert "(put '" (symbol-name command) " 'disabled t)\n")
129 (save-buffer)))
130
6594deb0 131;;; novice.el ends here