【问题标题】:Different comment-start for end of line comments for custom major-mode自定义主要模式的行尾注释的不同注释开始
【发布时间】:2018-03-21 12:57:03
【问题描述】:

当我输入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 (#) 开始注释。

【问题讨论】:

  • 如果你从SOME CODE HERE in-line-comment 开始,然后选择in-line comment 并点击M-; 我强烈怀疑你会看到“comment-region doesn't 工作完美"。
  • @Stefan 我明白你的意思。直到此刻,我从未在一行中途使用过comment-region。我会相应地进行编辑。

标签: emacs comments major-mode


【解决方案1】:

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

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

(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(默认类型)的倒数第二个字符。

同样,对于-,它声明它可以是注释类型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")

【讨论】:

  • 好的,谢谢指点。不过,语法表对在 comment-dwim 中创建/检测 cmets 的方式没有影响。
【解决方案2】:

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

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

计算评论所需缩进的函数。 这个函数在没有参数的情况下被调用,点在开头 注释的起始分隔符,应返回所需的 列缩进或无。 如果返回 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

【讨论】:

  • 功能有点原始,但确实可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2023-03-27
  • 2015-03-30
相关资源
最近更新 更多