Funkcja usuwania wszystkich komentarzy z bufora, bez przenoszenia ich w celu zabicia pierścienia

9

Muszę być w stanie usunąć wszystkie komentarze z bufora z kodu elisp. Na razie używam:

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

Jednak comment-killto interaktywna funkcja, a jego pierwotne zastosowanie to usunąć jeden komentarz na raz. Dodatkowo ma denerwujące widoczne efekty uboczne, ponieważ dodaje wszystkie zabite komentarze do pierścienia zabijania.

Czy jest funkcja pozwalająca usunąć (nie zabić) niektóre lub wszystkie komentarze z bufora?

T. Verron
źródło
Możesz zrobić M-x flush-lines ^\s-*\/\/coś takiego. Nie idealnie, ale może działać czasami.
wvxvw
@wvxvw Dziękujemy za sugestię! Jednak krótko zastanawiałem się nad pójściem w tym kierunku i doszedłem do wniosku, że byłoby to zbyt skomplikowane: linie koloru nie zrobią tego, ponieważ komentarze mogą nie zajmować całej linii (wydaje mi się, że zastąpienie wyrażenia regularnego byłoby OK); co bardziej denerwujące, istnieje kilka składni komentarzy i można je zagnieżdżać, co (prawdopodobnie) jest poza zasięgiem wyrażeń regularnych.
T. Verron,
Z ciekawości, czy chcesz, aby komentarze zostały trwale usunięte, czy po prostu chcesz je tymczasowo usunąć? Czy może po prostu chcesz je ukryć?
Drew

Odpowiedzi:

11

Ogólnie rzecz biorąc, nie ma nic złego w używaniu poleceń jako części kodu elisp. Funkcje przeznaczone wyłącznie do użytku interaktywnego (lub powinny) ostrzec cię przed tym. Zobacz next-linena przykład.

Aby usunąć, zamiast zabijać, upewnij się, że kill-ringnic się nie zmieniło:

(goto-char (point-min))
(let (kill-ring)
  (comment-kill (count-lines (point-min) (point-max))))
Malabarba
źródło
Tak, rozumiem Moim głównym problemem z tym poleceniem jest zabójczy pierścień (na który odpowiadasz) i potencjalne problemy z optymalizacją (które pozostaną potencjalne, jeśli nie będzie nic do porównania).
T. Verron,
7

@ Odpowiedź Malabarby wygląda jak najprostsze i najbardziej eleganckie rozwiązanie. Jeśli jednak zrobisz to na tyle, że uzasadnia to swoją własną funkcję, możesz także dostosować się comment-killdo usuwania bez modyfikowania pierścienia zabijania. Oto kod źródłowy comment-killzmiany jednowierszowej w celu zdefiniowania 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))))

A oto funkcja (Uwaga: minimalnie przetestowana), która zapewnia dodatkowe funkcje, pozwalające na usuwanie komentarzy do bieżącego wiersza, w aktywnym regionie lub w całym buforze:

(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)))))

Nie sprawdziłem problemów z wydajnością, ale być może jest niewielka nierówność, jeśli nie dotkniesz pierścienia zabijania. Niezależnie od tego wątpię, czy zauważysz problemy z wydajnością, chyba że pracujesz z naprawdę ogromnym buforem. Ale ponieważ jest mało prawdopodobne, abyś często używał tej funkcji, wydaje się, że nie warto podejmować wysiłku przy optymalizacji.

Dan
źródło
Och, funkcja jest uruchamiana dość często, a czasem na dużych buforach. Ale maszyny, których są częścią, mają przynajmniej gorsze wąskie gardła, przynajmniej na razie.
T. Verron,