0

当我输入 时M-;,这会调用comment-dwimwhich 在包含文本且没有活动区域的行上,我相信最终会调用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( #) 开始注释。

4

2 回答 2

1

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

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

(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: for /-1表示字符可以开始注释,2表示它也可以是序列中的第二个字符,4- 它完成注释,b它可以是注释类型b。因为*它说它可能是评论类型a(默认类型)的倒数第二个或倒数第二个字符。

同样,因为-它声明它可以是评论类型中的第一个和第二个字符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")
于 2018-03-21T14:17:00.527 回答
0

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

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

计算评论所需缩进的函数。调用此函数时不带 args,点位于注释的起始分隔符的开头,并且应返回所需的列缩进或 nil。如果返回 nil,缩进将委托给 `indent-according-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
于 2018-03-22T00:24:12.853 回答