emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 7a2038d: Create a toggle between block and line com


From: Alan Mackenzie
Subject: [Emacs-diffs] master 7a2038d: Create a toggle between block and line comments in CC Mode.
Date: Thu, 15 Jun 2017 17:04:39 -0400 (EDT)

branch: master
commit 7a2038d7c887e4fa08a91950a7494d1dd20c39e1
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    Create a toggle between block and line comments in CC Mode.
    
    Also (unrelated change) initialize the modes' keymaps at each loading.
    
    * lisp/progmodes/cc-cmds.el (c-update-modeline): amend for the new 
information
    on the modeline.
    (c-block-comment-flag): New variable.
    (c-toggle-comment-style): New function.
    
    * lisp/progmodes/cc-langs.el (c-block-comment-starter)
    (c-line-comment-starter): Make them c-lang-defvars.
    (c-block-comment-is-default): New c-lang-defvar.
    (comment-start, comment-end): Make the default values dependent on
    c-block-comment-is-default.
    
    * lisp/progmodes/cc-mode.el (c-mode-base-map): Define C-c C-k in this map.
    (c-basic-common-init): Initialize c-block-comment-flag.
    (c-mode-map, c++-mode-map, objc-mode-map, java-mode-map, idl-mode-map)
    (pike-mode-map, awk-mode-map): Make entries in these key maps each time the
    mode is loaded rather than just once per Emacs session.
    
    * doc/misc/cc-mode.texi (Comment Commands): Introduce the notion of comment
    style.
    (Minor Modes): Define comment style.  Describe how comment style influences
    the information displayed on the modeline.  Document c-toggle-comment-style.
    (FAQ): Add a question about toggling the comment style.
---
 doc/misc/cc-mode.texi      | 65 ++++++++++++++++++++++++++++++++++++----------
 lisp/progmodes/cc-cmds.el  | 37 +++++++++++++++++++++++---
 lisp/progmodes/cc-langs.el | 31 ++++++++++++----------
 lisp/progmodes/cc-mode.el  | 54 +++++++++++++++++++-------------------
 4 files changed, 130 insertions(+), 57 deletions(-)

diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 91e20fa..f9ba5cc 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -812,6 +812,10 @@ often (in seconds) progress messages are to be displayed.
 @cindex comments (insertion of)
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
+When the commands in this section add comment delimiters, they use
+either line comments or block comments depending on the setting of the
+comment style (@pxref{Minor Modes}).
+
 @table @asis
 @item @kbd{C-c C-c} (@code{comment-region})
 @kindex C-c C-c
@@ -1133,6 +1137,9 @@ line break.
 find useful while writing new code or editing old code:
 
 @table @asis
address@hidden comment style
+This specifies whether comment commands (such as @kbd{M-;}) insert
+block comments or line comments.
 @item electric mode
 When this is enabled, certain visible characters cause reformatting as
 they are typed.  This is normally helpful, but can be a nuisance when
@@ -1168,20 +1175,32 @@ and @ref{Indentation Engine Basics}.
 You can toggle each of these minor modes on and off, and you can
 configure @ccmode{} so that it starts up with your favorite
 combination of them (@pxref{Sample Init File}).  By default, when
-you initialize a buffer, electric mode and syntactic-indentation mode
-are enabled but the other three modes are disabled.
-
address@hidden displays the current state of the first four of these minor
-modes on the modeline by appending letters to the major mode's name,
-one letter for each enabled minor mode: @samp{l} for electric mode,
address@hidden for auto-newline mode, @samp{h} for hungry delete mode, and
address@hidden for subword mode.  If all these modes were enabled, you'd see
address@hidden/address@hidden @samp{C} would be replaced with the name of
-the language in question for the other languages @ccmode{} supports.}.
+you initialize a buffer, the comment style is set to the default for
+the major mode, electric mode and syntactic-indentation mode are
+enabled, but the other three modes are disabled.
+
address@hidden displays the current state of the first five of these minor
+modes on the mode line by appending characters to the major mode's
+name: @samp{/} or @samp{*} to indicate the comment style (respectively
+line or block), and one letter for each of the other minor modes which
+is enabled - @samp{l} for electric mode, @samp{a} for auto-newline
+mode, @samp{h} for hungry delete mode, and @samp{w} for subword mode.
+If the comment style was block and all the other modes were enabled,
+you'd see @samp{C/address@hidden @samp{C} would be replaced with
+the name of the language in question for the other languages @ccmode{}
+supports.}.
 
 Here are the commands to toggle these modes:
 
 @table @asis
