]> code.delx.au - gnu-emacs-elpa/commitdiff
Merge commit '8380161ecfa24a22ef95ce05b5567adc853efa01'
authorArtur Malabarba <bruce.connor.am@gmail.com>
Fri, 21 Aug 2015 14:07:29 +0000 (15:07 +0100)
committerArtur Malabarba <bruce.connor.am@gmail.com>
Fri, 21 Aug 2015 14:07:29 +0000 (15:07 +0100)
1  2 
packages/sotlisp/sotlisp.el

index 6e4bb1168b0dc4e9f1c73b56133e785171577c79,1d9030e8dfd1df09df92d2be156ac7d2c1876c26..5e3dcb413cdde27b23c1d027fd3cbe2a2a4e5a8d
@@@ -587,5 -591,91 +590,90 @@@ With a prefix argument, defines a `defv
                      (if prefix "" "\n  :type 'boolean")
                      ")\n\n")))))))
  
\f
+ ;;; Comment sexp
+ (defun sotlisp-uncomment-sexp (&optional n)
+   "Uncomment a sexp around point."
+   (interactive "P")
+   (let* ((initial-point (point-marker))
+          (p)
+          (end (save-excursion
+                 (when (elt (syntax-ppss) 4)
+                   (re-search-backward comment-start-skip
+                                       (line-beginning-position)
+                                       t))
+                 (setq p (point-marker))
+                 (comment-forward (point-max))
+                 (point-marker)))
+          (beg (save-excursion
+                 (forward-line 0)
+                 (while (= end (save-excursion
+                                 (comment-forward (point-max))
+                                 (point)))
+                   (forward-line -1))
+                 (goto-char (line-end-position))
+                 (re-search-backward comment-start-skip
+                                     (line-beginning-position)
+                                     t)
+                 (while (looking-at-p comment-start-skip)
+                   (forward-char -1))
+                 (point-marker))))
+     (unless (= beg end)
+       (uncomment-region beg end)
+       (goto-char p)
+       ;; Indentify the "top-level" sexp inside the comment.
+       (while (and (ignore-errors (backward-up-list) t)
+                   (>= (point) beg))
+         (skip-chars-backward (rx (syntax expression-prefix)))
+         (setq p (point-marker)))
+       ;; Re-comment everything before it. 
+       (ignore-errors
+         (comment-region beg p))
+       ;; And everything after it.
+       (goto-char p)
+       (forward-sexp (or n 1))
+       (skip-chars-forward "\r\n[:blank:]")
+       (if (< (point) end)
+           (ignore-errors
+             (comment-region (point) end))
+         ;; If this is a closing delimiter, pull it up.
+         (goto-char end)
+         (skip-chars-forward "\r\n[:blank:]")
+         (when (= 5 (car (syntax-after (point))))
+           (delete-indentation))))
+     ;; Without a prefix, it's more useful to leave point where
+     ;; it was.
+     (unless n
+       (goto-char initial-point))))
+ (defun sotlisp--comment-sexp-raw ()
+   "Comment the sexp at point or ahead of point."
+   (pcase (or (bounds-of-thing-at-point 'sexp)
+              (save-excursion
+                (skip-chars-forward "\r\n[:blank:]")
+                (bounds-of-thing-at-point 'sexp)))
+     (`(,l . ,r)
+      (goto-char r)
+      (skip-chars-forward "\r\n[:blank:]")
+      (save-excursion
+        (comment-region l r))
+      (skip-chars-forward "\r\n[:blank:]"))))
+ (defun sotlisp-comment-or-uncomment-sexp (&optional n)
+   "Comment the sexp at point and move past it.
+ If already inside (or before) a comment, uncomment instead.
+ With a prefix argument N, (un)comment that many sexps."
+   (interactive "P")
+   (if (or (elt (syntax-ppss) 4)
+           (< (save-excursion
+                (skip-chars-forward "\r\n[:blank:]")
+                (point))
+              (save-excursion
+                (comment-forward 1)
+                (point))))
+       (sotlisp-uncomment-sexp n)
+     (dotimes (_ (or n 1))
+       (sotlisp--comment-sexp-raw))))
  (provide 'sotlisp)
  ;;; sotlisp.el ends here
 -