[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/paredit 602e328 011/224: Changes for version 15.
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/paredit 602e328 011/224: Changes for version 15. |
Date: |
Sat, 7 Aug 2021 09:22:07 -0400 (EDT) |
branch: elpa/paredit
commit 602e3282782c6b97a5f0e334512076c904a68483
Author: Taylor R Campbell <campbell@mumble.net>
Commit: Taylor R Campbell <campbell@mumble.net>
Changes for version 15.
- Rewrote comment insertion code.
- Implemented M-; (paredit-comment-dwim), which is like comment-dwim
but inserts comments more appropriately with respect to paredit.
darcs-hash:20080928134053-00fcc-89725dbfcfd855de4a0e07e0ffa1e133229c0482
---
paredit.el | 174 ++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 103 insertions(+), 71 deletions(-)
diff --git a/paredit.el b/paredit.el
index db47706..a887893 100644
--- a/paredit.el
+++ b/paredit.el
@@ -1,7 +1,7 @@
;;; -*- mode: emacs-lisp -*-
;;;;;; paredit: Parenthesis editing minor mode
-;;;;;; Version 14
+;;;;;; Version 15
;;; This code is written by Taylor Campbell (except where explicitly
;;; noted) and placed in the Public Domain. All warranties are
@@ -31,12 +31,11 @@
;;; the double-quote key is multiplexed to do both, and also insert an
;;; escape if within a string; backslashes prompt the user for the
;;; next character to input, because a lone backslash can break
-;;; structure inadvertently; and semicolons insert comments in various
-;;; ways, similar to COMMENT-DWIM, but with different DWIM meanings.
-;;; (M-; as COMMENT-DWIM is still useful, and I still use it too, but
-;;; for different purposes.) These all have their ordinary behaviour
-;;; when inside comments, and, outside comments, if truly necessary,
-;;; you can insert them literally with C-q.
+;;; structure inadvertently; and semicolons ensure that they do not
+;;; accidentally comment valid structure. (Use M-; to comment an
+;;; expression.) These all have their ordinary behaviour when inside
+;;; comments, and, outside comments, if truly necessary, you can insert
+;;; them literally with C-q.
;;;
;;; It also changes several standard editing keybindings including
;;; RET, C-j, C-d, DEL, & C-k. RET & C-j are transposed from their
@@ -61,13 +60,13 @@
;;; bad to have huge, long, hideously nested code anyway.
;;;
;;; Questions, bug reports, comments, feature suggestions, &c., can be
-;;; addressed to the author via mail at <campbell@bloodandcoffee.net>
+;;; addressed to the author via mail on the host mumble.net to campbell
;;; or via IRC on irc.freenode.net in #emacs, #scheme, or #lisp, under
;;; the nick Riastradh.
;;; This assumes Unix-style LF line endings.
-(defconst paredit-version 14)
+(defconst paredit-version 15)
@@ -87,6 +86,7 @@
(define-key keymap "\"" 'paredit-doublequote)
(define-key keymap "\\" 'paredit-backslash)
(define-key keymap ";" 'paredit-semicolon)
+ (define-key keymap "M-;" 'paredit-comment-dwim)
;; This defies ordinary conventions, but I believe it is justified
;; and more convenient this way, to have RET be fancy and C-j
@@ -422,69 +422,101 @@ unintentionally."
(defun paredit-semicolon (&optional arg)
"Insert a comment beginning, moving other items on the line.
If in a string, comment, or character literal, or with a prefix
-argument, inserts just a literal semicolon."
+argument, inserts just a literal semicolon and does not move anything
+to the next line."
(interactive "P")
- (cond ((or (paredit-in-string-p)
- (paredit-in-comment-p)
- (paredit-in-char-p)
- arg)
- (insert ";"))
- ;; At the beginning of a line, so try a top-level comment.
- ((eq (point) (point-at-bol))
- (paredit-top-level-comment))
- ;; No more code on this line after the point.
- ((save-excursion (paredit-skip-whitespace t (point-at-eol))
- (eq (point) (point-at-eol)))
- (paredit-maybe-margin-comment))
- (t (paredit-code-comment))))
-
-(defun paredit-top-level-comment ()
- (let ((indent (calculate-lisp-indent)))
- (if (not (eq (- (point) (point-at-bol))
- (if (consp indent)
- (car indent)
- indent)))
- ;; Just incorrectly indented, so we'll use a code
- ;; comment anyway after indenting first, and then break
- ;; the line.
- (progn ;; If there's code ahead of here, adjust first.
- (if (not (eq (point) (point-at-eol)))
- (save-excursion (newline-and-indent)))
- (lisp-indent-line)
- (insert ";; "))
- ;; It is indeed a top-level comment, so insert three semicolons,
- ;; after indenting code past the point on a new line if there is
- ;; any.
- (save-excursion
- (if (progn (paredit-skip-whitespace t (point-at-eol))
- (not (eq (point) (point-at-eol))))
- (newline)))
- (insert ";;; "))))
-
-(defun paredit-maybe-margin-comment ()
- (if (save-excursion (paredit-skip-whitespace nil (point-at-bol))
- (eq (point) (point-at-bol)))
- ;; No code at all on this line, so it's not a margin comment;
- (progn (lisp-indent-line) ; indent it,
- (insert (if (eq (point) (point-at-bol))
- ";;; " ; and insert the appropriate
- ";; "))) ; comment prefix.
- ;; There is code on this line, just not after the point, so it will
- ;; be margin comment.
- (indent-to comment-column)
- (if (not (memq (char-syntax (char-before))
- '(?\ ?-)))
- (insert " "))
- (insert "; ")))
-
-(defun paredit-code-comment ()
- ;; If we're ahead of some code on the line, first move to another.
- (if (not (save-excursion (paredit-skip-whitespace nil (point-at-bol))
- (eq (point) (point-at-bol))))
- (newline))
- (save-excursion (newline-and-indent))
- (lisp-indent-line)
- (insert ";; "))
+ (if (not (or (paredit-in-string-p)
+ (paredit-in-comment-p)
+ (paredit-in-char-p)
+ arg
+ ;; No more code on the line after the point.
+ (save-excursion
+ (paredit-skip-whitespace t (point-at-eol))
+ (eq (point) (point-at-eol)))))
+ ;; Don't use NEWLINE-AND-INDENT, because that will delete all of
+ ;; the horizontal whitespace first, but we just want to move the
+ ;; code following the point onto the next line while preserving
+ ;; the point on this line.
+ (save-excursion (newline) (lisp-indent-line)))
+ (insert ";"))
+
+(defun paredit-comment-dwim (&optional arg)
+ "Calls the Lisp comment command you want (Do What I Mean).
+This is like `comment-dwim', but it is specialized for Lisp editing.
+If transient mark mode is enabled and the mark is active, comments or
+uncomments the selected region, depending on whether it was entirely
+commented not not already.
+If there is already a comment on the current line, with no prefix
+argument, indents to that comment; with a prefix argument, kills that
+comment.
+Otherwise, inserts a comment appropriate for the context and ensures
+that any code following the comment is moved to the next line.
+At the top level, where indentation is calculated to be at column 0,
+this inserts a triple-semicolon comment; within code, where the
+indentation is calculated to be non-zero, and there is either no code
+on the line or code after the point on the line, inserts a double-
+semicolon comment; and if the point is after all code on the line,
+inserts a single-semicolon margin comment at `comment-column'."
+ (interactive "*P")
+ (comment-normalize-vars)
+ (cond ((and mark-active transient-mark-mode)
+ (comment-or-uncomment-region (region-beginning)
+ (region-end)
+ arg))
+ ((paredit-comment-on-line-p)
+ (if arg
+ (comment-kill (if (integerp arg) arg nil))
+ (comment-indent)))
+ (t (paredit-insert-comment))))
+
+(defun paredit-comment-on-line-p ()
+ (save-excursion
+ (goto-char (point-at-bol))
+ (let ((comment-p nil))
+ ;; Search forward for a comment beginning. If there is one, set
+ ;; COMMENT-P to true; if not, it will be nil.
+ (while (progn (setq comment-p
+ (search-forward ";" (point-at-eol)
+ ;; t -> no error
+ t))
+ (and comment-p
+ (or (paredit-in-string-p)
+ (paredit-in-char-p (1- (point))))))
+ (forward-char))
+ comment-p)))
+
+(defun paredit-insert-comment ()
+ (let ((code-after-p
+ (save-excursion (paredit-skip-whitespace t (point-at-eol))
+ (not (eq (point) (point-at-eol)))))
+ (code-before-p
+ (save-excursion (paredit-skip-whitespace nil (point-at-bol))
+ (not (eq (point) (point-at-bol))))))
+ ;; We have to use EQ 0 here and not ZEROP because ZEROP signals an
+ ;; error if its argument is non-numeric, but CALCULATE-LISP-INDENT
+ ;; may return nil.
+ (if (eq (let ((indent (calculate-lisp-indent)))
+ (if (consp indent)
+ (car indent)
+ indent))
+ 0)
+ ;; Top-level comment
+ (progn (if code-after-p (save-excursion (newline)))
+ (insert ";;; "))
+ (if code-after-p
+ ;; Code comment
+ (progn (if code-before-p (newline-and-indent))
+ (lisp-indent-line)
+ (insert ";; ")
+ ;; Move the following code. (NEWLINE-AND-INDENT will
+ ;; delete whitespace after the comment, though, so use
+ ;; NEWLINE & LISP-INDENT-LINE manually here.)
+ (save-excursion (newline)
+ (lisp-indent-line)))
+ ;; Margin comment
+ (progn (indent-to comment-column
+ 1) ; 1 -> force one space after
+ (insert "; "))))))
(defun paredit-newline ()
"Inserts a newline and indents it.
- [nongnu] elpa/paredit f9ab2e7 080/224: Show point in `paredit-splice-sexp-killing-backward' example., (continued)
- [nongnu] elpa/paredit f9ab2e7 080/224: Show point in `paredit-splice-sexp-killing-backward' example., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 0efc755 088/224: Fix typo: `imbalanced' -> `unbalanced' in `paredit-mode' docstring., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 2ed66de 092/224: Use `?\ ' rather than `?\s' to appease GNU Emacs 21., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit ace4f62 074/224: Count S-expressions more carefully in `paredit-insert-pair'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 43bf81f 028/224: Implement `paredit-copy-as-kill'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit e80ffcc 112/224: Check for expected errors in `paredit-backward-delete'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 3bf30f9 115/224: Omit redundant `paredit-backward-delete' test., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit ba0de55 120/224: Add brief docstring to `paredit-check-region-state'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 951813a 131/224: Fix `paredit-move-past-close' within a character escape., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 901acb8 012/224: Changes for version 16., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 602e328 011/224: Changes for version 15.,
ELPA Syncer <=
- [nongnu] elpa/paredit 760ae70 004/224: Changes for version 8., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 004d257 013/224: Changes for version 17., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 7f89e54 014/224: Changes for version 18., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 17852a0 019/224: Call `comment-forward' as a symbol with `funcall'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 2f3db5f 021/224: Broaden `paredit-raise-sexp' to act sensibly on strings and characters., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 8ab1694 022/224: Change `paredit-comment-on-line-p' to use `comment-search-forward'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit e121b92 024/224: Clarify `paredit-insert-comment' and change its criteria for code comments., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 451ea5e 025/224: Add magic autoload comment for `paredit-mode'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit a386bdf 031/224: Call `end-of-defun' in `paredit-reindent-defun'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 0d7a39d 032/224: Un-deprecate `enable-paredit-mode' and `disable-paredit-mode'., ELPA Syncer, 2021/08/07