2012-07-20 15 views
6

versuchte ich meine ersten Schritte mit Emacs Lisp das Element "\\.synctex\\.gz" von LaTeX-clean-intermediate-suffixes zu entfernen: hieremacs lisp: Wie man ein Element einer Liste entfernt/löscht?

(eval-after-load 'latex 
    '(setq my-LaTeX-clean-intermediate-suffixes (remove '"\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)); that's not working 
    '(setq LaTeX-clean-intermediate-suffixes 
    (append my-LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

Wie kann ich entfernen dieses Element? Ich fand remove und delete, versuchte sie beide, aber ich bekomme eine -Art von Fehler.

aktualisieren

habe ich versucht, dies:

(eval-after-load 'latex 
    (setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)) 
    '(setq LaTeX-clean-intermediate-suffixes 
    (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

aber ich erhalte eine recht lange Ausgabe in Backtrace :-(

+0

Sieht so aus, als hätten Sie nur einen Abstandsfehler. Entfernen Sie den zusätzlichen Abstand von: 'LaTeX-clean-intermediate-suffixes 'und Sie sollten in Ordnung sein. – assem

+0

Das war irgendwie ein Kopier- und Einfügefehler, das hatte ich nicht im Code. Ich werde das oben ändern. –

Antwort

4

Der angezeigte Fehler ist nicht auf Manipulationen der Liste zurückzuführen, sondern auf eine falsche Verwendung von eval-after-load. Diese Funktion erlaubt nur zwei Parameter: (eval-after-load FILE FORM). So sollte Ihr Snippet lesen entweder

(eval-after-load 'latex 
    '(setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes) 
     LaTeX-clean-intermediate-suffixes (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml")))) 

oder die allgemeinere Variante (subsumieren so viele Formen, wie Sie in einem einzigen progn wollen) (als mehrere Zuweisungen in einer einzigen setq Anweisung erlaubt):

(eval-after-load 'latex 
    '(progn 
    (setq LaTeX-clean-intermediate-suffixes (delete "\\.synctex\\.gz" LaTeX-clean-intermediate-suffixes)) 
    (setq LaTeX-clean-intermediate-suffixes (append LaTeX-clean-intermediate-suffixes (list "-blx\\.bib" "\\.run\\.xml"))))) 
12

Wie Assem darauf hingewiesen hat, scheint es zusätzliche Leerzeichen in Ihrem Code zu geben, die den ansonsten korrekten Aufruf von remove verhindern.

Beachten Sie, dass sowohl delete als auch remove für solche Zwecke funktionieren, solange die Elemente der Liste über equal, die für beide verwendet wird, korrekt verglichen werden können. Wenn Sie stattdessen einen Vergleich mit eq durchführen möchten, verwenden Sie die Funktionen delq oder remq.

Die wichtigsten Unterschiede zwischen delete und remove (oder delq und remq respectively) ist, dass delete das gegebene Element durch Nebenwirkung entfernt, dh, ändert sich die gegebene Liste an Ort und Stelle, während remove nicht der Fall ist, sondern eine Kopie des gegebenen zurück Liste mit dem entfernten Element.

(setq list1 '("foo" "bar" "baz")) 
(setq list2 (remove "bar" list1)) 

(message "list1: %s" list1) 
(message "list2: %s" list2) 

(setq list3 (delete "bar" list1)) 

(message "list1: %s" list1) 
(message "list3: %s" list3) 

Wenn Sie den obigen Code zu bewerten, müssen Sie die folgende Ausgabe in Ihrem *Message* Puffer finden:

list1: (foo bar baz) 
list2: (foo baz) 
list1: (foo baz) 
list3: (foo baz) 

Wie Sie sehen können, nachdem remove auf list1 Aufruf, es hat sich nicht geändert. Aber nachdem du delete darauf angerufen hast, hat es sich geändert.

Verwandte Themen