X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c9805d2356942878e55e92aae5fd1dee756f366b..29c8a348c5c9f326af54a3d30f69cde98fe300bb:/lisp/newcomment.el diff --git a/lisp/newcomment.el b/lisp/newcomment.el index 1e40317c9a..a1d77ccc6e 100644 --- a/lisp/newcomment.el +++ b/lisp/newcomment.el @@ -1,11 +1,11 @@ -;;; newcomment.el --- (un)comment regions of buffers +;;; newcomment.el --- (un)comment regions of buffers -*- lexical-binding: t -*- -;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 1999-2011 Free Software Foundation, Inc. ;; Author: code extracted from Emacs-20's simple.el ;; Maintainer: Stefan Monnier ;; Keywords: comment uncomment +;; Package: emacs ;; This file is part of GNU Emacs. @@ -118,7 +118,7 @@ at the place matched by the close of the first pair.") ;;;###autoload (defvar comment-end-skip nil - "Regexp to match the end of a comment plus everything up to its body.") + "Regexp to match the end of a comment plus everything back to its body.") ;;;###autoload(put 'comment-end-skip 'safe-local-variable 'string-or-null-p) ;;;###autoload @@ -186,21 +186,58 @@ This should generally stay 0, except for a few modes like Lisp where it is 1 so that regions are commented with two or three semi-colons.") (defconst comment-styles - '((plain . (nil nil nil nil)) - (indent . (nil nil nil t)) - (indent-or-triple - . (nil nil nil multi-char)) - (aligned . (nil t nil t)) - (multi-line . (t nil nil t)) - (extra-line . (t nil t t)) - (box . (nil t t t)) - (box-multi . (t t t t))) - "Comment region styles of the form (STYLE . (MULTI ALIGN EXTRA INDENT)). + '((plain nil nil nil nil + "Start in column 0 (do not indent), as in Emacs-20") + (indent-or-triple nil nil nil multi-char + "Start in column 0, but only for single-char starters") + (indent nil nil nil t + "Full comment per line, ends not aligned") + (aligned nil t nil t + "Full comment per line, ends aligned") + (box nil t t t + "Full comment per line, ends aligned, + top and bottom") + (extra-line t nil t t + "One comment for all lines, end on a line by itself") + (multi-line t nil nil t + "One comment for all lines, end on last commented line") + (box-multi t t t t + "One comment for all lines, + top and bottom")) + "Comment region style definitions. +Each style is defined with a form (STYLE . (MULTI ALIGN EXTRA INDENT DOC)). +DOC should succinctly describe the style. STYLE should be a mnemonic symbol. MULTI specifies that comments are allowed to span multiple lines. + e.g. in C it comments regions as + /* blabla + * bli */ + rather than + /* blabla */ + /* bli */ + if `comment-end' is empty, this has no effect. + ALIGN specifies that the `comment-end' markers should be aligned. + e.g. in C it comments regions as + /* blabla */ + /* bli */ + rather than + /* blabla */ + /* bli */ + if `comment-end' is empty, this has no effect, unless EXTRA is also set, + in which case the comment gets wrapped in a box. + EXTRA specifies that an extra line should be used before and after the region to comment (to put the `comment-end' and `comment-start'). + e.g. in C it comments regions as + /* + * blabla + * bli + */ + rather than + /* blabla + * bli */ + if the comment style is not multi line, this has no effect, unless ALIGN + is also set, in which case the comment gets wrapped in a box. + INDENT specifies that the `comment-start' markers should not be put at the left margin but at the current indentation of the region to comment. If INDENT is `multi-char', that means indent multi-character @@ -211,8 +248,11 @@ If INDENT is `multi-char', that means indent multi-character "Style to be used for `comment-region'. See `comment-styles' for a list of available styles." :type (if (boundp 'comment-styles) - `(choice ,@(mapcar (lambda (s) `(const ,(car s))) - comment-styles)) + `(choice + ,@(mapcar (lambda (s) + `(const :tag ,(format "%s: %s" (car s) (nth 5 s)) + ,(car s))) + comment-styles)) 'symbol) :version "23.1" :group 'comment) @@ -682,7 +722,7 @@ With any other arg, set comment column to indentation of the previous comment With prefix ARG, kill comments on that many lines starting with this one." (interactive "P") (comment-normalize-vars) - (dotimes (_ (prefix-numeric-value arg)) + (dotimes (_i (prefix-numeric-value arg)) (save-excursion (beginning-of-line) (let ((cs (comment-search-forward (line-end-position) t))) @@ -946,12 +986,12 @@ indentation to be kept as it was before narrowing." (delete-char n) (setq ,bindent (- ,bindent n))))))))))) -;; Compute the number of extra comment starter characters -;; (extra semicolons in Lisp mode, extra stars in C mode, etc.) -;; If ARG is non-nil, just follow ARG. -;; If the comment-starter is multi-char, just follow ARG. -;; Otherwise obey comment-add, and double it if EXTRA is non-nil. (defun comment-add (arg) + "Compute the number of extra comment starter characters +\(extra semicolons in Lisp mode, extra stars in C mode, etc.) +If ARG is non-nil, just follow ARG. +If the comment starter is multi-char, just follow ARG. +Otherwise obey `comment-add'." (if (and (null arg) (= (string-match "[ \t]*\\'" comment-start) 1)) (* comment-add 1) (1- (prefix-numeric-value arg)))) @@ -1144,6 +1184,12 @@ end- comment markers additionally to what `comment-add' already specifies." 'box-multi 'box))) (comment-region beg end (+ comment-add arg)))) +(defun comment-only-p (beg end) + "Return non-nil if the text between BEG and END is all comments." + (save-excursion + (goto-char beg) + (comment-forward (point-max)) + (<= end (point)))) ;;;###autoload (defun comment-or-uncomment-region (beg end &optional arg) @@ -1152,10 +1198,7 @@ in which case call `uncomment-region'. If a prefix arg is given, it is passed on to the respective function." (interactive "*r\nP") (comment-normalize-vars) - (funcall (if (save-excursion ;; check for already commented region - (goto-char beg) - (comment-forward (point-max)) - (<= end (point))) + (funcall (if (comment-only-p beg end) 'uncomment-region 'comment-region) beg end arg)) @@ -1163,8 +1206,8 @@ is passed on to the respective function." (defun comment-dwim (arg) "Call the comment command you want (Do What I Mean). If the region is active and `transient-mark-mode' is on, call - `comment-region' (unless it only consists of comments, in which - case it calls `uncomment-region'). +`comment-region' (unless it only consists of comments, in which +case it calls `uncomment-region'). Else, if the current line is empty, call `comment-insert-comment-function' if it is defined, otherwise insert a comment and indent it. Else if a prefix ARG is specified, call `comment-kill'. @@ -1346,5 +1389,4 @@ unless optional argument SOFT is non-nil." (provide 'newcomment) -;; arch-tag: 01e3320a-00c8-44ea-a696-8f8e7354c858 ;;; newcomment.el ends here