自定义主模式的行结束注释的不同注释开始

时间:2018-03-21 12:57:03

标签: emacs commenting major-mode

当我输入M-;时,会调用comment-dwim,在包含文字且没有活动区域的行上,我相信最终会调用comment-indent来添加内联或结尾在线评论。

在此自定义主要模式中,comment-start设置为"# "comment-style'plain),但这应仅适用于行的最开头。如何从";; "开始获得内嵌评论?

当前行为示例:

# Whole line comment
SOME CODE HERE # in-line comment

所需行为的示例:

# Whole line comment
SOME CODE HERE ;; in-line comment

此外,comment-region在区域从一行的开头开始时效果很好,comment-start总是左对齐。但是,在一行中途,它会以comment-start#)开始评论。

2 个答案:

答案 0 :(得分:1)

您可能需要按照Emacs WikiErgoEmacs所述制作自定义语法表:

例如,对于我的cql模式,我使用以下内容来区分/* .. */的块注释,以及--//的单行/行尾注释。< / p>

(defvar cql-mode-syntax-table
  (let ((st (make-syntax-table)))
    (modify-syntax-entry ?/ ". 124b" st)
    (modify-syntax-entry ?* ". 23" st)
    ;; double-dash starts comments
    (modify-syntax-entry ?- ". 12b" st)
    ;; newline and formfeed end comments
    (modify-syntax-entry ?\n "> b" st)
    (modify-syntax-entry ?\f "> b" st)
    st)
  "Syntax table for CQL mode")

并在派生模式的声明中指定:

(set-syntax-table cql-mode-syntax-table)

在函数modify-syntax-entry的文档中描述了含义:对于/ - 1表示该字符可以开始评论,2表示它也可以是第二个字符序列,4 - 它完成评论,b是它可以是评论类型b。对于*,它表示它可能是评论类型a的第二个或倒数第二个字符(默认类型)。

同样,对于-,它声明它可以是第一个&amp;评论类型b中的第二个字符。

在你的情况下,它可以看起来如下(未经测试):

(defvar some-mode-syntax-table
  (let ((st (make-syntax-table)))
    (modify-syntax-entry ?# ". 1b" st)
    ;; double-; starts comments
    (modify-syntax-entry ?; ". 12b" st)
    ;; newline and formfeed end comments
    (modify-syntax-entry ?\n "> b" st)
    (modify-syntax-entry ?\f "> b" st)
    st)
  "Syntax table for some mode")

答案 1 :(得分:0)

我设法为此写了一个解决方案:

我注意到comment-indent-function是一个变量(来自emacs describe-variable):

  

为评论计算所需缩进的功能。   调用此函数时没有带有点的args   注释的起始分隔符,应该返回所需的   列缩进或零。   如果返回nil,则缩进被委托给`indent-based-to-mode'。

这允许创建一个自定义函数,它可以替换comment-start并返回nil以允许默认缩进,注意当调用此函数时,point将“在...的开头”评论的起始分隔符“(即comment-start的开头)。以下内容现已包含在我的自定义主要模式comment-indent(通过comment-dwim)中,现在可根据需要运行:

;;
(defun my-major-mode ()
  (interactive)
  (kill-all-local-variables)
  ...
  (make-local-variable 'comment-start)
  (make-local-variable 'comment-indent-function)
  (make-local-variable 'comment-indent-start)
  ...
  (setq major-mode 'my-major-mode
    ...
    comment-start "# "
    comment-indent-function 'my-comment-indent
    comment-indent-start ";; "
    )
  ...
)

(defun my-comment-indent ()
  "Replace indented '#' with ';;'"
  (interactive)
  (if (not (looking-back ".\\{1\\}")) ;; if comment is left aligned
      0                               ;; leave it left aligned (return 0)
    (progn                        ;; else: don't return until we're ready
      (looking-at comment-start)            ;; find "#"
      (replace-match comment-indent-start)) ;; replace with ";;"
      nil)))                      ;; return `nil' for default indentation