# HG changeset patch # User Juri Linkov # Date 1085778745 0 # Node ID eb9d99ced391eae4052d28f16446498631d6cb30 # Parent 5e730ddfd23ad927372be35b57b3453ea828b117 (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. diff -r 5e730ddfd23a -r eb9d99ced391 lisp/emacs-lisp/lisp.el --- 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)