@ Відповідь Малабарби виглядає як найпростіше і найелегантніше рішення. Однак якщо ви зробите це достатньо, щоб це гарантувало власну функцію, ви також можете адаптуватись 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))))
А ось функція (зверніть увагу: мінімально перевірена), яка забезпечує деяку додаткову функціональність, що дозволяє видаляти коментарі до поточного рядка, в активному регіоні або у всьому буфері:
(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-*\/\/
чи щось для цього. Не досконалий, але міг працювати кілька разів.