address@hidden @kbd{C-c C-k} (@code{c-toggle-comment-style})
address@hidden C-c C-k
address@hidden c-toggle-comment-style
address@hidden toggle-comment-style (c-)
+Toggle the comment style between line style and block style.  In modes
+(such as AWK Mode) which only have one of these styles, this function
+does nothing.
+
 @item @kbd{C-c C-l} (@code{c-toggle-electric-state})
 @kindex C-c C-l
 @findex c-toggle-electric-state
@@ -1218,10 +1237,12 @@ Toggle syntactic-indentation mode.
 @end table
 
 Common to all the toggle functions above is that if they are called
-programmatically, they take an optional numerical argument.  A
-positive value will turn on the minor mode (or both of them in the
-case of @code{c-toggle-auto-hungry-state}) and a negative value will
-turn it (or them) off.
+programmatically, they take an optional numerical argument.  For
address@hidden style}, a positive value will select block
+comments, a negative value will select line comments.  For the other
+functions, a positive value will turn on the minor mode (or both of
+them in the case of @code{c-toggle-auto-hungry-state}) and a negative
+value will turn it (or them) off.
 
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -7232,6 +7253,22 @@ too, add this to your @code{c-initialization-hook}:
 @xref{Getting Started}.  This was a very common question.
 
 @item
