Функція видаляти всі коментарі з буфера, не переміщуючи їх, щоб знищити дзвінок


9

Мені потрібно мати можливість видалити всі коментарі з буфера з коду elisp. Зараз я використовую:

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

Однак comment-killце інтерактивна функція, і її основне використання - це видалення одного коментаря за раз. Крім того, він має роздратовані видимі побічні ефекти, оскільки додає всі коментарі, які він убив, до кільця.

Чи є функція, яка дозволяє видалити (не вбити) деякі або всі коментарі з буфера?


Ви можете зробити M-x flush-lines ^\s-*\/\/чи щось для цього. Не досконалий, але міг працювати кілька разів.
wvxvw

@wvxvw Дякую за пропозицію! Однак я коротко подумав про те, щоб піти цим шляхом, і прийшов до висновку, що це буде занадто складно: флеш-рядки не будуть робити, тому що коментарі можуть зайняти не всю лінію (замінити-регулярний випадок, я думаю, добре); що більше дратує, є кілька синтаксисів коментарів, і вони можуть бути вкладені, роблячи це (ймовірно) поза зоною дії регулярних виразів.
Т. Веррон

Чи не хочете ви, щоб коментарі були видалені назавжди або ви хочете тимчасово їх усунути? Ви, можливо, просто хочете їх приховати?
Дрю

Відповіді:


11

Взагалі, нічого поганого в тому, щоб використовувати команди як частину коду elisp. Ті функції, які призначені лише для інтерактивного використання, попередить вас про це. Дивіться, next-lineнаприклад.

Щоб видалити, а не вбивати, переконайтесь, що kill-ringце не змінено:

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

Так, я розумію. Моя головна проблема з цією командою - це кільце (в якому ви відповідаєте) і потенційні проблеми оптимізації (які залишаться потенційними, якщо з чим порівняти не можна).
Т. Веррон

7

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

Я не перевіряв проблеми з продуктивністю, але, можливо, є крихітний удар від того, щоб не торкатися кільця вбивства. Незважаючи на це, я сумніваюся, ви помітите проблеми з продуктивністю, якщо ви не працюєте з справді масивним буфером. Але оскільки ви навряд чи дуже часто використовуєте цю функцію, здається, що не варто докладати зусиль для оптимізації.


О, функція буде працювати досить часто, а іноді і на великих буферів. Але техніка, до якої вона входить, має ще гірші вузькі місця, принаймні поки що.
Т. Веррон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.