【问题标题】:emacs function to uncomment regardless of mode无论模式如何,emacs 功能都可以取消注释
【发布时间】:2012-10-14 22:28:21
【问题描述】:

主要目标:制作适用于任何模式的智能“取消注释”功能。

(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(在emacs lisp 中将返回“;”) ,转到beginning-of-line 并删除该字符。想法?

编辑:以下评论中要求的更多说明如下。我想做一个函数:

1) 如果选择了一个区域,则删除 cmets(这里 uncomment-region 或 comment-dwim 将按照 Patrick 所指出的那样工作)

否则:

2) 如果该点所在行的第一个字符是注释字符,则删除注释字符。

否则:

3) 搜索当前行的注释(不包括\%\;,取决于模式),向上移动到注释并终止以注释符号开头的行。

我看不出您希望它如何以不同的方式工作。然后可以将其绑定到一个键以简单地删除 cmets,具体取决于模式,使用 comment-start 来识别注释字符。

【问题讨论】:

  • M-x uncomment-region 有什么问题?
  • 我有点想要一些修改过的行为。但我认为这是一个很好的起点。在评论“;”的情况下缺少的是“如果”上线后,我更希望它杀死 ;. 之后的部分
  • 我相信它应该是这个顺序:1)如果选择了一个区域,那么这确实有效。如果未选择任何内容,则 2) 检查行首字符是否 = 注释字符(如果是,则删除)。 3)如果没有选择任何内容,并且行首没有注释,则增量搜索到注释字符,然后对其进行kill-line。这似乎是最好的功能类型。
  • 现在卡在增量搜索中 :(
  • 还可以查看C-h f comment-dwim,您需要为该命令指定一个区域,但您可以查看定义函数的文件 newcomment.el 以至少了解它是如何工作的。

标签: emacs comments equals region


【解决方案1】:

我将此作为替代答案发布,因为您尝试做的部分工作已经通过comment-dwim 命令完成。从文档中(您可以使用 C-h f comment-dwim 找到它)

comment-dwim 是一个交互式编译的 Lisp 函数 `newcomment.el'。

绑定到M-;

(comment-dwim ARG)

调用你想要的评论命令(按我的意思做)。
如果该区域处于活动状态并且 transient-mark-mode 已打开,请致电 comment-region(除非它只包含 cmets,其中 它调用uncomment-region)。
否则,如果当前行为空,则调用comment-insert-comment-function 如果已定义,则插入注释并缩进。 否则,如果指定了前缀 ARG,请调用 comment-kill。 否则,请致电comment-indent
您可以配置comment-style 来更改区域的评论方式。

所以为了使用它,只需使用C-SPC(set-mark-command)选择一个区域并将插入符号移动到另一点并运行comment-dwim

【讨论】:

  • +1,虽然这不是答案。我的代码已经对“区域”进行了适当的处理。我的问题更多是处理其他情况。
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多