address@hidden do I get block comments in my C++ files?}
+
+Interactively, change the comment style with @kbd{C-c C-k}.
address@hidden Modes}.
+
+To configure this setting, say, for files within the gdb project, you
+could amend your C++ Mode hook like this:
+
address@hidden
+(defun my-c++-mode-hook ()
+  (if (string-match "/gdb/" (buffer-file-name))
+      (c-toggle-comment-style 1)))
+(add-hook 'c++-mode-hook 'my-c++-mode-hook)
address@hidden example
+
address@hidden
 @emph{How do I stop my C++ lambda expressions being indented way over
 to the right?}
 
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 9c0798e..6250725 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -252,7 +252,8 @@ With universal argument, inserts the analysis as a comment 
on that line."
 
 ;; Minor mode functions.
 (defun c-update-modeline ()
-  (let ((fmt (format "/%s%s%s%s"
+  (let ((fmt (format "/%s%s%s%s%s"
+                    (if c-block-comment-flag "*" "/")
                     (if c-electric-flag "l" "")
                     (if (and c-electric-flag c-auto-newline)
                         "a" "")
@@ -270,9 +271,6 @@ With universal argument, inserts the analysis as a comment 
on that line."
        (bare-mode-name (if (string-match "\\(^[^/]*\\)/" mode-name)
                            (match-string 1 mode-name)
                          mode-name)))
-;;     (setq c-submode-indicators
-;;       (if (> (length fmt) 1)
-;;           fmt))
     (setq mode-name
          (if (> (length fmt) 1)
              (concat bare-mode-name fmt)
@@ -362,6 +360,37 @@ left out."
     (electric-indent-local-mode (if c-electric-flag 1 0)))
   (c-keep-region-active))
 
+;; `c-block-comment-flag' gets initialized to the current mode's default in
+;; c-basic-common-init.
+(defvar c-block-comment-flag nil)
+(make-variable-buffer-local 'c-block-comment-flag)
+
+(defun c-toggle-comment-style (&optional arg)
+  "Toggle the comment style between block and line comments.
+Optional numeric ARG, if supplied, switches to block comment
+style when positive, to line comment style when negative, and
+just toggles it when zero or left out.
+
+This action does nothing when the mode only has one comment style."
+  (interactive "P")
+  (setq c-block-comment-flag
+       (cond
+        ((and c-line-comment-starter c-block-comment-starter)
+         (c-calculate-state arg c-block-comment-flag))
+        (c-line-comment-starter nil)
+        (t t)))
+  (setq comment-start
+       (concat (if c-block-comment-flag
+                   c-block-comment-starter
+                 c-line-comment-starter)
+               " "))
+  (setq comment-end
+       (if c-block-comment-flag
+           (concat " " c-block-comment-ender)
+         ""))
+  (c-update-modeline)
+  (c-keep-region-active))
+
 
 ;; Electric keys
 
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 84d4eab..a9d5ac3 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -1449,6 +1449,7 @@ comment style.  Other stuff like the syntax table must 
also be set up
 properly."
   t    "/*"
   awk  nil)
+(c-lang-defvar c-block-comment-starter (c-lang-const c-block-comment-starter))
 
 (c-lang-defconst c-block-comment-ender
   "String that ends block comments, or nil if such don't exist.
@@ -1458,6 +1459,7 @@ comment style.  Other stuff like the syntax table must 
also be set up
 properly."
   t    "*/"
   awk  nil)
+(c-lang-defvar c-block-comment-ender (c-lang-const c-block-comment-ender))
 
 (c-lang-defconst c-block-comment-ender-regexp
   ;; Regexp which matches the end of a block comment (if such exists in the
@@ -1515,27 +1517,30 @@ properly."
 (c-lang-defvar c-doc-comment-start-regexp
   (c-lang-const c-doc-comment-start-regexp))
 
+(c-lang-defconst c-block-comment-is-default
+  "Non-nil when the default comment style is block comment."
+  ;; Note to maintainers of derived modes: You are responsible for ensuring
+  ;; the pertinent `c-block-comment-{starter,ender}' or
+  ;; `c-line-comment-{starter,ender}' are non-nil.
+  t nil
+  c t)
+(c-lang-defvar c-block-comment-is-default
+  (c-lang-const c-block-comment-is-default))
+
 (c-lang-defconst comment-start
   "String that starts comments inserted with M-; etc.
 `comment-start' is initialized from this."
-  ;; Default: Prefer line comments to block comments, and pad with a space.
-  t (concat (or (c-lang-const c-line-comment-starter)
-               (c-lang-const c-block-comment-starter))
-           " ")
-  ;; In C we still default to the block comment style since line
-  ;; comments aren't entirely portable.
-  c "/* ")
+  t (concat
+     (if (c-lang-const c-block-comment-is-default)
+        (c-lang-const c-block-comment-starter)
+       (c-lang-const c-line-comment-starter))
+     " "))
 (c-lang-setvar comment-start (c-lang-const comment-start))
 
 (c-lang-defconst comment-end
   "String that ends comments inserted with M-; etc.
 `comment-end' is initialized from this."
-  ;; Default: Use block comment style if comment-start uses block
-  ;; comments, and pad with a space in that case.
-  t (if (string-match (concat "\\`\\("
-                             (c-lang-const c-block-comment-start-regexp)
-                             "\\)")
-                     (c-lang-const comment-start))
+  t (if (c-lang-const c-block-comment-is-default)
        (concat " " (c-lang-const c-block-comment-ender))
       ""))
 (c-lang-setvar comment-end (c-lang-const comment-end))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 20c63d4..a501ebb 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -398,7 +398,7 @@ control).  See \"cc-mode.el\" for more info."
   ;;(define-key c-mode-base-map "\C-c\C-v"  'c-version)
   ;; (define-key c-mode-base-map "\C-c\C-y"  'c-toggle-hungry-state)  
Commented out by ACM, 2005-11-22.
   (define-key c-mode-base-map "\C-c\C-w" 'c-subword-mode)
-  )
+  (define-key c-mode-base-map "\C-c\C-k" 'c-toggle-comment-style))
 
 ;; We don't require the outline package, but we configure it a bit anyway.
 (cc-bytecomp-defvar outline-level)
@@ -547,7 +547,7 @@ that requires a literal mode spec at compile time."
        (setq yank-handled-properties (remq yank-cat-handler
                                            yank-handled-properties)))))
 
-  ;; For the benefit of adaptive file, which otherwise mis-fills.
+  ;; For the benefit of adaptive fill, which otherwise mis-fills.
   (setq fill-paragraph-handle-comment nil)
 
   ;; Install `c-fill-paragraph' on `fill-paragraph-function' so that a
@@ -623,6 +623,8 @@ that requires a literal mode spec at compile time."
 
   ;; setup the comment indent variable in a Emacs version portable way
   (set (make-local-variable 'comment-indent-function) 'c-comment-indent)
+  ;; What sort of comments are default for M-;?
+  (setq c-block-comment-flag c-block-comment-is-default)
 
   ;; In Emacs 24.4 onwards, prevent Emacs's built in electric indentation from
   ;; messing up CC Mode's, and set `c-electric-flag' if `electric-indent-mode'
@@ -1621,10 +1623,10 @@ This function is called from `c-common-init', once per 
mode initialization."
 
 (defvar c-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for C.
-    (define-key map "\C-c\C-e"  'c-macro-expand)
     map)
   "Keymap used in c-mode buffers.")
+;; Add bindings which are only useful for C.
+(define-key c-mode-map "\C-c\C-e"  'c-macro-expand)
 
 
 (easy-menu-define c-c-menu c-mode-map "C Mode Commands"
@@ -1737,13 +1739,13 @@ the code is C or C++ and based on that chooses whether 
to enable
 
 (defvar c++-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for C++.
-    (define-key map "\C-c\C-e" 'c-macro-expand)
-    (define-key map "\C-c:"    'c-scope-operator)
-    (define-key map "<"        'c-electric-lt-gt)
-    (define-key map ">"        'c-electric-lt-gt)
     map)
   "Keymap used in c++-mode buffers.")
+;; Add bindings which are only useful for C++.
+(define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
+(define-key c++-mode-map "\C-c:"    'c-scope-operator)
+(define-key c++-mode-map "<"        'c-electric-lt-gt)
+(define-key c++-mode-map ">"        'c-electric-lt-gt)
 
 (easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
                  (cons "C++" (c-lang-const c-mode-menu c++)))
@@ -1789,10 +1791,10 @@ Key bindings:
 
 (defvar objc-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for Objective-C.
-    (define-key map "\C-c\C-e" 'c-macro-expand)
     map)
   "Keymap used in objc-mode buffers.")
+;; Add bindings which are only useful for Objective-C.
+(define-key objc-mode-map "\C-c\C-e" 'c-macro-expand)
 
 (easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
                  (cons "ObjC" (c-lang-const c-mode-menu objc)))
@@ -1842,9 +1844,9 @@ Key bindings:
 
 (defvar java-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for Java.
     map)
   "Keymap used in java-mode buffers.")
+;; Add bindings which are only useful for Java.
 
 ;; Regexp trying to describe the beginning of a Java top-level
 ;; definition.  This is not used by CC Mode, nor is it maintained
@@ -1895,9 +1897,9 @@ Key bindings:
 
 (defvar idl-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for IDL.
     map)
   "Keymap used in idl-mode buffers.")
+;; Add bindings which are only useful for IDL.
 
 (easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
                  (cons "IDL" (c-lang-const c-mode-menu idl)))
@@ -1942,10 +1944,10 @@ Key bindings:
 
 (defvar pike-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Additional bindings.
-    (define-key map "\C-c\C-e" 'c-macro-expand)
     map)
   "Keymap used in pike-mode buffers.")
+;; Additional bindings.
+(define-key pike-mode-map "\C-c\C-e" 'c-macro-expand)
 
 (easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
                  (cons "Pike" (c-lang-const c-mode-menu pike)))
@@ -1994,19 +1996,19 @@ Key bindings:
 
 (defvar awk-mode-map
   (let ((map (c-make-inherited-keymap)))
-    ;; Add bindings which are only useful for awk.
-    (define-key map "#" 'self-insert-command);Overrides electric parent 
binding.
-    (define-key map "/" 'self-insert-command);Overrides electric parent 
binding.
-    (define-key map "*" 'self-insert-command);Overrides electric parent 
binding.
-    (define-key map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk.
-    (define-key map "\C-c\C-p" 'undefined)
-    (define-key map "\C-c\C-u" 'undefined)
-    (define-key map "\M-a" 'c-beginning-of-statement) ; 2003/10/7
-    (define-key map "\M-e" 'c-end-of-statement)       ; 2003/10/7
-    (define-key map "\C-\M-a" 'c-awk-beginning-of-defun)
-    (define-key map "\C-\M-e" 'c-awk-end-of-defun)
     map)
   "Keymap used in awk-mode buffers.")
+;; Add bindings which are only useful for awk.
+(define-key awk-mode-map "#" 'self-insert-command);Overrides electric parent 
binding.
+(define-key awk-mode-map "/" 'self-insert-command);Overrides electric parent 
binding.
+(define-key awk-mode-map "*" 'self-insert-command);Overrides electric parent 
binding.
+(define-key awk-mode-map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk.
+(define-key awk-mode-map "\C-c\C-p" 'undefined)
+(define-key awk-mode-map "\C-c\C-u" 'undefined)
+(define-key awk-mode-map "\M-a" 'c-beginning-of-statement) ; 2003/10/7
+(define-key awk-mode-map "\M-e" 'c-end-of-statement)       ; 2003/10/7
+(define-key awk-mode-map "\C-\M-a" 'c-awk-beginning-of-defun)
+(define-key awk-mode-map "\C-\M-e" 'c-awk-end-of-defun)
 
 (easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands"
                  (cons "AWK" (c-lang-const c-mode-menu awk)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]