@Malabarbaの答えは、最も単純で最もエレガントなソリューションのようです。ただし、独自の機能が保証されるほど十分にこれを行う場合はcomment-kill
、キルリングを変更せずに削除に適応することもできます。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)))))
パフォーマンスの問題は確認していませんが、キルリングに触れていないことによる小さな問題があるかもしれません。とにかく、本当に大規模なバッファで作業しているのでない限り、パフォーマンスの問題に気付くことはないでしょう。しかし、この関数を頻繁に使用する可能性は低いため、最適化に取り組む価値はないと思われます。
M-x flush-lines ^\s-*\/\/
か、その効果に何か。完璧ではありませんが、うまくいく場合もあります。