【问题标题】:In emacs, can I get comment-region to use a block comment instead of commenting each line?在emacs中,我可以让comment-region使用块注释而不是注释每一行吗?
【发布时间】:2013-06-10 16:25:48
【问题描述】:

我有一个 XML 文件;在 emacs 23.2 中以 nxml 模式打开。

希望comment-region 将该区域作为一个块进行注释,而不是对该区域中的每一行进行注释。在我看来,它使评论部分更具可读性。

之前:

在`comment-region'之后:

希望之后:

在 JavaScript 和 Java 等花括号语言中,comment-region 对每一行都进行了匹配,但我觉得这没问题,因为它使用单行注释前缀 // ,这样可以保留以下内容的可读性。对于 XML,我希望它有所不同。


编辑

我刚刚看到 Trey 关于 c-mode 的类似问题的旧答案:Emacs comment-region in C mode 基本上有一个名为 newcomment.el 的新模块定义了一堆评论样式。

这看起来很有希望,但它没有使用 nxml-mode 完全排序。例如,当我尝试将box-multi 作为一种样式时,评论部分看起来不错,但C-u comment-region 并没有反转添加的内容。 :/ 与box 样式类似。我会再摆弄它一些。


编辑#2

这是我使用的代码,thanks to Alex Ott

(defun dino-xml-comment-region (beg end &optional arg)
  (interactive "*r\nP")
  (if (> beg end)
      (let (tmp) (setq tmp beg beg end end tmp)))
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (cond
       ;; is there a C-u prefix?
       ((and (listp arg) (> (length arg) 0))
        (and (re-search-forward "<!-- *[\n\r]" nil t)
             (goto-char (- (point-max) 1))
             (re-search-backward " *-->" nil t)
             (goto-char (point-min))
             (progn
               (re-search-forward "<!-- *[\n\r]" nil t)
               (replace-match "")
               (goto-char (- (point-max) 1))
               (re-search-backward "[\n\r] *-->" nil t)
               (replace-match ""))))

       (t
        (insert "<!--\n")
        (goto-char (- (point-max) 1))
        (unless (= 10 (following-char))
          (forward-char))
        (insert "\n-->"))))))

然后,在我的 nxml-mode-fn 中,我这样做了:

(local-set-key "\C-c\C-c"  'dino-xml-comment-region)

实际行为:

但要小心:这完全是幼稚的,并且不会尝试“逃避”该区域内的干预评论开始和停止。如果有人想把它添加到上面的代码中,我会很感激,但我自己不会再担心了。

【问题讨论】:

  • @wvxvw - 噢噢噢,那是一件可悲的事情。你只是在逗我。

标签: xml emacs


【解决方案1】:

可能是这样的:

(defun xml-comment-region (beg end &optional arg)
  (interactive "*r\nP")
  (if (> beg end)
      (let (mid) (setq mid beg beg end end mid)))
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (insert "<!-- ")
      (goto-char (- (point-max) 1))
      (unless (= 10 (following-char))
    (forward-char))
      (insert " -->"))))

将其绑定到xml-mode钩子中的任何键...

【讨论】:

  • 谢谢亚历克斯。我稍微修改了一下以获得我的解决方案。
【解决方案2】:

你可能会从类似的东西中获得一些里程

(add-hook 'nxml-mode-hook
          (lambda ()
            (set (make-local-variable 'comment-style) 'multi-line)
            (set (make-local-variable 'comment-continue) " ")))

【讨论】:

  • 效果很好,@Stefan,谢谢。唯一的问题是,当删除 cmets 时,XML 完全没有格式化,所有以前的缩进都消失了,每个尖括号都移到了第 0 列。一个不幸的副作用。我也会玩这个。我可以通过在事后建议中重新缩进该区域来修复它。
猜你喜欢
  • 2017-03-30
  • 2021-08-17
  • 2016-10-17
  • 2020-09-22
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多