|
|
1.1 ! root 1: ;; Basic lisp subroutines for Emacs ! 2: ;; Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc. ! 3: ! 4: ;; This file is part of GNU Emacs. ! 5: ! 6: ;; GNU Emacs is free software; you can redistribute it and/or modify ! 7: ;; it under the terms of the GNU General Public License as published by ! 8: ;; the Free Software Foundation; either version 1, or (at your option) ! 9: ;; any later version. ! 10: ! 11: ;; GNU Emacs is distributed in the hope that it will be useful, ! 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: ;; GNU General Public License for more details. ! 15: ! 16: ;; You should have received a copy of the GNU General Public License ! 17: ;; along with GNU Emacs; see the file COPYING. If not, write to ! 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: ! 20: ! 21: (defun one-window-p (&optional nomini) ! 22: "Returns non-nil if there is only one window. ! 23: Optional arg NOMINI non-nil means don't count the minibuffer ! 24: even if it is active." ! 25: (let ((base-window (selected-window))) ! 26: (if (and nomini (eq base-window (minibuffer-window))) ! 27: (setq base-window (next-window base-window))) ! 28: (eq base-window ! 29: (next-window base-window (if nomini 'arg))))) ! 30: ! 31: (defun read-quoted-char (&optional prompt) ! 32: "Like `read-char', except that if the first character read is an octal ! 33: digit, we read up to two more octal digits and return the character ! 34: represented by the octal number consisting of those digits. ! 35: Optional argument PROMPT specifies a string to use to prompt the user." ! 36: (let ((count 0) (code 0) char) ! 37: (while (< count 3) ! 38: (let ((inhibit-quit (zerop count)) ! 39: (help-form nil)) ! 40: (and prompt (message "%s-" prompt)) ! 41: (setq char (read-char)) ! 42: (if inhibit-quit (setq quit-flag nil))) ! 43: (cond ((null char)) ! 44: ((and (<= ?0 char) (<= char ?7)) ! 45: (setq code (+ (* code 8) (- char ?0)) ! 46: count (1+ count)) ! 47: (and prompt (message (setq prompt ! 48: (format "%s %c" prompt char))))) ! 49: ((> count 0) ! 50: (setq unread-command-char char count 259)) ! 51: (t (setq code char count 259)))) ! 52: (logand 255 code))) ! 53: ! 54: (defun error (&rest args) ! 55: "Signal an error, making error message by passing all args to `format'." ! 56: (while t ! 57: (signal 'error (list (apply 'format args))))) ! 58: ! 59: (defun undefined () ! 60: (interactive) ! 61: (ding)) ! 62: ! 63: ;Prevent the \{...} documentation construct ! 64: ;from mentioning keys that run this command. ! 65: (put 'undefined 'suppress-keymap t) ! 66: ! 67: (defun suppress-keymap (map &optional arg) ! 68: "Make MAP override all buffer-modifying commands to be undefined. ! 69: Works by knowing which commands are normally buffer-modifying. ! 70: Normally also makes digits set numeric arg, ! 71: but optional second arg NODIGITS non-nil prevents this." ! 72: (let ((i ? )) ! 73: (while (< i 127) ! 74: (aset map i 'undefined) ! 75: (setq i (1+ i)))) ! 76: (or arg ! 77: (let (loop) ! 78: (aset map ?- 'negative-argument) ! 79: ;; Make plain numbers do numeric args. ! 80: (setq loop ?0) ! 81: (while (<= loop ?9) ! 82: (aset map loop 'digit-argument) ! 83: (setq loop (1+ loop)))))) ! 84: ! 85: ;; now in fns.c ! 86: ;(defun nth (n list) ! 87: ; "Returns the Nth element of LIST. ! 88: ;N counts from zero. If LIST is not that long, nil is returned." ! 89: ; (car (nthcdr n list))) ! 90: ; ! 91: ;(defun copy-alist (alist) ! 92: ; "Return a copy of ALIST. ! 93: ;This is a new alist which represents the same mapping ! 94: ;from objects to objects, but does not share the alist structure with ALIST. ! 95: ;The objects mapped (cars and cdrs of elements of the alist) ! 96: ;are shared, however." ! 97: ; (setq alist (copy-sequence alist)) ! 98: ; (let ((tail alist)) ! 99: ; (while tail ! 100: ; (if (consp (car tail)) ! 101: ; (setcar tail (cons (car (car tail)) (cdr (car tail))))) ! 102: ; (setq tail (cdr tail)))) ! 103: ; alist) ! 104: ! 105: ;Moved to keymap.c ! 106: ;(defun copy-keymap (keymap) ! 107: ; "Return a copy of KEYMAP" ! 108: ; (while (not (keymapp keymap)) ! 109: ; (setq keymap (signal 'wrong-type-argument (list 'keymapp keymap)))) ! 110: ; (if (vectorp keymap) ! 111: ; (copy-sequence keymap) ! 112: ; (copy-alist keymap))) ! 113: ! 114: (defun substitute-key-definition (olddef newdef keymap) ! 115: "Replace OLDDEF with NEWDEF for any keys in KEYMAP now defined as OLDDEF. ! 116: In other words, OLDDEF is replaced with NEWDEF where ever it appears." ! 117: (if (arrayp keymap) ! 118: (let ((len (length keymap)) ! 119: (i 0)) ! 120: (while (< i len) ! 121: (if (eq (aref keymap i) olddef) ! 122: (aset keymap i newdef)) ! 123: (setq i (1+ i)))) ! 124: (while keymap ! 125: (if (eq (cdr-safe (car-safe keymap)) olddef) ! 126: (setcdr (car keymap) newdef)) ! 127: (setq keymap (cdr keymap))))) ! 128: ! 129: ;; Avoids useless byte-compilation. ! 130: ;; In the future, would be better to fix byte compiler ! 131: ;; not to really compile in cases like this, ! 132: ;; and use defun here. ! 133: (fset 'ignore '(lambda (&rest ignore) nil)) ! 134: ! 135: ! 136: ; old names ! 137: (fset 'make-syntax-table 'copy-syntax-table) ! 138: (fset 'dot 'point) ! 139: (fset 'dot-marker 'point-marker) ! 140: (fset 'dot-min 'point-min) ! 141: (fset 'dot-max 'point-max) ! 142: (fset 'window-dot 'window-point) ! 143: (fset 'set-window-dot 'set-window-point) ! 144: (fset 'read-input 'read-string) ! 145: (fset 'send-string 'process-send-string) ! 146: (fset 'send-region 'process-send-region) ! 147: (fset 'show-buffer 'set-window-buffer) ! 148: ! 149: ; alternate names ! 150: (fset 'string= 'string-equal) ! 151: (fset 'string< 'string-lessp) ! 152: (fset 'mod '%) ! 153: (fset 'move-marker 'set-marker) ! 154: (fset 'eql 'eq) ! 155: (fset 'not 'null) ! 156: (fset 'numberp 'integerp) ! 157: (fset 'rplaca 'setcar) ! 158: (fset 'rplacd 'setcdr) ! 159: (fset 'beep 'ding) ;preserve lingual purtity ! 160: (fset 'indent-to-column 'indent-to) ! 161: (fset 'backward-delete-char 'delete-backward-char) ! 162: ! 163: (defvar global-map nil ! 164: "Default global keymap mapping Emacs keyboard input into commands. ! 165: The value is a keymap which is usually (but not necessarily) Emacs's ! 166: global map.") ! 167: ! 168: (defvar ctl-x-map nil ! 169: "Default keymap for C-x commands. ! 170: The normal global definition of the character C-x indirects to this keymap.") ! 171: ! 172: (defvar esc-map nil ! 173: "Default keymap for ESC (meta) commands. ! 174: The normal global definition of the character ESC indirects to this keymap.") ! 175: ! 176: (defvar mouse-map nil ! 177: "Keymap for mouse commands from the X window system.") ! 178: ! 179: (defun run-hooks (&rest hooklist) ! 180: "Takes hook names and runs each one in turn. Major mode functions use this. ! 181: Each argument should be a symbol, a hook variable. ! 182: These symbols are processed in the order specified. ! 183: If a hook symbol has a non-nil value, that value may be a function ! 184: or a list of functions to be called to run the hook. ! 185: If the value is a function, it is called with no arguments. ! 186: If it is a list, the elements are called, in order, with no arguments." ! 187: (while hooklist ! 188: (let ((sym (car hooklist))) ! 189: (and (boundp sym) ! 190: (symbol-value sym) ! 191: (let ((value (symbol-value sym))) ! 192: (if (and (listp value) (not (eq (car value) 'lambda))) ! 193: (mapcar 'funcall value) ! 194: (funcall value))))) ! 195: (setq hooklist (cdr hooklist)))) ! 196: ! 197: (defun momentary-string-display (string pos &optional exit-char message) ! 198: "Momentarily display STRING in the buffer at POS. ! 199: Display remains until next character is typed. ! 200: If the char is EXIT-CHAR (optional third arg, default is SPC) it is swallowed; ! 201: otherwise it is then available as input (as a command if nothing else). ! 202: Display MESSAGE (optional fourth arg) in the echo area. ! 203: If MESSAGE is nil, instructions to type EXIT-CHAR are displayed there." ! 204: (or exit-char (setq exit-char ?\ )) ! 205: (let ((buffer-read-only nil) ! 206: (modified (buffer-modified-p)) ! 207: (name buffer-file-name) ! 208: insert-end) ! 209: (unwind-protect ! 210: (progn ! 211: (save-excursion ! 212: (goto-char pos) ! 213: ;; defeat file locking... don't try this at home, kids! ! 214: (setq buffer-file-name nil) ! 215: (insert-before-markers string) ! 216: (setq insert-end (point))) ! 217: (message (or message "Type %s to continue editing.") ! 218: (single-key-description exit-char)) ! 219: (let ((char (read-char))) ! 220: (or (eq char exit-char) ! 221: (setq unread-command-char char)))) ! 222: (if insert-end ! 223: (save-excursion ! 224: (delete-region pos insert-end))) ! 225: (setq buffer-file-name name) ! 226: (set-buffer-modified-p modified)))) ! 227: ! 228: (defun undo-start () ! 229: "Move undo-pointer to front of undo records. ! 230: The next call to undo-more will undo the most recently made change." ! 231: (if (eq buffer-undo-list t) ! 232: (error "No undo information in this buffer")) ! 233: (setq pending-undo-list buffer-undo-list)) ! 234: ! 235: (defun undo-more (count) ! 236: "Undo back N undo-boundaries beyond what was already undone recently. ! 237: Call undo-start to get ready to undo recent changes, ! 238: then call undo-more one or more times to undo them." ! 239: (or pending-undo-list ! 240: (error "No further undo information")) ! 241: (setq pending-undo-list (primitive-undo count pending-undo-list)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.