主要目标:制作适合任何模式的智能“取消注释”功能。
(defun uncomment-mode-specific ()
(interactive)
(if (region-active-p)
(comment-region (region-beginning) (region-end) -1) ; so far so good
(if (= ";" (line-beginning-position)) ; here is the problem
(message "successful")
(message "unsuccessful"))
))
在if
语句中,我想检查该行的第一个字符的值,以及equals
变量comment-start
(它将返回“{{ 1)}“在emacs lisp中”,转到;
并删除该字符。想法?
编辑:根据以下评论中的要求进行更多说明。我想要一个功能:
1)如果选择了某个区域,请删除评论(这里注释为取消评论区域或评论-dwim将如Patrick所指出的那样)
ELSE:
2)如果该点的第一个字符是注释字符,请删除注释字符。
ELSE:
3)搜索当前行以进行评论(不包括beginning-of-line
或\%
,取决于模式),向上移动以评论并从评论标记开始删除该行。
我看不出你希望这种方式有何不同。然后可以绑定到一个键,只需删除注释,具体取决于模式,使用\;
来标识注释字符。
答案 0 :(得分:3)
我将此作为替代答案发布,因为您尝试执行的操作已部分使用comment-dwim
命令完成。从文档(您可以使用C-h f comment-dwim
)
comment-dwim是一个交互式编译的Lisp函数 `newcomment.el”。
它与
M-;
绑定。(comment-dwim ARG )
调用你想要的评论命令(做我的意思) 如果该区域处于活动状态且
transient-mark-mode
已启用,请致电comment-region
(除非它只包含评论,其中 它调用uncomment-region
)。
否则,如果当前行为空,请致电comment-insert-comment-function
如果已定义,则插入注释并缩进。 否则,如果指定了前缀 ARG ,请致电comment-kill
。 否则,请致电comment-indent
您可以配置comment-style
来更改区域的评论方式。
因此,为了使用它,只需选择一个C-SPC
区域(set-mark-command)并将插入符号移动到另一个点并运行comment-dwim
。