当我输入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
(#
)开始评论。
答案 0 :(得分:1)
您可能需要按照Emacs Wiki和ErgoEmacs所述制作自定义语法表:
例如,对于我的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