Funzione per eliminare tutti i commenti da un buffer, senza spostarli per eliminare l'anello


9

Devo essere in grado di rimuovere tutti i commenti da un buffer dal codice elisp. Per ora, sto usando:

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

Tuttavia, comment-killè una funzione interattiva e il suo utilizzo principale è eliminare un commento alla volta. Inoltre, ha fastidiosi effetti collaterali visibili, poiché aggiunge tutti i commenti che ha ucciso al kill-ring.

Esiste una funzione che consente di eliminare (non eliminare) alcuni o tutti i commenti da un buffer?


Si potrebbe fare M-x flush-lines ^\s-*\/\/o qualcosa in tal senso. Non perfetto, ma potrebbe funzionare alcune volte.
wvxvw,

@wvxvw Grazie per il suggerimento! Tuttavia, avevo brevemente considerato di andare in questo modo, e ho concluso che sarebbe stato troppo complicato: le linee di colore non lo faranno, perché i commenti potrebbero non prendere l'intera linea (suppongo che sostituire-regexp sia OK); più fastidiosamente, ci sono diverse sintassi per i commenti, e possono essere nidificati, rendendolo (probabilmente) fuori dalla portata di regexps.
T. Verron,

Per curiosità, vuoi che i commenti vengano rimossi in modo permanente o vuoi semplicemente toglierli di mezzo temporaneamente? Vuoi forse solo nasconderli?
Disegnato il

Risposte:


11

In generale, non c'è niente di sbagliato nell'usare i comandi come parte del codice elisp. Quelle funzioni che sono pensate solo per un uso interattivo ti avvertiranno (o dovrebbero). Vedi next-lineper esempio.

Per eliminare, invece di uccidere, assicurati solo che kill-ringnon sia cambiato:

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

Sì, ho capito. Il mio problema principale con questo comando è il kill-ring (a cui rispondi) e i potenziali problemi di ottimizzazione (che rimarranno potenziali se non c'è nulla da confrontare).
T. Verron,

7

La risposta di @ Malabarba sembra la soluzione più semplice ed elegante. Tuttavia, se lo fai abbastanza da giustificare la propria funzione, puoi anche adattarti comment-killall'eliminazione senza modificare l'anello di eliminazione. Ecco il codice sorgente di comment-killcon la modifica a riga singola per definire 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))))

Ed ecco una funzione (NB: minimamente testata) che fornisce alcune funzionalità aggiuntive, che consente di eliminare i commenti sulla riga corrente, nella regione attiva o nell'intero buffer:

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

Non ho verificato i problemi di prestazioni, ma forse c'è un piccolo urto nel non toccare l'anello mortale. Indipendentemente da ciò, dubito che noterai problemi di prestazioni a meno che tu non stia lavorando con un buffer davvero enorme. Ma poiché è improbabile che tu usi questa funzione molto frequentemente, sembra che non varrebbe la pena lavorare sull'ottimizzazione.


Oh, la funzione viene eseguita abbastanza spesso e talvolta su buffer di grandi dimensioni. Ma il macchinario di cui fa parte presenta alcuni colli di bottiglia peggiori, almeno per ora.
T. Verron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.