changeset 55807:eb9d99ced391

(insert-pair-alist): New var. (insert-pair): Make arguments optional. Find character pair from `insert-pair-alist' according to the last input event. (insert-parentheses): Make arguments optional. (raise-sexp, delete-pair): New funs.
author Juri Linkov <juri@jurta.org>
date Fri, 28 May 2004 21:12:25 +0000
parents 5e730ddfd23a
children 8a012079448e
files lisp/emacs-lisp/lisp.el
diffstat 1 files changed, 66 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/lisp.el	Fri May 28 21:11:41 2004 +0000
+++ b/lisp/emacs-lisp/lisp.el	Fri May 28 21:12:25 2004 +0000
@@ -337,7 +337,15 @@
       (re-search-backward "^\n" (- (point) 1) t)
       (narrow-to-region beg end))))
 
-(defun insert-pair (arg &optional open close)
+(defvar insert-pair-alist
+  '((?\( ?\)) (?\[ ?\]) (?\{ ?\}) (?\< ?\>) (?\" ?\") (?\' ?\') (?\` ?\'))
+  "Alist of paired characters inserted by `insert-pair'.
+Each element looks like (OPEN-CHAR CLOSE-CHAR) or (COMMAND-CHAR
+OPEN-CHAR CLOSE-CHAR).  The characters OPEN-CHAR and CLOSE-CHAR
+of the pair whose key is equal to the last input character with
+or without modifiers, are inserted by `insert-pair'.")
+
+(defun insert-pair (&optional arg open close)
   "Enclose following ARG sexps in a pair of OPEN and CLOSE characters.
 Leave point after the first character.
 A negative ARG encloses the preceding ARG sexps instead.
@@ -345,32 +353,47 @@
 and leave point between.
 If `parens-require-spaces' is non-nil, this command also inserts a space
 before and after, depending on the surrounding characters.
-If region is active, insert enclosing characters at region boundaries."
+If region is active, insert enclosing characters at region boundaries.
+
+If arguments OPEN and CLOSE are nil, the character pair is found
+from the variable `insert-pair-alist' according to the last input
+character with or without modifiers.  If no character pair is
+found in the variable `insert-pair-alist', then the last input
+character is inserted ARG times."
   (interactive "P")
-  (if arg (setq arg (prefix-numeric-value arg))
-    (setq arg 0))
-  (or open  (setq open  ?\())
-  (or close (setq close ?\)))
-  (if (and transient-mark-mode mark-active)
-      (progn
-        (save-excursion (goto-char (region-end))       (insert close))
-        (save-excursion (goto-char (region-beginning)) (insert open)))
-    (cond ((> arg 0) (skip-chars-forward " \t"))
-          ((< arg 0) (forward-sexp arg) (setq arg (- arg))))
-    (and parens-require-spaces
-         (not (bobp))
-         (memq (char-syntax (preceding-char)) (list ?w ?_ (char-syntax close)))
-         (insert " "))
-    (insert open)
-    (save-excursion
-      (or (eq arg 0) (forward-sexp arg))
-      (insert close)
-      (and parens-require-spaces
-           (not (eobp))
-           (memq (char-syntax (following-char)) (list ?w ?_ (char-syntax open)))
-           (insert " ")))))
+  (if (not (and open close))
+      (let ((pair (or (assq last-command-char insert-pair-alist)
+                      (assq (event-basic-type last-command-event)
+                            insert-pair-alist))))
+        (if pair
+            (if (nth 2 pair)
+                (setq open (nth 1 pair) close (nth 2 pair))
+              (setq open (nth 0 pair) close (nth 1 pair))))))
+  (if (and open close)
+      (if (and transient-mark-mode mark-active)
+          (progn
+            (save-excursion (goto-char (region-end))       (insert close))
+            (save-excursion (goto-char (region-beginning)) (insert open)))
+        (if arg (setq arg (prefix-numeric-value arg))
+          (setq arg 0))
+        (cond ((> arg 0) (skip-chars-forward " \t"))
+              ((< arg 0) (forward-sexp arg) (setq arg (- arg))))
+        (and parens-require-spaces
+             (not (bobp))
+             (memq (char-syntax (preceding-char)) (list ?w ?_ (char-syntax close)))
+             (insert " "))
+        (insert open)
+        (save-excursion
+          (or (eq arg 0) (forward-sexp arg))
+          (insert close)
+          (and parens-require-spaces
+               (not (eobp))
+               (memq (char-syntax (following-char)) (list ?w ?_ (char-syntax open)))
+               (insert " "))))
+    (insert-char (event-basic-type last-command-event)
+                 (prefix-numeric-value arg))))
 
-(defun insert-parentheses (arg)
+(defun insert-parentheses (&optional arg)
   "Enclose following ARG sexps in parentheses.  Leave point after open-paren.
 A negative ARG encloses the preceding ARG sexps instead.
 No argument is equivalent to zero: just insert `()' and leave point between.
@@ -380,6 +403,24 @@
   (interactive "P")
   (insert-pair arg ?\( ?\)))
 
+(defun delete-pair ()
+  "Delete a pair of characters enclosing the sexp that follows point."
+  (interactive)
+  (save-excursion (forward-sexp 1) (delete-char -1))
+  (delete-char 1))
+
+(defun raise-sexp (&optional arg)
+  "Raise ARG sexps higher up the tree."
+  (interactive "p")
+  (let ((s (if (and transient-mark-mode mark-active)
+               (buffer-substring (region-beginning) (region-end))
+             (buffer-substring
+              (point)
+              (save-excursion (forward-sexp arg) (point))))))
+    (backward-up-list 1)
+    (delete-region (point) (save-excursion (forward-sexp 1) (point)))
+    (save-excursion (insert s))))
+
 (defun move-past-close-and-reindent ()
   "Move past next `)', delete indentation before it, then indent after it."
   (interactive)