home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / emacs-18.59-bin.lha / lib / emacs / 18.59 / lisp / simple.el < prev    next >
Lisp/Scheme  |  1992-11-21  |  51KB  |  1,465 lines

  1. ;; Basic editing commands for Emacs
  2. ;; Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU Emacs.
  5.  
  6. ;; GNU Emacs is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation; either version 1, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU Emacs is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;; GNU General Public License for more details.
  15.  
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.  
  21. (defun open-line (arg)
  22.   "Insert a newline and leave point before it.
  23. With arg, inserts that many newlines."
  24.   (interactive "*p")
  25.   (let ((flag (and (bolp) (not (bobp)))))
  26.     (if flag (forward-char -1))
  27.     (while (> arg 0)
  28.       (insert ?\n)
  29.       (goto-char (1- (point)))
  30.       (setq arg (1- arg)))
  31.     (if flag (forward-char 1))))
  32.  
  33. (defun split-line ()
  34.   "Split current line, moving portion beyond point vertically down."
  35.   (interactive "*")
  36.   (skip-chars-forward " \t")
  37.   (let ((col (current-column))
  38.     (pos (point)))
  39.     (insert ?\n)
  40.     (indent-to col 0)
  41.     (goto-char pos)))
  42.  
  43. (defun quoted-insert (arg)
  44.   "Read next input character and insert it.
  45. Useful for inserting control characters.
  46. You may also type up to 3 octal digits, to insert a character with that code"
  47.   (interactive "*p")
  48.   (let ((char (read-quoted-char)))
  49.     (while (> arg 0)
  50.       (insert char)
  51.       (setq arg (1- arg)))))
  52.  
  53. (defun delete-indentation (&optional arg)
  54.   "Join this line to previous and fix up whitespace at join.
  55. With argument, join this line to following line."
  56.   (interactive "*P")
  57.   (beginning-of-line)
  58.   (if arg (forward-line 1))
  59.   (if (eq (preceding-char) ?\n)
  60.       (progn
  61.     (delete-region (point) (1- (point)))
  62.     (fixup-whitespace))))
  63.  
  64. (defun fixup-whitespace ()
  65.   "Fixup white space between objects around point.
  66. Leave one space or none, according to the context."
  67.   (interactive "*")
  68.   (save-excursion
  69.     (delete-horizontal-space)
  70.     (if (or (looking-at "^\\|\\s)\\|$")
  71.         (save-excursion (forward-char -1)
  72.                 (looking-at "\\s(\\|\\s'")))
  73.     nil
  74.       (insert ?\ ))))
  75.  
  76. (defun delete-horizontal-space ()
  77.   "Delete all spaces and tabs around point."
  78.   (interactive "*")
  79.   (skip-chars-backward " \t")
  80.   (delete-region (point) (progn (skip-chars-forward " \t") (point))))
  81.  
  82. (defun just-one-space ()
  83.   "Delete all spaces and tabs around point, leaving one space."
  84.   (interactive "*")
  85.   (skip-chars-backward " \t")
  86.   (if (= (following-char) ? )
  87.       (forward-char 1)
  88.     (insert ? ))
  89.   (delete-region (point) (progn (skip-chars-forward " \t") (point))))
  90.  
  91. (defun delete-blank-lines ()
  92.   "On blank line, delete all surrounding blank lines, leaving just one.
  93. On isolated blank line, delete that one.
  94. On nonblank line, delete all blank lines that follow it."
  95.   (interactive "*")
  96.   (let (thisblank singleblank)
  97.     (save-excursion
  98.       (beginning-of-line)
  99.       (setq thisblank (looking-at "[ \t]*$"))
  100.       (setq singleblank
  101.         (and thisblank
  102.          (not (looking-at "[ \t]*\n[ \t]*$"))
  103.          (or (bobp)
  104.              (progn (forward-line -1)
  105.                 (not (looking-at "[ \t]*$")))))))
  106.     (if thisblank
  107.     (progn
  108.       (beginning-of-line)
  109.       (if singleblank (forward-line 1))
  110.       (delete-region (point)
  111.              (if (re-search-backward "[^ \t\n]" nil t)
  112.                  (progn (forward-line 1) (point))
  113.                (point-min)))))
  114.     (if (not (and thisblank singleblank))
  115.     (save-excursion
  116.       (end-of-line)
  117.       (forward-line 1)
  118.       (delete-region (point)
  119.              (if (re-search-forward "[^ \t\n]" nil t)
  120.                  (progn (beginning-of-line) (point))
  121.                (point-max)))))))
  122.  
  123. (defun back-to-indentation ()
  124.   "Move point to the first non-whitespace character on this line."
  125.   (interactive)
  126.   (beginning-of-line 1)
  127.   (skip-chars-forward " \t"))
  128.  
  129. (defun newline-and-indent ()
  130.   "Insert a newline, then indent according to major mode.
  131. Indentation is done using the current indent-line-function.
  132. In programming language modes, this is the same as TAB.
  133. In some text modes, where TAB inserts a tab, this indents to the
  134. specified left-margin column."
  135.   (interactive "*")
  136.   (delete-region (point) (progn (skip-chars-backward " \t") (point)))
  137.   (newline)
  138.   (indent-according-to-mode))
  139.  
  140. (defun reindent-then-newline-and-indent ()
  141.   "Reindent current line, insert newline, then indent the new line.
  142. Indentation of both lines is done according to the current major mode,
  143. which means that the current value of indent-line-function is called.
  144. In programming language modes, this is the same as TAB.
  145. In some text modes, where TAB inserts a tab, this indents to the
  146. specified left-margin column."
  147.   (interactive "*")
  148.   (save-excursion
  149.     (delete-region (point) (progn (skip-chars-backward " \t") (point)))
  150.     (indent-according-to-mode))
  151.   (newline)
  152.   (indent-according-to-mode))
  153.  
  154. (defun kill-forward-chars (arg)
  155.   (if (listp arg) (setq arg (car arg)))
  156.   (if (eq arg '-) (setq arg -1))
  157.   (kill-region (point) (+ (point) arg)))
  158.  
  159. (defun kill-backward-chars (arg)
  160.   (if (listp arg) (setq arg (car arg)))
  161.   (if (eq arg '-) (setq arg -1))
  162.   (kill-region (point) (- (point) arg)))
  163.  
  164. (defun backward-delete-char-untabify (arg &optional killp)
  165.   "Delete characters backward, changing tabs into spaces.
  166. Delete ARG chars, and kill (save in kill ring) if KILLP is non-nil.
  167. Interactively, ARG is the prefix arg (default 1)
  168. and KILLP is t if prefix arg is was specified."
  169.   (interactive "*p\nP")
  170.   (let ((count arg))
  171.     (save-excursion
  172.       (while (and (> count 0) (not (bobp)))
  173.     (if (= (preceding-char) ?\t)
  174.         (let ((col (current-column)))
  175.           (forward-char -1)
  176.           (setq col (- col (current-column)))
  177.           (insert-char ?\ col)
  178.           (delete-char 1)))
  179.     (forward-char -1)
  180.     (setq count (1- count)))))
  181.   (delete-backward-char arg killp))
  182.  
  183. (defun zap-to-char (arg char)
  184.   "Kill up to (but not including) ARG'th occurrence of CHAR.
  185. Goes backward if ARG is negative; goes to end of buffer if CHAR not found."
  186.   (interactive "*p\ncZap to char: ")
  187.   (kill-region (point) (if (search-forward (char-to-string char) nil t arg)
  188.              (progn (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
  189.                 (point))
  190.                (if (> arg 0) (point-max) (point-min)))))
  191.  
  192. (defun beginning-of-buffer (&optional arg)
  193.   "Move point to the beginning of the buffer; leave mark at previous position.
  194. With arg N, put point N/10 of the way from the true beginning.
  195. Don't use this in Lisp programs!
  196. \(goto-char (point-min)) is faster and does not set the mark."
  197.   (interactive "P")
  198.   (push-mark)
  199.   (goto-char (if arg
  200.          (if (> (buffer-size) 10000)
  201.              ;; Avoid overflow for large buffer sizes!
  202.              (* (prefix-numeric-value arg)
  203.             (/ (buffer-size) 10))
  204.            (/ (+ 10 (* (buffer-size) (prefix-numeric-value arg))) 10))
  205.            (point-min)))
  206.   (if arg (forward-line 1)))
  207.  
  208. (defun end-of-buffer (&optional arg)
  209.   "Move point to the end of the buffer; leave mark at previous position.
  210. With arg N, put point N/10 of the way from the true end.
  211. Don't use this in Lisp programs!
  212. \(goto-char (point-max)) is faster and does not set the mark."
  213.   (interactive "P")
  214.   (push-mark)
  215.   (goto-char (if arg
  216.          (- (1+ (buffer-size))
  217.             (if (> (buffer-size) 10000)
  218.             ;; Avoid overflow for large buffer sizes!
  219.             (* (prefix-numeric-value arg)
  220.                (/ (buffer-size) 10))
  221.               (/ (* (buffer-size) (prefix-numeric-value arg)) 10)))
  222.            (point-max)))
  223.   (if arg (forward-line 1)))
  224.  
  225. (defun mark-whole-buffer ()
  226.   "Put point at beginning and mark at end of buffer."
  227.   (interactive)
  228.   (push-mark (point))
  229.   (push-mark (point-max))
  230.   (goto-char (point-min)))
  231.  
  232. (defun count-lines-region (start end)
  233.   "Print number of lines in the region."
  234.   (interactive "r")
  235.   (message "Region has %d lines" (count-lines start end)))
  236.  
  237. (defun what-line ()
  238.   "Print the current line number (in the buffer) of point."
  239.   (interactive)
  240.   (save-restriction
  241.     (widen)
  242.     (save-excursion
  243.       (beginning-of-line)
  244.       (message "Line %d"
  245.            (1+ (count-lines 1 (point)))))))
  246.  
  247. (defun count-lin