2010-01-21 16 views
16

Dalla documentazione posso vedere che posso accedere agli argomenti della riga di comando (command-line-args). Vorrei aggiungere i miei argomenti ma Emacs si lamenta all'avvio che non li riconosce.Argomento da riga di comando personalizzato Emacs

E.g.

emacs -my_argument 

ottengo:

 
command-line-1: Unknown option `-my_argument' 

Che cosa è un modo corretto per definire i miei argomenti personalizzati e fornire informazioni per la mia sessione di Emacs? C'è un modo per far apparire un argomento da una riga di comando?

risposta

26

aggiungere qualcosa di simile al tuo ~/.emacs, ~/.emacs.el o ~/.emacs.d/init.el del file:

(defun my-argument-fn (switch) 
    (message "i was passed -my_argument")) 

(add-to-list 'command-switch-alist '("-my_argument" . my-argument-fn)) 

Quindi è possibile eseguire emacs -my_argument e dovrebbe stampare i was passed -my_argument al minibuffer. Puoi trovare ulteriori informazioni nello GNU elisp reference.

8

Come indicato in un altro post, è possibile aggiungere gli switch personalizzati a command-switch-alist ed emacs chiamerà la funzione di gestore per qualsiasi switch di corrispondenza passato nella riga di comando. Tuttavia, questa operazione viene eseguita dopo che il file .emacs è stato valutato. Questo va bene per la maggior parte dei casi, ma potresti desiderare un argomento della riga di comando per modificare il percorso o il comportamento di esecuzione della tua valutazione .emacs; Lo faccio spesso per abilitare/disabilitare i blocchi di configurazione (principalmente per il debug).

Per ottenere ciò è possibile leggere command-line-args e verificare manualmente l'interruttore e quindi eliminarlo dall'elenco, questo si interromperà emacs lamentandosi di un argomento sconosciuto.

(setq my-switch-found (member "-myswitch" command-line-args)) 
(setq command-line-args (delete "-myswitch" command-line-args)) 

che possono alterare il tuo .emacs di valutazione in questo modo:

(unless my-switch-found 
    (message "Didn't find inhibit switch, loading some config.") 
    ...) 

E si potrebbe costruire questo in un unico passaggio:

;; This was written in SO text-box, not been tested. 
(defun found-custom-arg (switch) 
    (let ((found-switch (member switch command-line-args))) 
    (setq command-line-args (delete switch command-line-args)) 
    found-switch)) 

(unless (found-custom-arg "-myswitch") 
    (message "Loading config...") 
    ...) 
+0

testato il codice contrassegnato "non è stata testata". Funziona esattamente come descritto. –

Problemi correlati