我有一个 XML 文件;在 emacs 23.2 中以 nxml 模式打开。
想将comment-region区域注释为块,而不是注释区域中的每一行。在我看来,它使评论部分更具可读性。
前:

在“评论区域”之后:

期望之后:

在像 JavaScript 和 Java 这样的花括号语言中,comment-region 对每一行进行注释,但我觉得这没问题,因为它使用了单行注释前缀//,它保留了以下内容的可读性。对于 XML,我希望它有所不同。
编辑:
我刚刚看到了 Trey 关于 c-mode 的类似问题的旧答案:C 模式中的 Emacs 评论区域 基本上有一个名为的新模块newcomment.el,它定义了一堆评论样式。
这看起来很有希望,但它没有完全用 nxml-mode 排序。例如,当我尝试box-multi作为一种样式时,注释部分看起来不错,但C-u comment-region并没有反转添加的内容。:/box风格也一样。我会再摆弄一下。
编辑 #2
这是我使用的代码,感谢 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-->"))))))
Run Code Online (Sandbox Code Playgroud)
然后,在我的 nxml-mode-fn 中,我这样做了:
(local-set-key "\C-c\C-c" 'dino-xml-comment-region)
Run Code Online (Sandbox Code Playgroud)
实际行为:

但是要小心:这完全是幼稚的,并且不会试图“逃避”在该区域内开始和停止的干预评论。如果有人想将它添加到上面的代码中,我会很感激,但我自己不会再担心了。
它可能是这样的:
(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 " -->"))))
Run Code Online (Sandbox Code Playgroud)
将其绑定到钩子中的任何键xml-mode...