diff options
| -rw-r--r-- | lisp/emacs-lisp/lisp.el | 93 |
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'. | ||
| 343 | Each element looks like (OPEN-CHAR CLOSE-CHAR) or (COMMAND-CHAR | ||
| 344 | OPEN-CHAR CLOSE-CHAR). The characters OPEN-CHAR and CLOSE-CHAR | ||
| 345 | of the pair whose key is equal to the last input character with | ||
| 346 | or 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. |
| 342 | Leave point after the first character. | 350 | Leave point after the first character. |
| 343 | A negative ARG encloses the preceding ARG sexps instead. | 351 | A negative ARG encloses the preceding ARG sexps instead. |
| @@ -345,32 +353,47 @@ No argument is equivalent to zero: just insert characters | |||
| 345 | and leave point between. | 353 | and leave point between. |
| 346 | If `parens-require-spaces' is non-nil, this command also inserts a space | 354 | If `parens-require-spaces' is non-nil, this command also inserts a space |
| 347 | before and after, depending on the surrounding characters. | 355 | before and after, depending on the surrounding characters. |
| 348 | If region is active, insert enclosing characters at region boundaries." | 356 | If region is active, insert enclosing characters at region boundaries. |
| 357 | |||
| 358 | If arguments OPEN and CLOSE are nil, the character pair is found | ||
| 359 | from the variable `insert-pair-alist' according to the last input | ||
| 360 | character with or without modifiers. If no character pair is | ||
| 361 | found in the variable `insert-pair-alist', then the last input | ||
| 362 | character 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. |
| 375 | A negative ARG encloses the preceding ARG sexps instead. | 398 | A negative ARG encloses the preceding ARG sexps instead. |
| 376 | No argument is equivalent to zero: just insert `()' and leave point between. | 399 | No 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) |