用于删除缓冲区中所有注释的功能,而无需移动它们以杀死响铃


9

我需要能够从elisp代码中删除缓冲区中的所有注释。目前,我正在使用:

(goto-char (point-min))
(comment-kill (count-lines (point-min) (point-max)))

但是,它comment-kill是一种交互式功能,其主要用途是一次删除一个注释。此外,它还具有令人讨厌的可见副作用,因为它会将杀死的所有注释添加到杀死环中。

是否有功能允许从缓冲区中删除(或杀死)部分或全部注释?


您可以这样做M-x flush-lines ^\s-*\/\/或采取某些措施。并不完美,但可以正常工作。
wvxvw 2014年

@wvxvw谢谢你的建议!但是,我曾短暂地考虑过这种方法,并得出结论认为这太复杂了:刷新行不会这样做,因为注释可能不会占据整行(我猜替换正则表达式可以)。更烦人的是,注释有几种语法,可以将它们嵌套,使它(可能)超出正则表达式的范围。
T. Verron 2014年

出于好奇,您是要永久删除这些评论,还是只是想暂时删除它们?您也许只想隐藏它们?
Drew

Answers:


11

通常,将命令用作elisp代码的一部分没有任何问题。这些仅用于交互式使用的功能将(或应该)向您发出警告。next-line例如参见 。

为了删除而不是杀死,只需确保kill-ring未更改:

(goto-char (point-min))
(let (kill-ring)
  (comment-kill (count-lines (point-min) (point-max))))

是的,我明白了。我使用此命令的主要问题是杀手环(您要回答)和潜在的优化问题(如果没有可比的地方,则可能仍然存在)。
T. Verron 2014年

7

@Malabarba的答案似乎是最简单,最优雅的解决方案。但是,如果执行此操作足以保证它自己的功能,则还可以comment-kill在不修改kill ring的情况下适应删除操作。这是通过comment-kill单行更改来定义的源代码 comment-delete

(defun comment-delete (arg)
  "Delete the first comment on this line, if any.  Don't touch
the kill ring.  With prefix ARG, delete comments on that many
lines starting with this one."
  (interactive "P")
  (comment-normalize-vars)
  (dotimes (_i (prefix-numeric-value arg))
    (save-excursion
      (beginning-of-line)
      (let ((cs (comment-search-forward (line-end-position) t)))
    (when cs
      (goto-char cs)
      (skip-syntax-backward " ")
      (setq cs (point))
      (comment-forward)
      ;; (kill-region cs (if (bolp) (1- (point)) (point))) ; original
      (delete-region cs (if (bolp) (1- (point)) (point)))  ; replace kill-region with delete-region
      (indent-according-to-mode))))
    (if arg (forward-line 1))))

这是一个提供一些附加功能的函数(NB:经过最少测试),使您可以删除当前行,活动区域或整个缓冲区中的注释:

(defun comment-delete-dwim (beg end arg)
  "Delete comments without touching the kill ring.  With active
region, delete comments in region.  With prefix, delete comments
in whole buffer.  With neither, delete comments on current line."
  (interactive "r\nP")
  (let ((lines (cond (arg
                      (count-lines (point-min) (point-max)))
                     ((region-active-p)
                      (count-lines beg end)))))
    (save-excursion
      (when lines
        (goto-char (if arg (point-min) beg)))
      (comment-delete (or lines 1)))))

我还没有检查过性能问题,但是也许没有碰到杀戮圈有一点点麻烦。无论如何,除非您使用真正的大型缓冲区,否则我怀疑您会注意到性能问题。但是由于您不太可能经常使用此功能,因此进行优化似乎不值得。


呵呵,功能在大的缓冲区相当经常跑,有时。但是,至少到目前为止,它所包含的机器存在一些更严重的瓶颈。
T. Verron 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.