aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/emacs-lisp/lisp.el93
1 files changed, 67 insertions, 26 deletions
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 53b9e7507ef..25fde86cd96 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -337,7 +337,15 @@ Optional ARG is ignored."
337 (re-search-backward "^\n" (- (point) 1) t) 337 (re-search-backward "^\n" (- (point) 1) t)
338 (narrow-to-region beg end)))) 338 (narrow-to-region beg end))))
339 339
340(defun insert-pair (arg &optional open close) 340(defvar insert-pair-alist
341 '((?\( ?\)) (?\[ ?\]) (?\{ ?\}) (?\< ?\>) (?\" ?\") (?\' ?\') (?\` ?\'))
342 "Alist of paired characters inserted by `insert-pair'.
343Each element looks like (OPEN-CHAR CLOSE-CHAR) or (COMMAND-CHAR
344OPEN-CHAR CLOSE-CHAR). The characters OPEN-CHAR and CLOSE-CHAR
345of the pair whose key is equal to the last input character with
346or without modifiers, are inserted by `insert-pair'.")
347
348(defun insert-pair (&optional arg open close)
341 "Enclose following ARG sexps in a pair of OPEN and CLOSE characters. 349 "Enclose following ARG sexps in a pair of OPEN and CLOSE characters.
342Leave point after the first character. 350Leave point after the first character.
343A negative ARG encloses the preceding ARG sexps instead. 351A negative ARG encloses the preceding ARG sexps instead.
@@ -345,32 +353,47 @@ No argument is equivalent to zero: just insert characters
345and leave point between. 353and leave point between.
346If `parens-require-spaces' is non-nil, this command also inserts a space 354If `parens-require-spaces' is non-nil, this command also inserts a space
347before and after, depending on the surrounding characters. 355before and after, depending on the surrounding characters.
348If region is active, insert enclosing characters at region boundaries." 356If region is active, insert enclosing characters at region boundaries.
357
358If arguments OPEN and CLOSE are nil, the character pair is found
359from the variable `insert-pair-alist' according to the last input
360character with or without modifiers. If no character pair is
361found in the variable `insert-pair-alist', then the last input
362character is inserted ARG times."
349 (interactive "P") 363 (interactive "P")
350 (if arg (setq arg (prefix-numeric-value arg)) 364 (if (not (and open close))
351 (setq arg 0)) 365 (let ((pair (or (assq last-command-char insert-pair-alist)
352 (or open (setq open ?\()) 366 (assq (event-basic-type last-command-event)
353 (or close (setq close ?\))) 367 insert-pair-alist))))
354 (if (and transient-mark-mode mark-active) 368 (if pair
355 (progn 369 (if (nth 2 pair)
356 (save-excursion (goto-char (region-end)) (insert close)) 370 (setq open (nth 1 pair) close (nth 2 pair))
357 (save-excursion (goto-char (region-beginning)) (insert open))) 371 (setq open (nth 0 pair) close (nth 1 pair))))))
358 (cond ((> arg 0) (skip-chars-forward " \t")) 372 (if (and open close)
359 ((< arg 0) (forward-sexp arg) (setq arg (- arg)))) 373 (if (and transient-mark-mode mark-active)
360 (and parens-require-spaces 374 (progn
361 (not (bobp)) 375 (save-excursion (goto-char (region-end)) (insert close))
362 (memq (char-syntax (preceding-char)) (list ?w ?_ (char-syntax close))) 376 (save-excursion (goto-char (region-beginning)) (insert open)))
363 (insert " ")) 377 (if arg (setq arg (prefix-numeric-value arg))
364 (insert open) 378 (setq arg 0))
365 (save-excursion 379 (cond ((> arg 0) (skip-chars-forward " \t"))
366 (or (eq arg 0) (forward-sexp arg)) 380 ((< arg 0) (forward-sexp arg) (setq arg (- arg))))
367 (insert close) 381 (and parens-require-spaces
368 (and parens-require-spaces 382 (not (bobp))
369 (not (eobp)) 383 (memq (char-syntax (preceding-char)) (list ?w ?_ (char-syntax close)))
370 (memq (char-syntax (following-char)) (list ?w ?_ (char-syntax open))) 384 (insert " "))
371 (insert " "))))) 385 (insert open)
372 386 (save-excursion
373(defun insert-parentheses (arg) 387 (or (eq arg 0) (forward-sexp arg))
388 (insert close)
389 (and parens-require-spaces
390 (not (eobp))
391 (memq (char-syntax (following-char)) (list ?w ?_ (char-syntax open)))
392 (insert " "))))
393 (insert-char (event-basic-type last-command-event)
394 (prefix-numeric-value arg))))
395
396(defun insert-parentheses (&optional arg)
374 "Enclose following ARG sexps in parentheses. Leave point after open-paren. 397 "Enclose following ARG sexps in parentheses. Leave point after open-paren.
375A negative ARG encloses the preceding ARG sexps instead. 398A negative ARG encloses the preceding ARG sexps instead.
376No argument is equivalent to zero: just insert `()' and leave point between. 399No argument is equivalent to zero: just insert `()' and leave point between.
@@ -380,6 +403,24 @@ If region is active, insert enclosing characters at region boundaries."
380 (interactive "P") 403 (interactive "P")
381 (insert-pair arg ?\( ?\))) 404 (insert-pair arg ?\( ?\)))
382 405
406(defun delete-pair ()
407 "Delete a pair of characters enclosing the sexp that follows point."
408 (interactive)
409 (save-excursion (forward-sexp 1) (delete-char -1))
410 (delete-char 1))
411
412(defun raise-sexp (&optional arg)
413 "Raise ARG sexps higher up the tree."
414 (interactive "p")
415 (let ((s (if (and transient-mark-mode mark-active)
416 (buffer-substring (region-beginning) (region-end))
417 (buffer-substring
418 (point)
419 (save-excursion (forward-sexp arg) (point))))))
420 (backward-up-list 1)
421 (delete-region (point) (save-excursion (forward-sexp 1) (point)))
422 (save-excursion (insert s))))
423
383(defun move-past-close-and-reindent () 424(defun move-past-close-and-reindent ()
384 "Move past next `)', delete indentation before it, then indent after it." 425 "Move past next `)', delete indentation before it, then indent after it."
385 (interactive) 426 (interactive)