X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8700ec61fd72836eafc5a64f3fce62727e6d0a9f..1b74c4346e92c9ac1ae0575c2ad69f8d81126d7e:/lisp/macros.el diff --git a/lisp/macros.el b/lisp/macros.el index 5bf6560e5e..7075300ba1 100644 --- a/lisp/macros.el +++ b/lisp/macros.el @@ -1,6 +1,7 @@ -;;; macros.el --- non-primitive commands for keyboard macros. +;;; macros.el --- non-primitive commands for keyboard macros -;; Copyright (C) 1985, 86, 87, 92, 94, 95 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1995, 2002, 2003, +;; 2004, 2005 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: abbrev @@ -19,8 +20,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -43,8 +44,10 @@ Such a \"function\" cannot be called from Lisp, but it is a valid editor command (and (fboundp symbol) (not (stringp (symbol-function symbol))) (not (vectorp (symbol-function symbol))) - (error "Function %s is already defined and not a keyboard macro." + (error "Function %s is already defined and not a keyboard macro" symbol)) + (if (string-equal symbol "") + (error "No command name given")) (fset symbol last-kbd-macro)) ;;;###autoload @@ -61,7 +64,15 @@ bindings. To save a kbd macro, visit a file of Lisp code such as your `~/.emacs', use this command, and then save the file." - (interactive "CInsert kbd macro (name): \nP") + (interactive (list (intern (completing-read "Insert kbd macro (name): " + obarray + (lambda (elt) + (and (fboundp elt) + (or (stringp (symbol-function elt)) + (vectorp (symbol-function elt)) + (get elt 'kmacro)))) + t)) + current-prefix-arg)) (let (definition) (if (string= (symbol-name macroname) "") (progn @@ -148,6 +159,10 @@ use this command, and then save the file." (setq mods (cdr mods))) (cond ((= char ?\\) (insert "\\\\")) + ((= char ?\") + (insert "\\\"")) + ((= char ?\;) + (insert "\\;")) ((= char 127) (insert "\\C-?")) ((< char 127) @@ -180,20 +195,20 @@ Your options are: \\ \\[recenter] Redisplay the screen, then ask again. \\[edit] Enter recursive edit; ask again when you exit from that." (interactive "P") - (or executing-macro + (or executing-kbd-macro defining-kbd-macro (error "Not defining or executing kbd macro")) (if flag - (let (executing-macro defining-kbd-macro) + (let (executing-kbd-macro defining-kbd-macro) (recursive-edit)) - (if (not executing-macro) + (if (not executing-kbd-macro) nil (let ((loop t) (msg (substitute-command-keys "Proceed with macro?\\\ (\\[act], \\[skip], \\[exit], \\[recenter], \\[edit]) "))) (while loop - (let ((key (let ((executing-macro nil) + (let ((key (let ((executing-kbd-macro nil) (defining-kbd-macro nil)) (message "%s" msg) (read-event))) @@ -204,14 +219,14 @@ Your options are: \\ (setq loop nil)) ((eq def 'skip) (setq loop nil) - (setq executing-macro "")) + (setq executing-kbd-macro "")) ((eq def 'exit) (setq loop nil) - (setq executing-macro t)) + (setq executing-kbd-macro t)) ((eq def 'recenter) (recenter nil)) ((eq def 'edit) - (let (executing-macro defining-kbd-macro) + (let (executing-kbd-macro defining-kbd-macro) (recursive-edit))) ((eq def 'quit) (setq quit-flag t)) @@ -234,8 +249,9 @@ Possibilities: \\ ;;;###autoload (defun apply-macro-to-region-lines (top bottom &optional macro) - "For each complete line between point and mark, move to the beginning -of the line, and run the last keyboard macro. + "Apply last keyboard macro to all lines in the region. +For each line that begins in the region, move to the beginning of +the line, and run the last keyboard macro. When called from lisp, this function takes two arguments TOP and BOTTOM, describing the current region. TOP must be before BOTTOM. @@ -254,7 +270,7 @@ and mark at opposite ends of the quoted section, and use Suppose you wanted to build a keyword table in C where each entry looked like this: - { \"foo\", foo_data, foo_function }, + { \"foo\", foo_data, foo_function }, { \"bar\", bar_data, bar_function }, { \"baz\", baz_data, baz_function }, @@ -271,19 +287,15 @@ and write a macro to massage a word into a table entry: \\C-x ) and then select the region of un-tablified names and use -`\\[apply-macro-to-region-lines]' to build the table from the names. -" +`\\[apply-macro-to-region-lines]' to build the table from the names." (interactive "r") (or macro (progn (if (null last-kbd-macro) - (error "No keyboard macro has been defined.")) + (error "No keyboard macro has been defined")) (setq macro last-kbd-macro))) (save-excursion - (let ((end-marker (progn - (goto-char bottom) - (beginning-of-line) - (point-marker))) + (let ((end-marker (copy-marker bottom)) next-line-marker) (goto-char top) (if (not (bolp)) @@ -295,10 +307,14 @@ and then select the region of un-tablified names and use (forward-line 1) (set-marker next-line-marker (point))) (save-excursion - (execute-kbd-macro (or macro last-kbd-macro)))) + (let ((mark-active nil)) + (execute-kbd-macro (or macro last-kbd-macro))))) (set-marker end-marker nil) (set-marker next-line-marker nil)))) ;;;###autoload (define-key ctl-x-map "q" 'kbd-macro-query) +(provide 'macros) + +;;; arch-tag: 346ed1a5-1220-4bc8-b533-961ee704361f ;;; macros.el ends here