Annotation of 43BSD/contrib/emacs/lisp/simple.el, revision 1.1

1.1     ! root        1: ;; Basic editing commands for Emacs
        !             2: ;; Copyright (C) 1985 Richard M. Stallman.
        !             3: 
        !             4: ;; This file is part of GNU Emacs.
        !             5: 
        !             6: ;; GNU Emacs is distributed in the hope that it will be useful,
        !             7: ;; but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: ;; accepts responsibility to anyone for the consequences of using it
        !             9: ;; or for whether it serves any particular purpose or works at all,
        !            10: ;; unless he says so in writing.  Refer to the GNU Emacs General Public
        !            11: ;; License for full details.
        !            12: 
        !            13: ;; Everyone is granted permission to copy, modify and redistribute
        !            14: ;; GNU Emacs, but only under the conditions described in the
        !            15: ;; GNU Emacs General Public License.   A copy of this license is
        !            16: ;; supposed to have been given to you along with GNU Emacs so you
        !            17: ;; can know your rights and responsibilities.  It should be in a
        !            18: ;; file named COPYING.  Among other things, the copyright notice
        !            19: ;; and this notice must be preserved on all copies.
        !            20: 
        !            21: 
        !            22: (defun open-line (arg)
        !            23:   "Insert a newline and leave point before it.
        !            24: With arg, inserts that many newlines."
        !            25:   (interactive "p")
        !            26:   (let ((flag (and (bolp) (not (bobp)))))
        !            27:     (if flag (forward-char -1))
        !            28:     (while (> arg 0)
        !            29:       (insert ?\n)
        !            30:       (goto-char (1- (point)))
        !            31:       (setq arg (1- arg)))
        !            32:     (if flag (forward-char 1))))
        !            33: 
        !            34: (defun split-line ()
        !            35:   "Split current line, moving portion beyond point vertically down."
        !            36:   (interactive "*")
        !            37:   (skip-chars-forward " \t")
        !            38:   (let ((col (current-column))
        !            39:        (pos (point)))
        !            40:     (insert ?\n)
        !            41:     (indent-to col 0)
        !            42:     (goto-char pos)))
        !            43: 
        !            44: (defun quoted-insert (arg)
        !            45:   "Read next input character and insert it.
        !            46: Useful for inserting control characters.
        !            47: You may also type up to 3 octal digits, to insert a character with that code"
        !            48:   (interactive "*p")
        !            49:   (let ((char (read-quoted-char)))
        !            50:     (while (> arg 0)
        !            51:       (insert char)
        !            52:       (setq arg (1- arg)))))
        !            53: 
        !            54: (defun delete-indentation (&optional arg)
        !            55:   "Join this line to previous and fix up whitespace at join.
        !            56: With argument, join this line to following line."
        !            57:   (interactive "*P")
        !            58:   (beginning-of-line)
        !            59:   (if arg (forward-line 1))
        !            60:   (if (not (bobp))
        !            61:       (progn
        !            62:        (delete-region (point) (1- (point)))
        !            63:        (fixup-whitespace))))
        !            64: 
        !            65: (defun fixup-whitespace ()
        !            66:   "Fixup white space between objects around point.
        !            67: Leave one space or none, according to the context."
        !            68:   (interactive "*")
        !            69:   (save-excursion
        !            70:     (delete-horizontal-space)
        !            71:     (if (or (looking-at "^\\|\\s)")
        !            72:            (save-excursion (forward-char -1)
        !            73:                            (looking-at "$\\|\\s(\\|\\s'")))
        !            74:        nil
        !            75:       (insert ?\ ))))
        !            76: 
        !            77: (defun delete-horizontal-space ()
        !            78:   "Delete all spaces and tabs around point."
        !            79:   (interactive "*")
        !            80:   (skip-chars-backward " \t")
        !            81:   (delete-region (point) (progn (skip-chars-forward " \t") (point))))
        !            82: 
        !            83: (defun just-one-space ()
        !            84:   "Delete all spaces and tabs around point, leaving one space."
        !            85:   (interactive "*")
        !            86:   (skip-chars-backward " \t")
        !            87:   (if (= (following-char) ? )
        !            88:       (forward-char 1)
        !            89:     (insert ? ))
        !            90:   (delete-region (point) (progn (skip-chars-forward " \t") (point))))
        !            91: 
        !            92: (defun delete-blank-lines ()
        !            93:   "On blank line, delete all surrounding blank lines, leaving just one.
        !            94: On isolated blank line, delete that one.
        !            95: On nonblank line, delete all blank lines that follow it."
        !            96:   (interactive "*")
        !            97:   (let (thisblank singleblank)
        !            98:     (save-excursion
        !            99:       (beginning-of-line)
        !           100:       (setq thisblank (looking-at "[ \t]*$"))
        !           101:       (setq singleblank
        !           102:            (and thisblank
        !           103:                 (not (looking-at "[ \t]*\n[ \t]*$"))
        !           104:                 (or (bobp)
        !           105:                     (progn (forward-line -1)
        !           106:                            (not (looking-at "[ \t]*$")))))))
        !           107:     (if thisblank
        !           108:        (progn
        !           109:          (beginning-of-line)
        !           110:          (if singleblank (forward-line 1))
        !           111:          (delete-region (point)
        !           112:                         (if (re-search-backward "[^ \t\n]" nil t)
        !           113:                             (progn (forward-line 1) (point))
        !           114:                           (point-min)))))
        !           115:     (if (not (and thisblank singleblank))
        !           116:        (save-excursion
        !           117:          (end-of-line)
        !           118:          (forward-line 1)
        !           119:          (delete-region (point)
        !           120:                         (if (re-search-forward "[^ \t\n]" nil t)
        !           121:                             (progn (beginning-of-line) (point))
        !           122:                           (point-max)))))))
        !           123: 
        !           124: (defun back-to-indentation ()
        !           125:   "Move point to the first non-whitespace character on this line."
        !           126:   (interactive)
        !           127:   (beginning-of-line 1)
        !           128:   (skip-chars-forward " \t"))
        !           129: 
        !           130: (defun newline-and-indent ()
        !           131:   "Insert a newline, then indent according to mode, like Tab."
        !           132:   (interactive "*")
        !           133:   (delete-region (point) (progn (skip-chars-backward " \t") (point)))
        !           134:   (insert ?\n)
        !           135:   (indent-according-to-mode))
        !           136: 
        !           137: (defun reindent-then-newline-and-indent ()
        !           138:   "Reindent the current line according to mode (like Tab), then insert
        !           139: a newline, and indent the new line indent according to mode."
        !           140:   (interactive "*")
        !           141:   (save-excursion
        !           142:     (delete-region (point) (progn (skip-chars-backward " \t") (point)))
        !           143:     (indent-according-to-mode))
        !           144:   (insert ?\n)
        !           145:   (indent-according-to-mode))
        !           146: 
        !           147: (defun kill-forward-chars (arg)
        !           148:   (if (listp arg) (setq arg (car arg)))
        !           149:   (if (eq arg '-) (setq arg -1))
        !           150:   (kill-region (point) (+ (point) arg)))
        !           151: 
        !           152: (defun kill-backward-chars (arg)
        !           153:   (if (listp arg) (setq arg (car arg)))
        !           154:   (if (eq arg '-) (setq arg -1))
        !           155:   (kill-region (point) (- (point) arg)))
        !           156: 
        !           157: (defun backward-delete-char-untabify (arg &optional killp)
        !           158:   "Delete characters backward, changing tabs into spaces.
        !           159: Delete ARG chars, and kill (save in kill ring) if KILLP is non-nil.
        !           160: Interactively, ARG is the prefix arg (default 1)
        !           161: and KILLP is t if prefix arg is was specified."
        !           162:   (interactive "*p\nP")
        !           163:   (let ((count arg))
        !           164:     (save-excursion
        !           165:       (while (and (> count 0) (not (bobp)))
        !           166:        (if (= (preceding-char) ?\t)
        !           167:            (let ((col (current-column)))
        !           168:              (forward-char -1)
        !           169:              (setq col (- col (current-column)))
        !           170:              (insert (substring "        " 0 col))
        !           171:              (delete-char 1)))
        !           172:        (forward-char -1)
        !           173:        (setq count (1- count)))))
        !           174:   (delete-backward-char arg killp))
        !           175: 
        !           176: (defun zap-to-char (arg char)
        !           177:   "Kill up to (but not incl) ARG'th occurrence of CHAR.
        !           178: Goes backward if ARG is negative; goes to end of buffer if CHAR not found."
        !           179:   (interactive "*p\ncZap to char: ")
        !           180:   (kill-region (point) (if (search-forward (char-to-string char) nil t arg)
        !           181:                         (progn (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
        !           182:                                (point))
        !           183:                       (if (> arg 0) (point-max) (point-min)))))
        !           184: 
        !           185: (defun beginning-of-buffer (&optional arg)
        !           186:   "Move point to the beginning of the buffer; leave mark at previous position.
        !           187: With arg N, put point N/10 of the way from the true beginning.
        !           188: Avoid use in Lisp programs!
        !           189: \(goto-char (point-min)) is faster and does not set the mark."
        !           190:   (interactive "P")
        !           191:   (push-mark)
        !           192:   (goto-char (if arg
        !           193:                 (/ (+ 10 (* (buffer-size) (prefix-numeric-value arg))) 10)
        !           194:               (point-min)))
        !           195:   (if arg (forward-line 1)))
        !           196: 
        !           197: (defun end-of-buffer (&optional arg)
        !           198:   "Move point to the end of the buffer; leave mark at previous position.
        !           199: With arg N, put point N/10 of the way from the true end.
        !           200: Avoid use in Lisp programs!
        !           201: \(goto-char (point-max)) is faster and does not set the mark."
        !           202:   (interactive "P")
        !           203:   (push-mark)
        !           204:   (goto-char (if arg
        !           205:                 (- (1+ (buffer-size))
        !           206:                    (/ (* (buffer-size) (prefix-numeric-value arg)) 10))
        !           207:               (point-max)))
        !           208:   (if arg (forward-line 1)))
        !           209: 
        !           210: (defun mark-whole-buffer ()
        !           211:   "Put point at beginning and mark at end of buffer."
        !           212:   (interactive)
        !           213:   (push-mark (point))
        !           214:   (push-mark (point-max))
        !           215:   (goto-char (point-min)))
        !           216: 
        !           217: (defun count-lines-region (start end)
        !           218:   "Print number of lines in the region."
        !           219:   (interactive "r")
        !           220:   (message "Region has %d lines" (count-lines start end)))
        !           221: 
        !           222: (defun what-line ()
        !           223:   "Print the current line number (in the buffer) of point."
        !           224:   (interactive)
        !           225:   (save-restriction
        !           226:     (widen)
        !           227:     (save-excursion
        !           228:       (beginning-of-line)
        !           229:       (message "Line %d"
        !           230:               (1+ (count-lines 1 (point)))))))
        !           231: 
        !           232: (defun count-lines (start end)
        !           233:   "Return number of newlines between START and END."
        !           234:   (save-excursion
        !           235:     (save-restriction
        !           236:       (narrow-to-region start end)
        !           237:       (goto-char (point-min))
        !           238:       (- (buffer-size) (forward-line (buffer-size))))))
        !           239: 
        !           240: (defun what-cursor-position ()
        !           241:   "Print info on cursor position (on screen and within buffer)."
        !           242:   (interactive)
        !           243:   (let* ((char (following-char))
        !           244:         (beg (point-min))
        !           245:         (end (point-max))
        !           246:          (pos (point))
        !           247:         (total (buffer-size))
        !           248:         (percent (if (> total 50000)
        !           249:                      ;; Avoid overflow from multiplying by 100!
        !           250:                      (/ (+ (/ total 200) (1- pos)) (max (/ total 100) 1))
        !           251:                    (/ (+ (/ total 2) (* 100 (1- pos))) (max total 1))))
        !           252:         (hscroll (if (= (window-hscroll) 0)
        !           253:                      ""
        !           254:                    (format " Hscroll=%d" (window-hscroll))))
        !           255:         (col (current-column)))
        !           256:     (if (= pos end)
        !           257:        (if (or (/= beg 1) (/= end (1+ total)))
        !           258:            (message "point=%d of %d(%d%%) <%d - %d>  x=%d %s"
        !           259:                     pos total percent beg end col hscroll)
        !           260:          (message "point=%d of %d(%d%%)  x=%d %s"
        !           261:                   pos total percent col hscroll))
        !           262:       (if (or (/= beg 1) (/= end (1+ total)))
        !           263:          (message "Char: %s (0%o)  point=%d of %d(%d%%) <%d - %d>  x=%d %s"
        !           264:                   (single-key-description char) char pos total percent beg end col hscroll)
        !           265:        (message "Char: %s (0%o)  point=%d of %d(%d%%)  x=%d %s"
        !           266:                 (single-key-description char) char pos total percent col hscroll)))))
        !           267: 
        !           268: (defun fundamental-mode ()
        !           269:   "Major mode not specialized for anything in particular.
        !           270: Other major modes are defined by comparison with this one."
        !           271:   (interactive)
        !           272:   (kill-all-local-variables))
        !           273: 
        !           274: (put 'eval-expression 'disabled t)
        !           275: 
        !           276: ;; We define this, rather than making  eval  interactive,
        !           277: ;; for the sake of completion of names like eval-region, eval-current-buffer.
        !           278: (defun eval-expression (expression)
        !           279:   "Evaluate EXPRESSION and print value in minibuffer.
        !           280: Value is also consed on to front of variable  values  's value."
        !           281:   (interactive "xEval: ")
        !           282:   (setq values (cons (eval expression) values))
        !           283:   (prin1 (car values) t))
        !           284: 
        !           285: (defun edit-and-eval-command (prompt command)
        !           286:   "Prompting with PROMPT, let user edit COMMAND and eval result.
        !           287: COMMAND is a Lisp expression.  Let user edit that expression in
        !           288: the minibuffer, then read and evaluate the result."
        !           289:   (eval (read-minibuffer prompt
        !           290:                         (prin1-to-string command))))
        !           291: 
        !           292: (defvar repeat-complex-command-map (copy-alist minibuffer-local-map))
        !           293: (define-key repeat-complex-command-map "\ep" 'previous-complex-command)
        !           294: (define-key repeat-complex-command-map "\en" 'next-complex-command)
        !           295: (defun repeat-complex-command (arg)
        !           296:   "Edit and re-evaluate last complex command, or ARGth from last.
        !           297: A complex command is one which used the minibuffer.
        !           298: The command is placed in the minibuffer as a Lisp form for editing.
        !           299: The result is executed, repeating the command as changed.
        !           300: If the command has been changed or is not the most recent previous command
        !           301: it is added to the front of the command history.
        !           302: Whilst editing the command, the following commands are available:
        !           303: \\{repeat-complex-command-map}"
        !           304:   (interactive "p")
        !           305:   (let ((elt (nth (1- arg) command-history))
        !           306:        newcmd)
        !           307:     (if elt
        !           308:        (progn
        !           309:          (setq newcmd (read-from-minibuffer "Redo: "
        !           310:                                             (prin1-to-string elt)
        !           311:                                             repeat-complex-command-map
        !           312:                                             t))
        !           313:          ;; If command to be redone does not match front of history,
        !           314:          ;; add it to the history.
        !           315:          (or (equal newcmd (car command-history))
        !           316:              (setq command-history (cons newcmd command-history)))
        !           317:          (eval newcmd))
        !           318:       (ding))))
        !           319: 
        !           320: (defun next-complex-command (n)
        !           321:   "Inserts the next element of  command-history into the minibuffer"
        !           322:   (interactive "p")
        !           323:   (setq arg (- arg n))
        !           324:   (cond ((< arg 1)
        !           325:         (message "No following item in command history")
        !           326:         (sit-for 2)
        !           327:         (setq arg 1))
        !           328:        ((> arg (1- (length command-history)))
        !           329:         (message "No preceeding item command history")
        !           330:         (sit-for 2)
        !           331:         (setq arg (1- (length command-history)))))
        !           332:   (erase-buffer)
        !           333:   (insert (prin1-to-string (nth (1- arg) command-history)))
        !           334:   (goto-char (point-min)))
        !           335: 
        !           336: (defun previous-complex-command (n)
        !           337:   "Inserts the previous element of  command-history into the minibuffer"
        !           338:   (interactive "p")
        !           339:   (next-complex-command (- n)))
        !           340: 
        !           341: (defun goto-line (arg)
        !           342:   "Goto line ARG, counting from line 1 at beginning of buffer.
        !           343: Reads ARG using the minibuffer."
        !           344:   (interactive (list (if current-prefix-arg
        !           345:                         (prefix-numeric-value current-prefix-arg)
        !           346:                       (read-minibuffer "Goto line: "))))
        !           347:   (save-restriction
        !           348:     (widen)
        !           349:     (goto-char 1)
        !           350:     (forward-line (1- arg))))
        !           351: 
        !           352: ;Put this on C-x u, so we can force that rather than C-_ into startup msg
        !           353: (fset 'advertised-undo 'undo)
        !           354: 
        !           355: (defun undo (&optional arg)
        !           356:   "Undo some previous changes.
        !           357: Repeat this command to undo more changes.
        !           358: A numeric argument serves as a repeat count."
        !           359:   (interactive "*p")
        !           360:   (message "Undo!")
        !           361:   (or (eq last-command 'undo)
        !           362:       (progn
        !           363:        (undo-start)
        !           364:        (undo-more 1)))
        !           365:   (setq this-command 'undo)
        !           366:   (undo-more (or arg 1)))
        !           367: 
        !           368: (defun shell-command (command &optional flag)
        !           369:   "Execute string COMMAND in inferior shell; display output, if any.
        !           370: Optional second arg non-nil (prefix arg, if interactive)
        !           371: means insert output in current buffer after point (leave mark after it)."
        !           372:   (interactive "sShell command: \nP")
        !           373:   (if flag
        !           374:       (progn (barf-if-buffer-read-only)
        !           375:             (push-mark)
        !           376:             (call-process shell-file-name nil t nil
        !           377:                           "-c" command)
        !           378:             (exchange-point-and-mark))
        !           379:     (shell-command-on-region (point) (point) command nil)))
        !           380: 
        !           381: (defun shell-command-on-region (start end command &optional flag interactive)
        !           382:   "Execute string COMMAND in inferior shell with region as input.
        !           383: Normally display output (if any) in temp buffer;
        !           384: Prefix arg means replace the region with it.
        !           385: Noninteractive args are START, END, COMMAND, FLAG.
        !           386: Noninteractively FLAG means insert output in place of text from START to END,
        !           387: and put point at the end, but don't alter the mark."
        !           388:   (interactive "r\nsShell command on region: \nP\np")
        !           389:   (if flag
        !           390:       ;; Replace specified region with output from command.
        !           391:       (let ((swap (and interactive (< (point) (mark)))))
        !           392:        ;; Don't muck with mark
        !           393:        ;; unless called interactively.
        !           394:        (and interactive (push-mark))
        !           395:        (call-process-region start end shell-file-name t t nil
        !           396:                             "-c" command)
        !           397:        (and interactive swap (exchange-point-and-mark)))
        !           398:     (let ((buffer (get-buffer-create "*Shell Command Output*")))
        !           399:       (save-excursion
        !           400:        (set-buffer buffer)
        !           401:        (erase-buffer))
        !           402:       (if (eq buffer (current-buffer))
        !           403:          (setq start 1 end 1))
        !           404:       (call-process-region start end shell-file-name
        !           405:                           nil buffer nil
        !           406:                           "-c" command)
        !           407:       (if (save-excursion
        !           408:            (set-buffer buffer)
        !           409:            (> (buffer-size) 0))
        !           410:          (set-window-start (display-buffer buffer) 1)
        !           411:        (message "(Shell command completed with no output)")))))
        !           412: 
        !           413: (defun universal-argument ()
        !           414:   "Begin a numeric argument for the following command.
        !           415: Digits or minus sign following this command make up the numeric argument.
        !           416: If no digits or minus sign follow, this command by itself provides 4 as argument.
        !           417: Used more than once, this command multiplies the argument by 4 each time."
        !           418:   (interactive nil)
        !           419:   (let ((c-u 4) (argstartchar last-command-char)
        !           420:        char)
        !           421: ;   (describe-arg (list c-u) 1)
        !           422:     (setq char (read-char))
        !           423:     (while (= char argstartchar)
        !           424:       (setq c-u (* 4 c-u))
        !           425: ;     (describe-arg (list c-u) 1)
        !           426:       (setq char (read-char)))
        !           427:     (prefix-arg-internal char c-u nil)))
        !           428: 
        !           429: (defun prefix-arg-internal (char c-u value)
        !           430:   (let ((sign 1))
        !           431:     (if (and (numberp value) (< value 0))
        !           432:        (setq sign -1 value (- value)))
        !           433:     (if (eq value '-)
        !           434:        (setq sign -1 value nil))
        !           435: ;   (describe-arg value sign)
        !           436:     (while (= ?- char)
        !           437:       (setq sign (- sign) c-u nil)
        !           438: ;     (describe-arg value sign)
        !           439:       (setq char (read-char)))
        !           440:     (while (and (>= char ?0) (<= char ?9))
        !           441:       (setq value (+ (* (if (numberp value) value 0) 10) (- char ?0)) c-u nil)
        !           442: ;     (describe-arg value sign)
        !           443:       (setq char (read-char)))
        !           444:     (setq prefix-arg
        !           445:          (cond (c-u (list c-u))
        !           446:                ((numberp value) (* value sign))
        !           447:                ((= sign -1) '-)))
        !           448:     (setq unread-command-char char)))
        !           449: 
        !           450: ;(defun describe-arg (value sign)
        !           451: ; (cond ((numberp value)
        !           452: ;       (message "Arg: %d" (* value sign)))
        !           453: ;      ((consp value)
        !           454: ;       (message "Arg: C-u factor %d" (car value)))
        !           455: ;      ((< sign 0)
        !           456: ;       (message "Arg: -"))))
        !           457: 
        !           458: (defun digit-argument (arg)
        !           459:   "Part of the numeric argument for the next command."
        !           460:   (interactive "P")
        !           461:   (prefix-arg-internal last-command-char nil arg))
        !           462: 
        !           463: (defun negative-argument (arg)
        !           464:   "Begin a negative numeric argument for the next command."
        !           465:   (interactive "P")
        !           466:   (digit-argument arg))
        !           467: 
        !           468: (defun forward-to-indentation (arg)
        !           469:   "Move forward ARG lines and position at first nonblank character."
        !           470:   (interactive "p")
        !           471:   (forward-line arg)
        !           472:   (skip-chars-forward " \t"))
        !           473: 
        !           474: (defun backward-to-indentation (arg)
        !           475:   "Move backward ARG lines and position at first nonblank character."
        !           476:   (interactive "p")
        !           477:   (forward-line (- arg))
        !           478:   (skip-chars-forward " \t"))
        !           479: 
        !           480: (defun kill-line (&optional arg)
        !           481:   "Kill the rest of the current line; before a newline, kill the newline.
        !           482: With prefix argument, kill that many lines from point.
        !           483: Negative arguments kill lines backward.
        !           484: 
        !           485: When calling from a program, nil means \"no arg\",
        !           486: a number counts as a prefix arg."
        !           487:   (interactive "*P")
        !           488:   (kill-region (point)
        !           489:               (if arg
        !           490:                   (progn (setq arg (prefix-numeric-value arg))
        !           491:                          (scan-buffer (point) (if (> arg 0) arg (- arg 1))
        !           492:                                       ?\n))
        !           493:                 (if (eobp)
        !           494:                     (signal 'end-of-buffer nil))
        !           495:                 (if (looking-at "[ \t]*$")
        !           496:                     (forward-line 1)
        !           497:                   (end-of-line))
        !           498:                 (point))))
        !           499: 
        !           500: ;;;; The kill ring
        !           501: 
        !           502: (defvar kill-ring nil
        !           503:   "List of killed text sequences.")
        !           504: 
        !           505: (defconst kill-ring-max 30
        !           506:   "*Maximum length of kill ring before oldest elements are thrown away.")
        !           507: 
        !           508: (defvar kill-ring-yank-pointer nil
        !           509:   "The tail of the kill ring whose car is the last thing yanked.")
        !           510: 
        !           511: (defun kill-append (string before-p)
        !           512:   (setcar kill-ring
        !           513:          (if before-p
        !           514:              (concat string (car kill-ring))
        !           515:              (concat (car kill-ring) string))))
        !           516: 
        !           517: (defun kill-region (beg end)
        !           518:   "Kill between point and mark.
        !           519: The text is deleted but saved in the kill ring.
        !           520: The command \\[yank] can retrieve it from there.
        !           521: /(If you want to kill and then yank immediately, use \\[copy-region-as-kill].)
        !           522: 
        !           523: This is the primitive for programs to kill text (as opposed to deleting it).
        !           524: Supply two arguments, character numbers indicating the stretch of text
        !           525:  to be killed.
        !           526: Any command that calls this function is a \"kill command\".
        !           527: If the previous command was also a kill command,
        !           528: the text killed this time appends to the text killed last time
        !           529: to make one entry in the kill ring."
        !           530:   (interactive "*r")
        !           531:   (copy-region-as-kill beg end)
        !           532:   (delete-region beg end))
        !           533: 
        !           534: (fset 'kill-ring-save 'copy-region-as-kill)
        !           535: 
        !           536: (defun copy-region-as-kill (beg end)
        !           537:   "Save the region as if killed, but don't kill it."
        !           538:   (interactive "r")
        !           539:   (if (eq last-command 'kill-region)
        !           540:       (kill-append (buffer-substring beg end) (< end beg))
        !           541:     (setq kill-ring (cons (buffer-substring beg end) kill-ring))
        !           542:     (if (> (length kill-ring) kill-ring-max)
        !           543:        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
        !           544:   (setq this-command 'kill-region)
        !           545:   (setq kill-ring-yank-pointer kill-ring))
        !           546: 
        !           547: (defun append-next-kill ()
        !           548:   "Cause following command, if kill, to append to previous kill."
        !           549:   (interactive)
        !           550:   (setq this-command 'kill-region))
        !           551: 
        !           552: (defun rotate-yank-pointer (arg)
        !           553:   "Rotate the yanking point in the kill ring."
        !           554:   (interactive "p")
        !           555:   (let ((length (length kill-ring)))
        !           556:     (if (zerop length)
        !           557:        (error "Kill ring is empty")
        !           558:       (setq kill-ring-yank-pointer
        !           559:            (nthcdr (% (+ arg (- length (length kill-ring-yank-pointer)))
        !           560:                       length)
        !           561:                    kill-ring)))))
        !           562: 
        !           563: (defun yank-pop (arg)
        !           564:   "Replace just-yanked stretch of killed-text with a different stretch.
        !           565: This command is allowed only immediately after a  yank  or a  yank-pop.
        !           566: At such a time, the region contains a stretch of reinserted
        !           567: previously-killed text.  yank-pop  deletes that text and inserts in its
        !           568: place a different stretch of killed text.
        !           569: 
        !           570: With no argument, the previous kill is inserted.
        !           571: With argument n, the n'th previous kill is inserted.
        !           572: If n is negative, this is a more recent kill.
        !           573: 
        !           574: The sequence of kills wraps around, so that after the oldest one
        !           575: comes the newest one."
        !           576:   (interactive "*p")
        !           577:   (if (not (eq last-command 'yank))
        !           578:       (error "Previous command was not a yank"))
        !           579:   (setq this-command 'yank)
        !           580:   (let ((before (< (point) (mark))))
        !           581:     (delete-region (point) (mark))
        !           582:     (rotate-yank-pointer arg)
        !           583:     (set-mark (point))
        !           584:     (insert (car kill-ring-yank-pointer))
        !           585:     (if before (exchange-point-and-mark))))
        !           586: 
        !           587: (defun yank (&optional arg)
        !           588:   "Reinsert the last stretch of killed text.
        !           589: More precisely, reinsert the stretch of killed text most recently
        !           590: killed OR yanked.
        !           591: With just C-U as argument, same but put point in front (and mark at end).
        !           592: With argument n, reinsert the nth most recently killed stretch of killed
        !           593: text.
        !           594: See also the command \\[yank-pop]."
        !           595:   (interactive "*P")
        !           596:   (rotate-yank-pointer (if (listp arg) 0
        !           597:                         (if (eq arg '-) -1
        !           598:                           (1- arg))))
        !           599:   (push-mark (point))
        !           600:   (insert (car kill-ring-yank-pointer))
        !           601:   (if (consp arg)
        !           602:       (exchange-point-and-mark)))
        !           603: 
        !           604: (defun insert-buffer (buffer)
        !           605:   "Insert after point the contents of BUFFER.
        !           606: Puts mark after the inserted text.
        !           607: BUFFER may be a buffer or a buffer name."
        !           608:   (interactive "*bInsert buffer: ")
        !           609:   (or (bufferp buffer)
        !           610:       (setq buffer (get-buffer buffer)))
        !           611:   (let (start end newmark)
        !           612:     (save-excursion
        !           613:       (save-excursion
        !           614:        (set-buffer buffer)
        !           615:        (setq start (point-min) end (point-max)))
        !           616:       (insert-buffer-substring buffer start end)
        !           617:       (setq newmark (point)))
        !           618:     (push-mark newmark)))
        !           619: 
        !           620: (defun append-to-buffer (buffer start end)
        !           621:   "Append to specified buffer the text of the region.
        !           622: It is inserted into that buffer before its point.
        !           623: 
        !           624: When calling from a program, give three arguments:
        !           625: a buffer or the name of one, and two character numbers
        !           626: specifying the portion of the current buffer to be copied."
        !           627:   (interactive "BAppend to buffer: \nr")
        !           628:   (let ((oldbuf (current-buffer)))
        !           629:     (save-excursion
        !           630:       (set-buffer (get-buffer-create buffer))
        !           631:       (insert-buffer-substring oldbuf start end))))
        !           632: 
        !           633: (defun prepend-to-buffer (buffer start end)
        !           634:   "Prepend to specified buffer the text of the region.
        !           635: It is inserted into that buffer after its point.
        !           636: 
        !           637: When calling from a program, give three arguments:
        !           638: a buffer or the name of one, and two character numbers
        !           639: specifying the portion of the current buffer to be copied."
        !           640:   (interactive "BPrepend to buffer: \nr")
        !           641:   (let ((oldbuf (current-buffer)))
        !           642:     (save-excursion
        !           643:       (set-buffer (get-buffer-create buffer))
        !           644:       (save-excursion
        !           645:        (insert-buffer-substring oldbuf start end)))))
        !           646: 
        !           647: (defun copy-to-buffer (buffer start end)
        !           648:   "Copy to specified buffer the text of the region.
        !           649: It is inserted into that buffer, replacing existing text there.
        !           650: 
        !           651: When calling from a program, give three arguments:
        !           652: a buffer or the name of one, and two character numbers
        !           653: specifying the portion of the current buffer to be copied."
        !           654:   (interactive "BCopy to buffer: \nr")
        !           655:   (let ((oldbuf (current-buffer)))
        !           656:     (save-excursion
        !           657:       (set-buffer (get-buffer-create buffer))
        !           658:       (erase-buffer)
        !           659:       (save-excursion
        !           660:        (insert-buffer-substring oldbuf start end)))))
        !           661: 
        !           662: (defvar mark-ring nil
        !           663:   "The list of saved former marks of the current buffer,
        !           664: most recent first.")
        !           665: 
        !           666: (make-variable-buffer-local 'mark-ring)
        !           667: 
        !           668: (defconst mark-ring-max 16
        !           669:   "*Maximum size of mark ring.  Start discarding off end if gets this big.")
        !           670: 
        !           671: (defun set-mark-command (arg)
        !           672:   "Set mark at where point is, or jump to mark.
        !           673: With no prefix argument, set mark, and push previous mark on mark ring.
        !           674: With argument, jump to mark, and pop into mark off the mark ring."
        !           675:   (interactive "P")
        !           676:   (if arg
        !           677:       (progn
        !           678:        (if (null (mark))
        !           679:            (error "No mark set in this buffer")
        !           680:          (goto-char (mark))
        !           681:          (pop-mark)))
        !           682:     (push-mark)))
        !           683: 
        !           684: (defun push-mark (&optional location)
        !           685:   "Set mark at location (point, by default) and push old mark on mark ring."
        !           686:   (if (null (mark))
        !           687:       nil
        !           688:     (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
        !           689:     (if (> (length mark-ring) mark-ring-max)
        !           690:        (progn
        !           691:          (move-marker (car (nthcdr mark-ring-max mark-ring)) nil)
        !           692:          (setcdr (nthcdr (1- mark-ring-max) mark-ring) nil))))
        !           693:   (set-mark (or location (point)))
        !           694:   (if (null executing-macro) (message "Mark set")))
        !           695: 
        !           696: (defun pop-mark ()
        !           697:   "Pop off mark ring into the buffer's actual mark.
        !           698: Does not set point.  Does nothing if mark ring is empty."
        !           699:   (if mark-ring
        !           700:       (progn
        !           701:        (setq mark-ring (nconc mark-ring (list (copy-marker (mark-marker)))))
        !           702:        (set-mark (+ 0 (car mark-ring)))
        !           703:        (move-marker (car mark-ring) nil)
        !           704:        (if (null (mark)) (ding))
        !           705:        (setq mark-ring (cdr mark-ring)))))
        !           706: 
        !           707: (fset 'exchange-dot-and-mark 'exchange-point-and-mark)
        !           708: (defun exchange-point-and-mark ()
        !           709:   "Put the mark where point is now, and point where the mark is now."
        !           710:   (interactive nil)
        !           711:   (let ((omark (mark)))
        !           712:     (if (null omark)
        !           713:        (error "No mark set in this buffer"))
        !           714:     (set-mark (point))
        !           715:     (goto-char omark)
        !           716:     nil))
        !           717: 
        !           718: (defun next-line (arg)
        !           719:   "Move cursor vertically down ARG lines.
        !           720: If there is no character in the target line exactly under the current column,
        !           721: the cursor is positioned after the character in that line which spans this
        !           722: column, or at the end of the line if it is not long enough.
        !           723: If there is no line in the buffer after this one,
        !           724: a newline character is inserted to create a line
        !           725: and the cursor moves to that line.
        !           726: 
        !           727: The command \\[set-goal-column] can be used to create
        !           728: a semipermanent goal column to which this command always moves.
        !           729: Then it does not try to move vertically."
        !           730:   (interactive "p")
        !           731:   (if (= arg 1)
        !           732:       (let ((tem (scan-buffer (point) 1 ?\n)))
        !           733:        (if (or (= tem (point))
        !           734:                (not (eq (char-after (1- tem)) ?\n)))
        !           735:            (progn
        !           736:              (goto-char tem)
        !           737:              (insert ?\n)
        !           738:              (goto-char (1+ tem)))
        !           739:          (line-move arg)))
        !           740:     (line-move arg))
        !           741:   nil)
        !           742: 
        !           743: (defun previous-line (arg)
        !           744:   "Move cursor vertically up ARG lines.
        !           745: If there is no character in the target line exactly under the current column,
        !           746: the cursor is positioned after the character in that line which spans this
        !           747: column, or at the end of the line if it is not long enough.
        !           748: 
        !           749: The command \\[set-goal-column] can be used to create
        !           750: a semipermanent goal column to which this command always moves.
        !           751: Then it does not try to move vertically."
        !           752:   (interactive "p")
        !           753:   (line-move (- arg))
        !           754:   nil)
        !           755: 
        !           756: (defconst track-eol nil
        !           757:   "*Non-nil means vertical motion starting at the end of a line should keep to ends of lines.
        !           758: This means moving to the end of each line moved onto.")
        !           759: 
        !           760: (defvar goal-column nil
        !           761:   "*Semipermanent goal column for vertical motion, as set by \\[set-goal-column], or nil.")
        !           762: 
        !           763: (defvar temporary-goal-column 0
        !           764:   "Current goal column for vertical motion.
        !           765: It is the column where point was at the start of current run of vertical motion commands.")
        !           766: 
        !           767: (defun line-move (arg)
        !           768:   (if (not (or (eq last-command 'next-line)
        !           769:               (eq last-command 'previous-line)))
        !           770:       (setq temporary-goal-column
        !           771:            (if (and track-eol (eolp))
        !           772:                9999
        !           773:              (current-column))))
        !           774:   (if (not (integerp selective-display))
        !           775:       (forward-line arg)
        !           776:     ;; Move by arg lines, but ignore invisible ones.
        !           777:     (while (> arg 0)
        !           778:       (vertical-motion 1)
        !           779:       (forward-char -1)
        !           780:       (forward-line 1)
        !           781:       (setq arg (1- arg)))
        !           782:     (while (< arg 0)
        !           783:       (vertical-motion -1)
        !           784:       (beginning-of-line)
        !           785:       (setq arg (1+ arg))))
        !           786:   (move-to-column (or goal-column temporary-goal-column))
        !           787:   nil)
        !           788: 
        !           789: 
        !           790: (defun set-goal-column (arg)
        !           791:   "Set the current horizontal position as a goal for \\[next-line] and \\[previous-line].
        !           792: Those commands will move to this position in the line moved to
        !           793: rather than trying to keep the same horizontal position.
        !           794: With a non-nil argument, clears out the goal column
        !           795: so that \\[next-line] and \\[previous-line] resume vertical motion."
        !           796:   (interactive "P")
        !           797:   (if arg
        !           798:       (progn
        !           799:         (setq goal-column nil)
        !           800:         (message "No goal column"))
        !           801:     (setq goal-column (current-column))
        !           802:     (message (substitute-command-keys
        !           803:              "Goal column %d (use \\[set-goal-column] with an arg to unset it)")
        !           804:             goal-column))
        !           805:   nil)
        !           806: 
        !           807: (defun transpose-chars (arg)
        !           808:   "Interchange characters around point, moving forward one character.
        !           809: With prefix arg ARG, effect is to take character before point
        !           810: and drag it forward past ARG other characters (backward if ARG negative).
        !           811: If no argument and at end of line, the previous two chars are exchanged."
        !           812:   (interactive "*P")
        !           813:   (and (null arg) (eolp) (forward-char -1))
        !           814:   (transpose-subr 'forward-char (prefix-numeric-value arg)))
        !           815: 
        !           816: (defun transpose-words (arg)
        !           817:   "Interchange words around point, leaving point at end of them.
        !           818: With prefix arg ARG, effect is to take word before or around point
        !           819: and drag it forward past ARG other words (backward if ARG negative).
        !           820: If ARG is zero, the words around or after point and around or after mark
        !           821: are interchanged."
        !           822:   (interactive "*p")
        !           823:   (transpose-subr 'forward-word arg))
        !           824: 
        !           825: (defun transpose-sexps (arg)
        !           826:   "Like \\[transpose-words] but applies to sexps.
        !           827: Does not work on a sexp that point is in the middle of
        !           828: if it is a list or string."
        !           829:   (interactive "*p")
        !           830:   (transpose-subr 'forward-sexp arg))
        !           831: 
        !           832: (defun transpose-lines (arg)
        !           833:   "Exchange current line and previous line, leaving point after both.
        !           834: With argument ARG, takes previous line and moves it past ARG lines.
        !           835: With argument 0, interchanges line point is in with line mark is in."
        !           836:   (interactive "*p")
        !           837:   (transpose-subr (function
        !           838:                   (lambda (arg)
        !           839:                     (if (= arg 1)
        !           840:                         (progn
        !           841:                           ;; Move forward over a line,
        !           842:                           ;; but create a newline if none exists yet.
        !           843:                           (end-of-line)
        !           844:                           (if (eobp)
        !           845:                               (newline)
        !           846:                             (forward-char 1)))
        !           847:                       (forward-line arg))))
        !           848:                  arg))
        !           849: 
        !           850: (defun transpose-subr (mover arg)
        !           851:   (let (start1 end1 start2 end2)
        !           852:     (if (= arg 0)
        !           853:        (progn
        !           854:          (save-excursion
        !           855:            (funcall mover 1)
        !           856:            (setq end2 (point))
        !           857:            (funcall mover -1)
        !           858:            (setq start2 (point))
        !           859:            (goto-char (mark))
        !           860:            (funcall mover 1)
        !           861:            (setq end1 (point))
        !           862:            (funcall mover -1)
        !           863:            (setq start1 (point))
        !           864:            (transpose-subr-1))
        !           865:          (exchange-point-and-mark)))
        !           866:     (while (> arg 0)
        !           867:       (funcall mover -1)
        !           868:       (setq start1 (point))
        !           869:       (funcall mover 1)
        !           870:       (setq end1 (point))
        !           871:       (funcall mover 1)
        !           872:       (setq end2 (point))
        !           873:       (funcall mover -1)
        !           874:       (setq start2 (point))
        !           875:       (transpose-subr-1)
        !           876:       (goto-char end2)
        !           877:       (setq arg (1- arg)))
        !           878:     (while (< arg 0)
        !           879:       (funcall mover -1)
        !           880:       (setq start2 (point))
        !           881:       (funcall mover -1)
        !           882:       (setq start1 (point))
        !           883:       (funcall mover 1)
        !           884:       (setq end1 (point))
        !           885:       (funcall mover 1)
        !           886:       (setq end2 (point))
        !           887:       (transpose-subr-1)
        !           888:       (setq arg (1+ arg)))))
        !           889: 
        !           890: (defun transpose-subr-1 ()
        !           891:   (let ((word1 (buffer-substring start1 end1))
        !           892:        (word2 (buffer-substring start2 end2)))
        !           893:     (delete-region start2 end2)
        !           894:     (goto-char start2)
        !           895:     (insert word1)
        !           896:     (goto-char (if (< start1 start2) start1
        !           897:                 (+ start1 (- (length word1) (length word2)))))
        !           898:     (delete-char (length word1))
        !           899:     (insert word2)))
        !           900: 
        !           901: (defconst comment-column 32
        !           902:   "*Column to indent right-margin comments to.")
        !           903: 
        !           904: (defconst comment-start nil
        !           905:   "*String to insert to start a new comment, or nil if no comment syntax defined.")
        !           906: 
        !           907: (defconst comment-start-skip nil
        !           908:   "*Regexp to match the start of a comment plus everything up to its body.")
        !           909: 
        !           910: (defconst comment-end ""
        !           911:   "*String to insert to end a new comment.
        !           912: Should be an empty string if comments are terminated by end-of-line.")
        !           913: 
        !           914: (defconst comment-indent-hook
        !           915:   '(lambda () comment-column)
        !           916:   "Function to compute desired indentation for a comment
        !           917: given the character number it starts at.")
        !           918: 
        !           919: (defun indent-for-comment ()
        !           920:   "Indent this line's comment to comment column, or insert an empty comment."
        !           921:   (interactive "*")
        !           922:   (beginning-of-line 1)
        !           923:   (if (null comment-start)
        !           924:       (error "No comment syntax defined")
        !           925:     (let* ((eolpos (save-excursion (end-of-line) (dot)))
        !           926:           cpos indent)
        !           927:       (if (re-search-forward comment-start-skip eolpos 'move)
        !           928:          (progn (setq cpos (dot-marker))
        !           929:                 (goto-char (match-beginning 0))))
        !           930:       (setq indent (funcall comment-indent-hook))
        !           931:       (delete-horizontal-space)
        !           932:       (indent-to indent)
        !           933:       (if cpos 
        !           934:          (progn (goto-char cpos)
        !           935:                 (set-marker cpos nil))
        !           936:        (insert comment-start)
        !           937:        (save-excursion
        !           938:          (insert comment-end))))))
        !           939: 
        !           940: (defun set-comment-column (arg)
        !           941:   "Set the comment column based on point.
        !           942: With no arg, set the comment column to the current column.
        !           943: With just minus as arg, kill any comment on this line.
        !           944: With any other arg, set comment column to indentation of the previous comment
        !           945:  and then align or create a comment on this line at that column."
        !           946:   (interactive "P")
        !           947:   (if (eq arg '-)
        !           948:       (kill-comment nil)
        !           949:     (if arg
        !           950:        (progn
        !           951:          (save-excursion
        !           952:            (beginning-of-line)
        !           953:            (re-search-backward comment-start-skip)
        !           954:            (beginning-of-line)
        !           955:            (re-search-forward comment-start-skip)
        !           956:            (goto-char (match-beginning 0))
        !           957:            (setq comment-column (current-column))
        !           958:            (message "Comment column set to %d" comment-column))
        !           959:          (indent-for-comment))
        !           960:       (setq comment-column (current-column))
        !           961:       (message "Comment column set to %d" comment-column))))
        !           962: 
        !           963: (defun kill-comment (arg)
        !           964:   "Kill the comment on this line, if any.
        !           965: With argument, kill comments on that many lines starting with this one."
        !           966:   (interactive "P")
        !           967:   (barf-if-buffer-read-only)
        !           968:   (let ((count (prefix-numeric-value arg)))
        !           969:     (while (> count 0)
        !           970:       (save-excursion
        !           971:        (end-of-line)
        !           972:        (let ((eolpos (point)))
        !           973:          (beginning-of-line)
        !           974:          (if (re-search-forward comment-start-skip eolpos t)
        !           975:              (progn
        !           976:                (goto-char (match-beginning 0))
        !           977:                (skip-chars-backward " \t")
        !           978:                (kill-region (point) eolpos)))))
        !           979:       (if arg
        !           980:          (forward-line 1))
        !           981:       (setq count (1- count)))))
        !           982: 
        !           983: (defun backward-word (arg)
        !           984:   "Move backward until encountering the end of a word.
        !           985: With argument, do this that many times.
        !           986: In programs, it is faster to call forward-word with negative arg."
        !           987:   (interactive "p")
        !           988:   (forward-word (- arg)))
        !           989: 
        !           990: (defun mark-word (arg)
        !           991:   "Set mark arg words away from point."
        !           992:   (interactive "p")
        !           993:   (push-mark
        !           994:     (save-excursion
        !           995:       (forward-word arg)
        !           996:       (point))))
        !           997: 
        !           998: (defun kill-word (arg)
        !           999:   "Kill characters forward until encountering the end of a word.
        !          1000: With argument, do this that many times."
        !          1001:   (interactive "*p")
        !          1002:   (kill-region (point) (progn (forward-word arg) (point))))
        !          1003: 
        !          1004: (defun backward-kill-word (arg)
        !          1005:   "Kill characters backward until encountering the end of a word.
        !          1006: With argument, do this that many times."
        !          1007:   (interactive "*p")
        !          1008:   (kill-word (- arg)))
        !          1009: 
        !          1010: (defconst fill-prefix nil
        !          1011:   "String for auto-fill to insert at front of new line, or nil for none.")
        !          1012: 
        !          1013: (defun do-auto-fill ()
        !          1014:   (let ((opoint (point)))
        !          1015:     (save-excursion
        !          1016:       (move-to-column (1+ fill-column))
        !          1017:       (skip-chars-backward "^ \t\n")
        !          1018:       (if (bolp)
        !          1019:          (re-search-forward "[ \t]" opoint t))
        !          1020:       ;; If there is a space on the line before fill-point,
        !          1021:       ;; and nonspaces precede it, break the line there.
        !          1022:       (if (save-excursion
        !          1023:            (skip-chars-backward " \t")
        !          1024:            (not (bolp)))
        !          1025:          (indent-new-comment-line)))))
        !          1026: 
        !          1027: (defconst comment-multi-line nil
        !          1028:   "*Non-nil means \\[indent-new-comment-line] should continue same comment
        !          1029: on new line, with no new terminator or starter.")
        !          1030: 
        !          1031: (defun indent-new-comment-line ()
        !          1032:   "Break line at point and indent, continuing comment if presently within one."
        !          1033:   (interactive "*")
        !          1034:   (let (comcol comstart)
        !          1035:     (skip-chars-backward " \t")
        !          1036:     (insert ?\n)
        !          1037:     (delete-region (point)
        !          1038:                   (progn (skip-chars-forward " \t")
        !          1039:                          (point)))
        !          1040:     (save-excursion
        !          1041:       (if (and comment-start
        !          1042:               (let ((opoint (point)))
        !          1043:                 (forward-line -1)
        !          1044:                 (re-search-forward comment-start-skip opoint t)))
        !          1045:          (progn
        !          1046:            (goto-char (match-beginning 0))
        !          1047:            (setq comcol (current-column))
        !          1048:            (setq comstart (buffer-substring (point) (match-end 0))))))
        !          1049:     (if comcol
        !          1050:        (let ((comment-column comcol)
        !          1051:              (comment-start comstart)
        !          1052:              (comment-end comment-end))
        !          1053:          (and comment-end (not (equal comment-end ""))
        !          1054:               (if (not comment-multi-line)
        !          1055:                   (progn
        !          1056:                     (forward-char -1)
        !          1057:                     (insert comment-end)
        !          1058:                     (forward-char 1))
        !          1059:                 (setq comment-column (+ comment-column (length comment-start))
        !          1060:                       comment-start "")))
        !          1061:          (if (not (eolp))
        !          1062:              (setq comment-end ""))
        !          1063:          (insert ?\n)
        !          1064:          (forward-char -1)
        !          1065:          (indent-for-comment)
        !          1066:          (delete-char 1))
        !          1067:       (if fill-prefix
        !          1068:          (insert fill-prefix)
        !          1069:        (indent-according-to-mode)))))
        !          1070: 
        !          1071: (defun auto-fill-mode (arg)
        !          1072:   "Toggle auto-fill mode.
        !          1073: With arg, turn auto-fill mode on iff arg is positive.
        !          1074: In auto-fill mode, inserting a space at a column beyond  fill-column
        !          1075: automatically breaks the line at a previous space."
        !          1076:   (interactive "P")
        !          1077:   (setq auto-fill-hook
        !          1078:        (and
        !          1079:          (if (null arg) (not auto-fill-hook)
        !          1080:            (> (prefix-numeric-value arg) 0))
        !          1081:          'do-auto-fill))
        !          1082:   (set-minor-mode 'auto-fill-mode "Fill" (not (null auto-fill-hook))))
        !          1083: 
        !          1084: (defun turn-on-auto-fill ()
        !          1085:   "Unconditionally turn on Auto Fill mode."
        !          1086:   (auto-fill-mode 1))
        !          1087: 
        !          1088: (defun set-minor-mode (function-symbol pretty-string on-state)
        !          1089:   "Set status of minor mode, for mode-line display.
        !          1090: FUNCTION-SYMBOL is the function that turns the mode on or off.
        !          1091: PRETTY-STRING is a string to show in the mode line.
        !          1092: ON-STATE is t if mode should be on, nil if it should be off.
        !          1093: Returns ON-STATE."
        !          1094:   (let ((tem (assq function-symbol minor-modes)))
        !          1095:     (if tem (setq minor-modes (delq tem minor-modes))))
        !          1096:   (if on-state
        !          1097:       (setq minor-modes
        !          1098:            (append minor-modes
        !          1099:                    (list (cons function-symbol pretty-string)))))
        !          1100:   ;; Cause mode-line redisplay.
        !          1101:   (set-buffer-modified-p (buffer-modified-p))
        !          1102:   on-state)
        !          1103: 
        !          1104: (defun set-fill-column (arg)
        !          1105:   "Set fill-column to current column, or to argument if given.
        !          1106: fill-column's value is separate for each buffer."
        !          1107:   (interactive "P")
        !          1108:   (setq fill-column (if (integerp arg) arg (current-column)))
        !          1109:   (message "fill-column set to %d" fill-column))
        !          1110: 
        !          1111: (defun set-selective-display (arg)
        !          1112:   "Set selective-display to ARG; clear it if no arg.
        !          1113: When selective-display is a number > 0,
        !          1114: lines whose indentation is >= selective-display are not displayed.
        !          1115: selective-display's value is separate for each buffer."
        !          1116:   (interactive "P")
        !          1117:   (if (eq selective-display t)
        !          1118:       (error "selective-display already in use for marked lines"))
        !          1119:   (setq selective-display
        !          1120:        (and arg (prefix-numeric-value arg)))
        !          1121:   (set-window-start (selected-window) (window-start (selected-window)))
        !          1122:   (princ "selective-display set to " t)
        !          1123:   (prin1 selective-display t)
        !          1124:   (princ "." t))
        !          1125: 
        !          1126: (defun overwrite-mode (arg)
        !          1127:   "Toggle overwrite mode.
        !          1128: With arg, turn overwrite mode on iff arg is positive.
        !          1129: In overwrite mode, printing characters typed in replace existing text
        !          1130: on a one-for-one basis, rather than pushing it to the right."
        !          1131:   (interactive "P")
        !          1132:   (setq overwrite-mode
        !          1133:        (if (null arg) (not overwrite-mode)
        !          1134:          (> (prefix-numeric-value arg) 0)))
        !          1135:   (set-minor-mode 'overwrite-mode "Overwrite" overwrite-mode))
        !          1136: 
        !          1137: (defconst blink-matching-paren t
        !          1138:   "*Non-nil means show matching open-paren when close-paren is inserted.")
        !          1139: 
        !          1140: (defconst blink-matching-paren-distance 4000
        !          1141:   "*If non-nil, is maximum distance to search for matching open-paren
        !          1142: when close-paren is inserted.")
        !          1143: 
        !          1144: (defun blink-matching-open ()
        !          1145:   "Move cursor momentarily to the beginning of the sexp before point."
        !          1146:   (and (> (point) (1+ (point-min)))
        !          1147:        (/= (char-syntax (char-after (- (point) 2))) ?\\ )
        !          1148:        blink-matching-paren
        !          1149:        (let* ((oldpos (point))
        !          1150:              (blinkpos)
        !          1151:              (mismatch))
        !          1152:         (save-excursion
        !          1153:           (save-restriction
        !          1154:             (if blink-matching-paren-distance
        !          1155:                 (narrow-to-region (max (point-min)
        !          1156:                                        (- (point) blink-matching-paren-distance))
        !          1157:                                   oldpos))
        !          1158:             (condition-case ()
        !          1159:                 (setq blinkpos (scan-sexps oldpos -1))
        !          1160:               (error nil)))
        !          1161:           (and blinkpos (/= (char-syntax (char-after blinkpos))
        !          1162:                             ?\$)
        !          1163:                (setq mismatch
        !          1164:                      (/= last-input-char
        !          1165:                          (logand (lsh (aref (syntax-table)
        !          1166:                                             (char-after blinkpos))
        !          1167:                                       -8)
        !          1168:                                  ?\177))))
        !          1169:           (if mismatch (setq blinkpos nil))
        !          1170:           (if blinkpos
        !          1171:               (progn
        !          1172:                (goto-char blinkpos)
        !          1173:                (if (pos-visible-in-window-p)
        !          1174:                    (sit-for 1)
        !          1175:                  (goto-char blinkpos)
        !          1176:                  (message
        !          1177:                   "Matches %s"
        !          1178:                   (if (save-excursion
        !          1179:                         (skip-chars-backward " \t")
        !          1180:                         (not (bolp)))
        !          1181:                       (buffer-substring (progn (beginning-of-line) (point))
        !          1182:                                         (1+ blinkpos))
        !          1183:                     (buffer-substring blinkpos
        !          1184:                                       (progn
        !          1185:                                        (forward-char 1)
        !          1186:                                        (skip-chars-forward "\n \t")
        !          1187:                                        (end-of-line)
        !          1188:                                        (point)))))))
        !          1189:             (cond (mismatch
        !          1190:                    (message "Mismatched parentheses"))
        !          1191:                   ((not blink-matching-paren-distance)
        !          1192:                    (message "Unmatched parenthesis"))))))))
        !          1193: 
        !          1194: ;Turned off because it makes dbx bomb out.
        !          1195: (setq blink-paren-hook 'blink-matching-open)
        !          1196: 
        !          1197: ; this is just something for the luser to see in a keymap -- this is not
        !          1198: ;  how quitting works normally!
        !          1199: (defun keyboard-quit ()
        !          1200:   "Signal a  quit  condition."
        !          1201:   (interactive)
        !          1202:   (signal 'quit nil))
        !          1203: 
        !          1204: (define-key global-map "\C-g" 'keyboard-quit)
        !          1205: 
        !          1206: (defvar help-map (make-sparse-keymap)
        !          1207:   "Keymap for characters following the Help key.")
        !          1208: 
        !          1209: (define-key global-map "\C-h" 'help-command)
        !          1210: (fset 'help-command help-map)
        !          1211: 
        !          1212: (define-key help-map "\C-h" 'help-for-help)
        !          1213: (define-key help-map "?" 'help-for-help)
        !          1214: 
        !          1215: (define-key help-map "\C-c" 'describe-copying)
        !          1216: (define-key help-map "\C-d" 'describe-distribution)
        !          1217: (define-key help-map "\C-w" 'describe-no-warranty)
        !          1218: (define-key help-map "a" 'command-apropos)
        !          1219: 
        !          1220: (define-key help-map "b" 'describe-bindings)
        !          1221: 
        !          1222: (define-key help-map "c" 'describe-key-briefly)
        !          1223: (define-key help-map "k" 'describe-key)
        !          1224: 
        !          1225: (define-key help-map "d" 'describe-function)
        !          1226: (define-key help-map "f" 'describe-function)
        !          1227: 
        !          1228: (define-key help-map "i" 'info)
        !          1229: 
        !          1230: (define-key help-map "l" 'view-lossage)
        !          1231: 
        !          1232: (define-key help-map "m" 'describe-mode)
        !          1233: 
        !          1234: (define-key help-map "\C-n" 'view-emacs-news)
        !          1235: (define-key help-map "n" 'view-emacs-news)
        !          1236: 
        !          1237: (define-key help-map "s" 'describe-syntax)
        !          1238: 
        !          1239: (define-key help-map "t" 'help-with-tutorial)
        !          1240: 
        !          1241: (define-key help-map "w" 'where-is)
        !          1242: 
        !          1243: (define-key help-map "v" 'describe-variable)
        !          1244: 
        !          1245: (defun help-with-tutorial ()
        !          1246:   "Select the Emacs learn-by-doing tutorial."
        !          1247:   (interactive)
        !          1248:   (let ((file (expand-file-name "~/TUTORIAL")))
        !          1249:     (delete-other-windows)
        !          1250:     (if (get-file-buffer file)
        !          1251:        (switch-to-buffer (get-file-buffer file))
        !          1252:       (switch-to-buffer (create-file-buffer "~/TUTORIAL"))
        !          1253:       (setq buffer-file-name file)
        !          1254:       (setq default-directory (expand-file-name "~/"))
        !          1255:       (setq auto-save-file-name nil)
        !          1256:       (insert-file-contents (expand-file-name "TUTORIAL" exec-directory))
        !          1257:       (goto-char (point-min))
        !          1258:       (search-forward "\n<<")
        !          1259:       (beginning-of-line)
        !          1260:       (delete-region (point) (progn (end-of-line) (point)))
        !          1261:       (newline (- (window-height (selected-window))
        !          1262:                  (count-lines (point-min) (point))
        !          1263:                  6))
        !          1264:       (goto-char (point-min))
        !          1265:       (set-buffer-modified-p nil))))
        !          1266: 
        !          1267: (defun describe-key-briefly (key)
        !          1268:   "Print the name of the function KEY invokes.  KEY is a string."
        !          1269:   (interactive "kDescribe key briefly: ")
        !          1270:   (let ((defn (key-binding key)))
        !          1271:     (if (or (null defn) (integerp defn))
        !          1272:         (message "%s is undefined" (key-description key))
        !          1273:       (message "%s runs the command %s"
        !          1274:               (key-description key)
        !          1275:               (if (symbolp defn) defn (prin1-to-string defn))))))
        !          1276: 
        !          1277: (defun describe-key (key)
        !          1278:   "Display documentation of the function KEY invokes.  KEY is a string."
        !          1279:   (interactive "kDescribe key: ")
        !          1280:   (let ((defn (key-binding key)))
        !          1281:     (if (or (null defn) (integerp defn))
        !          1282:         (message "%s is undefined" (key-description key))
        !          1283:       (with-output-to-temp-buffer "*Help*"
        !          1284:        (prin1 defn)
        !          1285:        (princ ":\n")
        !          1286:        (if (documentation defn)
        !          1287:            (princ (documentation defn))
        !          1288:          (princ "not documented"))))))
        !          1289: 
        !          1290: (defun describe-mode ()
        !          1291:   "Display documentation of current major mode."
        !          1292:   (interactive)
        !          1293:   (with-output-to-temp-buffer "*Help*"
        !          1294:     (princ mode-name)
        !          1295:     (princ " Mode:\n")
        !          1296:     (princ (documentation major-mode))))
        !          1297: 
        !          1298: (defun describe-distribution ()
        !          1299:   "Display info on how to obtain the latest version of GNU Emacs."
        !          1300:   (interactive)
        !          1301:   (find-file-read-only
        !          1302:    (expand-file-name "DISTRIB" exec-directory)))
        !          1303: 
        !          1304: (defun describe-copying ()
        !          1305:   "Display info on how you may redistribute copies of GNU Emacs."
        !          1306:   (interactive)
        !          1307:   (find-file-read-only
        !          1308:    (expand-file-name "COPYING" exec-directory))
        !          1309:   (goto-char (dot-min)))
        !          1310: 
        !          1311: (defun describe-no-warranty ()
        !          1312:   "Display info on all the kinds of warranty Emacs does NOT have."
        !          1313:   (interactive)
        !          1314:   (describe-copying)
        !          1315:   (let (case-fold-search)
        !          1316:     (search-forward "NO WARRANTY")
        !          1317:     (recenter 0)))
        !          1318: 
        !          1319: (defun view-emacs-news ()
        !          1320:   "Display info on recent changes to Emacs."
        !          1321:   (interactive)
        !          1322:   (find-file-read-only
        !          1323:    (expand-file-name "NEWS" exec-directory)))
        !          1324: 
        !          1325: (defun view-lossage ()
        !          1326:   "Display last 100 input keystrokes."
        !          1327:   (interactive)
        !          1328:   (with-output-to-temp-buffer "*Help*"
        !          1329:     (princ (key-description (recent-keys))))
        !          1330:   (save-excursion
        !          1331:     (set-buffer (get-buffer "*Help*"))
        !          1332:     (beginning-of-buffer)
        !          1333:     (while (progn (move-to-column 50) (not (eobp)))
        !          1334:       (search-forward " " nil t)
        !          1335:       (newline))))
        !          1336: 
        !          1337: (defun help-for-help ()
        !          1338:   "You have typed C-h, the help character.  Type a Help option:
        !          1339: 
        !          1340: A  command-apropos.   Give a substring, and see a list of commands
        !          1341:               (functions interactively callable) that contain
        !          1342:              that substring.  See also the  apropos  command.
        !          1343: B  describe-bindings.  Display table of all key bindings.
        !          1344: C  describe-key-briefly.  Type a command key sequence;
        !          1345:              it prints the function name that sequence runs.
        !          1346: F  describe-function.  Type a function name and get documentation of it.
        !          1347: I  info. The  info  documentation reader.
        !          1348: K  describe-key.  Type a command key sequence;
        !          1349:              it displays the full documentation.
        !          1350: L  view-lossage.  Shows last 100 characters you typed.
        !          1351: M  describe-mode.  Print documentation of current major mode,
        !          1352:              which describes the commands peculiar to it.
        !          1353: N  view-emacs-news.  Shows emacs news file.
        !          1354: S  describe-syntax.  Display contents of syntax table, plus explanations
        !          1355: T  help-with-tutorial.  Select the Emacs learn-by-doing tutorial.
        !          1356: V  describe-variable.  Type name of a variable;
        !          1357:              it displays the variable's documentation and value.
        !          1358: W  where-is.  Type command name; it prints which keystrokes
        !          1359:              invoke that command.
        !          1360: C-c print Emacs copying permission (General Public License).
        !          1361: C-d print Emacs ordering information.
        !          1362: C-n print news of recent Emacs changes.
        !          1363: C-w print information on absence of warrantee for GNU Emacs."
        !          1364:   (interactive)
        !          1365:   (message "A B C F I K L M N S T V W C-c C-d C-n C-w or C-h for more help: ")
        !          1366:   (let ((char (read-char)))
        !          1367:     (if (or (= char ?\C-h) (= char ??))
        !          1368:        (save-window-excursion
        !          1369:          (switch-to-buffer "*Help*")
        !          1370:          (erase-buffer)
        !          1371:          (insert (documentation 'help-for-help))
        !          1372:          (goto-char (point-min))
        !          1373:          (while (memq char '(?\C-h ?? ?\C-v ?\ ?\177 ?\M-v))
        !          1374:            (if (memq char '(?\C-v ?\ ))
        !          1375:                (scroll-up))
        !          1376:            (if (memq char '(?\177 ?\M-v))
        !          1377:                (scroll-down))
        !          1378:            (message
        !          1379:     "A B C F I K L M N S T V W C-c C-d C-n C-w or Space to scroll: ")
        !          1380:            (setq char (read-char)))))
        !          1381:     (let ((defn (cdr (assq (downcase char) (cdr help-map)))))
        !          1382:       (if defn (call-interactively defn) (ding)))))
        !          1383: 
        !          1384: (defun function-called-at-point ()
        !          1385:   (condition-case ()
        !          1386:       (save-excursion
        !          1387:        (save-restriction
        !          1388:          (narrow-to-region (max (point-min) (- (point) 1000)) (point-max))
        !          1389:          (backward-up-list 1)
        !          1390:          (forward-char 1)
        !          1391:          (let (obj)
        !          1392:            (setq obj (read (current-buffer)))
        !          1393:            (and (symbolp obj) (fboundp obj) obj))))
        !          1394:     (error nil)))
        !          1395: 
        !          1396: (defun describe-function (function)
        !          1397:   "Display the full documentation of FUNCTION (a symbol)."
        !          1398:   (interactive
        !          1399:    (let ((fn (function-called-at-point))
        !          1400:         (enable-recursive-minibuffers t)            
        !          1401:         val)
        !          1402:      (setq val (completing-read (if fn
        !          1403:                                    (format "Describe function (default %s): " fn)
        !          1404:                                  "Describe function: ")
        !          1405:                                obarray 'fboundp t))
        !          1406:      (list (if (equal val "")
        !          1407:               fn (intern val)))))
        !          1408:   (with-output-to-temp-buffer "*Help*"
        !          1409:     (prin1 function)
        !          1410:     (princ ":
        !          1411: ")
        !          1412:     (if (documentation function)
        !          1413:         (princ (documentation function))
        !          1414:       (princ "not documented")))
        !          1415:   nil)
        !          1416: 
        !          1417: (defun variable-at-point ()
        !          1418:   (save-excursion
        !          1419:     (forward-sexp -1)
        !          1420:     (skip-chars-forward "'")
        !          1421:     (let (obj)
        !          1422:       (condition-case ()
        !          1423:          (setq obj (read (current-buffer)))
        !          1424:        (error nil))
        !          1425:       (and (symbolp obj) (boundp obj) obj))))
        !          1426: 
        !          1427: (defun describe-variable (variable)
        !          1428:   "Display the full documentation of VARIABLE (a symbol)."
        !          1429:   (interactive 
        !          1430:    (let ((v (variable-at-point))
        !          1431:         (enable-recursive-minibuffers t)
        !          1432:         val)
        !          1433:      (setq val (completing-read (if v
        !          1434:                                    (format "Describe variable (default %s): " v)
        !          1435:                                  "Describe variable: ")
        !          1436:                                obarray 'boundp t))
        !          1437:      (list (if (equal val "")
        !          1438:               v (intern val)))))
        !          1439:   (with-output-to-temp-buffer "*Help*"
        !          1440:     (prin1 variable)
        !          1441:     (princ "'s value is ")
        !          1442:     (if (not (boundp variable))
        !          1443:         (princ "void.")
        !          1444:       (prin1 (symbol-value variable)))
        !          1445:     (terpri) (terpri)
        !          1446:     (princ "Documentation:")
        !          1447:     (terpri)
        !          1448:     (if (get variable 'variable-documentation)
        !          1449:         (princ (substitute-command-keys
        !          1450:                (get variable 'variable-documentation)))
        !          1451:       (princ "not documented as a variable.")))
        !          1452:   nil)
        !          1453: 
        !          1454: (defun command-apropos (string)
        !          1455:   "Like apropos but lists only symbols that are names of commands
        !          1456: \(interactively callable functions)."
        !          1457:   (interactive "sCommand apropos (regexp): ")
        !          1458:   (apropos string 'commandp))
        !          1459: 
        !          1460: (defun set-variable (var val)
        !          1461:   "Set VARIABLE to VALUE.  VALUE is a Lisp object.
        !          1462: When using this interactively, supply a Lisp expression for VALUE.
        !          1463: If you want VALUE to be a string, you must type doublequotes."
        !          1464:   (interactive
        !          1465:    (let* ((var (read-variable "Set variable: "))
        !          1466:          (minibuffer-help-form
        !          1467:           '(funcall myhelp))
        !          1468:          (myhelp
        !          1469:           (function
        !          1470:            (lambda ()
        !          1471:              (with-output-to-temp-buffer "*Help*"
        !          1472:                (prin1 var)
        !          1473:                (princ "\nDocumentation:\n")
        !          1474:                (princ (substring (get var 'variable-documentation)
        !          1475:                                  1))
        !          1476:                (if (boundp var)
        !          1477:                    (let ((print-length 20))
        !          1478:                      (princ "\n\nCurrent value: ")
        !          1479:                      (prin1 (symbol-value var))))
        !          1480:                nil)))))
        !          1481:      (list var
        !          1482:           (eval-minibuffer (format "Set %s to value: " var)))))
        !          1483:   (set var val))
        !          1484: 
        !          1485: ;These commands are defined in editfns.c
        !          1486: ;but they are not assigned to keys there.
        !          1487: (put 'narrow-to-region 'disabled t)
        !          1488: (define-key ctl-x-map "n" 'narrow-to-region)
        !          1489: (define-key ctl-x-map "w" 'widen)
        !          1490: 
        !          1491: (define-key global-map "\C-j" 'newline-and-indent)
        !          1492: (define-key global-map "\C-m" 'newline)
        !          1493: (define-key global-map "\C-o" 'open-line)
        !          1494: (define-key esc-map "\C-o" 'split-line)
        !          1495: (define-key global-map "\C-q" 'quoted-insert)
        !          1496: (define-key esc-map "^" 'delete-indentation)
        !          1497: (define-key esc-map "\\" 'delete-horizontal-space)
        !          1498: (define-key esc-map "m" 'back-to-indentation)
        !          1499: (define-key ctl-x-map "\C-o" 'delete-blank-lines)
        !          1500: (define-key esc-map " " 'just-one-space)
        !          1501: (define-key esc-map "z" 'zap-to-char)
        !          1502: (define-key esc-map "=" 'count-lines-region)
        !          1503: (define-key ctl-x-map "=" 'what-cursor-position)
        !          1504: (define-key esc-map "\e" 'eval-expression)
        !          1505: (define-key ctl-x-map "\e" 'repeat-complex-command)
        !          1506: (define-key ctl-x-map "u" 'advertised-undo)
        !          1507: (define-key global-map "\C-_" 'undo)
        !          1508: (define-key esc-map "!" 'shell-command)
        !          1509: (define-key esc-map "|" 'shell-command-on-region)
        !          1510: 
        !          1511: (define-key global-map "\C-u" 'universal-argument)
        !          1512: (let ((i ?0))
        !          1513:   (while (<= i ?9)
        !          1514:     (define-key esc-map (char-to-string i) 'digit-argument)
        !          1515:     (setq i (1+ i))))
        !          1516: (define-key esc-map "-" 'negative-argument)
        !          1517: 
        !          1518: (define-key global-map "\C-k" 'kill-line)
        !          1519: (define-key global-map "\C-w" 'kill-region)
        !          1520: (define-key esc-map "w" 'copy-region-as-kill)
        !          1521: (define-key esc-map "\C-w" 'append-next-kill)
        !          1522: (define-key global-map "\C-y" 'yank)
        !          1523: (define-key esc-map "y" 'yank-pop)
        !          1524: 
        !          1525: (define-key ctl-x-map "a" 'append-to-buffer)
        !          1526: 
        !          1527: (define-key global-map "\C-@" 'set-mark-command)
        !          1528: (define-key ctl-x-map "\C-x" 'exchange-point-and-mark)
        !          1529: 
        !          1530: (define-key global-map "\C-n" 'next-line)
        !          1531: (define-key global-map "\C-p" 'previous-line)
        !          1532: (define-key ctl-x-map "\C-n" 'set-goal-column)
        !          1533: 
        !          1534: (define-key global-map "\C-t" 'transpose-chars)
        !          1535: (define-key esc-map "t" 'transpose-words)
        !          1536: (define-key esc-map "\C-t" 'transpose-sexps)
        !          1537: (define-key ctl-x-map "\C-t" 'transpose-lines)
        !          1538: 
        !          1539: (define-key esc-map ";" 'indent-for-comment)
        !          1540: (define-key esc-map "j" 'indent-new-comment-line)
        !          1541: (define-key esc-map "\C-j" 'indent-new-comment-line)
        !          1542: (define-key ctl-x-map ";" 'set-comment-column)
        !          1543: (define-key ctl-x-map "f" 'set-fill-column)
        !          1544: (define-key ctl-x-map "$" 'set-selective-display)
        !          1545: 
        !          1546: (define-key esc-map "@" 'mark-word)
        !          1547: (define-key esc-map "f" 'forward-word)
        !          1548: (define-key esc-map "b" 'backward-word)
        !          1549: (define-key esc-map "d" 'kill-word)
        !          1550: (define-key esc-map "\177" 'backward-kill-word)
        !          1551: 
        !          1552: (define-key esc-map "<" 'beginning-of-buffer)
        !          1553: (define-key esc-map ">" 'end-of-buffer)
        !          1554: (define-key ctl-x-map "h" 'mark-whole-buffer)
        !          1555: (define-key esc-map "\\" 'delete-horizontal-space)
        !          1556: 
        !          1557: (fset 'mode-specific-command-prefix (make-sparse-keymap))
        !          1558: (define-key global-map "\C-c" 'mode-specific-command-prefix)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.