Funktion zum Löschen aller Kommentare aus einem Puffer, ohne sie zu verschieben, um den Ring zu beenden


9

Ich muss in der Lage sein, alle Kommentare aus einem Puffer aus dem Elisp-Code zu entfernen. Im Moment benutze ich:

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

Es handelt sich jedoch comment-killum eine interaktive Funktion, deren Hauptverwendung darin besteht, jeweils einen Kommentar zu löschen. Darüber hinaus hat es störende sichtbare Nebenwirkungen, da es alle Kommentare, die es getötet hat, zum Kill-Ring hinzufügt.

Gibt es eine Funktion, mit der einige oder alle Kommentare aus einem Puffer gelöscht (nicht getötet) werden können?


Sie könnten M-x flush-lines ^\s-*\/\/oder etwas in diesem Sinne tun . Nicht perfekt, könnte aber manchmal funktionieren.
wvxvw

@wvxvw Danke für den Vorschlag! Ich hatte jedoch kurz überlegt, diesen Weg zu gehen, und kam zu dem Schluss, dass dies zu kompliziert wäre: Flush-Zeilen reichen nicht aus, da Kommentare möglicherweise nicht die gesamte Zeile einnehmen (Ersetzen-Regexp wäre in Ordnung, denke ich). ärgerlicher ist, dass es mehrere Syntax für Kommentare gibt, die verschachtelt werden können, sodass sie (wahrscheinlich) außerhalb der Reichweite von regulären Ausdrücken liegen.
T. Verron

Möchten Sie aus Neugier die Kommentare dauerhaft entfernen oder möchten Sie sie nur vorübergehend aus dem Weg räumen? Willst du sie vielleicht nur verstecken?
Drew

Antworten:


11

Im Allgemeinen ist es nichts Falsches, Befehle als Teil des Elisp-Codes zu verwenden. Die Funktionen, die nur für den interaktiven Gebrauch bestimmt sind, werden (oder sollten) Sie davor warnen. Siehe next-linezum Beispiel.

Um zu löschen, anstatt zu töten, stellen Sie einfach sicher, dass das kill-ringnicht geändert wird:

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

Ja, das verstehe ich. Mein Hauptproblem bei diesem Befehl ist der Kill-Ring (den Sie beantworten) und potenzielle Optimierungsprobleme (die potenziell bleiben, wenn es nichts Vergleichbares gibt).
T. Verron

7

@ Malabarbas Antwort scheint die einfachste und eleganteste Lösung zu sein. Wenn Sie dies jedoch so weit tun, dass eine eigene Funktion gewährleistet ist, können Sie sich auch comment-killan das Löschen anpassen , ohne den Kill-Ring zu ändern. Hier ist der Quellcode von comment-killmit der einzeiligen Änderung zu definieren 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))))

Und hier ist eine Funktion (NB: minimal getestet), die einige zusätzliche Funktionen bietet, mit denen Sie Kommentare in der aktuellen Zeile, im aktiven Bereich oder im gesamten Puffer löschen können:

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

Ich habe Leistungsprobleme nicht überprüft, aber vielleicht gibt es eine kleine Beule, wenn ich den Kill Ring nicht berühre. Unabhängig davon bezweifle ich, dass Sie Leistungsprobleme bemerken werden, wenn Sie nicht mit einem wirklich massiven Puffer arbeiten. Da es jedoch unwahrscheinlich ist, dass Sie diese Funktion sehr häufig verwenden, lohnt es sich anscheinend nicht, an der Optimierung zu arbeiten.


Oh, die Funktion wird ziemlich oft ausgeführt und manchmal auf großen Puffern. Aber die Maschinerie, zu der es gehört, hat zumindest vorerst einige schlimmere Engpässe.
T. Verron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.