Мне нужно иметь возможность удалить все комментарии из буфера из кода elisp. На данный момент я использую:
(goto-char (point-min))
(comment-kill (count-lines (point-min) (point-max)))
Однако comment-kill
это интерактивная функция, и ее основным назначением является удаление одного комментария за раз. Кроме того, он имеет раздражающие видимые побочные эффекты, поскольку добавляет все убитые комментарии в список уничтожений.
Есть ли функция, позволяющая удалять (не убивать) некоторые или все комментарии из буфера?
M-x flush-lines ^\s-*\/\/
или что-то на этот счет. Не идеально, но может работать несколько раз.Ответы:
В общем, нет ничего плохого в использовании команд как части кода elisp. Те функции, которые предназначены только для интерактивного использования, будут (или должны) предупреждать вас об этом. Смотри
next-line
например.Чтобы удалить, а не убивать, просто убедитесь, что
kill-ring
это не изменилось:источник
Ответ @ Малабарбы выглядит как самое простое и элегантное решение. Однако, если вы сделаете это достаточно для того, чтобы это оправдывало его собственную функцию, вы также можете адаптироваться
comment-kill
к удалению без изменения списка уничтожений. Вот исходный кодcomment-kill
с однострочным изменением для определенияcomment-delete
:А вот функция (примечание: минимально проверено), которая предоставляет некоторые дополнительные функции, позволяющие удалять комментарии в текущей строке, в активной области или во всем буфере:
Я не проверял проблемы с производительностью, но, возможно, есть небольшой удар от не касания кольца уничтожения. Несмотря на это, я сомневаюсь, что вы заметите проблемы с производительностью, если вы не работаете с действительно большим буфером. Но так как вы вряд ли будете использовать эту функцию очень часто, похоже, что не стоит тратить усилия на оптимизацию.
источник