2012-07-20 4 views
6

ho cercato i miei primi passi con Emacs Lisp per rimuovere l'elemento "\\.synctex\\.gz" da LaTeX-clean-intermediate-suffixes:emacs lisp: Come rimuovere/eliminare un elemento di una lista?

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

Come posso rimuovere questo elemento qui? Ho trovato remove e delete, li ho provati entrambi, ma ottengo un errore di tipo wrong-number-of-arguments.

Aggiornamento

ho provato questo:

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

ma ricevo una lunga uscita del tutto in Backtrace :-(

+0

Sembra che tu abbia appena un errore di spaziatura. Rimuovi la spaziatura extra di: 'LaTeX-clean-intermediate-suffixes' e dovresti stare bene. – assem

+0

Questo era in qualche modo un errore di copia e incolla, non avevo questo nel codice. Cambierò quanto sopra. –

risposta

4

L'errore visualizzato non è dovuto a manipolazioni della lista ma a causa di un utilizzo errato di eval-after-load. Questa funzione consente solo due parametri: (eval-after-load FILE FORM). Così il vostro frammento dovrebbe leggere sia

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

(come assegnazioni multiple sono consentite in un unico prospetto setq) oppure la variante più generale (sussumere il maggior numero di forme come si desidera all'interno di un singolo progn):

(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

Come sottolineato da Assem, sembra che ci siano degli spazi supplementari nel codice che impediscono l'invocazione altrimenti corretta di remove.

Nota che sia delete e remove funzionano per tali scopi, purché gli elementi dell'elenco possano essere confrontati correttamente tramite equal che viene utilizzato per entrambi. Se si desidera confrontare utilizzando eq, utilizzare le funzioni delq o remq.

Le principali differenze tra (rispettivamente o delq e remq) delete e remove è che delete rimuove l'elemento in effetto collaterale, cioè, cambia la lista fornita sul posto, mentre remove non fa invece restituisce una copia della proposta lista con l'elemento rimosso.

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

Se si valuta il codice di cui sopra, troverete il seguente output nel vostro *Message* buffer:

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

Come si può vedere, dopo aver chiamato remove su list1, esso non è cambiato. Ma dopo aver chiamato delete su di esso, è cambiato.