2015-03-22 25 views
11

This Stack Overflow answer mi ha detto che posso impostare la dimensione del carattere di Emacs con set-face-attribute:Perché alcune funzioni di Emacs non sono disponibili tramite `M-x`?

(set-face-attribute 'default nil :height 100) 

I commenti rivelano che non è possibile eseguire set-face-attribute con Mx:

M-x set-face-attribute [No match]

Invece, devi eseguirlo con M-::

Eval: (set-face-attribute 'default nil :height 100)

Perché alcuni comandi, come set-face-attribute, non disponibile tramite M-x?

+0

Questa domanda è stata ampliata dalla domanda [DavidS] (http://stackoverflow.com/users/201891/davids) in [questo commento] (http://stackoverflow.com/questions/294664/how-to -set-la-font-size-in-emacs # comment46074287_296316). –

risposta

21
  • M-x è destinato al comando execute-extended-command, che consente di digitare il nome di un comando e lo esegue.
  • M-: è destinato al comando eval-expression, che consente di digitare un arbitrario S-espressione contenente funzione chiamate e lo valuta.

funzioni, che è possibile chiamare tramite M-:, vengono utilizzati per implementare le caratteristiche di Emacs, le personalizzazioni (come ad esempio nel vostro .emacs), e plugin. Gli argomenti delle funzioni vengono normalmente passati chiamando la funzione in un'espressione S.

Qualsiasi funzione può anche essere un comando se ha un modulo interactive nella sua definizione. Il modulo interactive descrive come la funzione dovrebbe ottenere i suoi argomenti quando viene chiamata come comando. Ad esempio, se la funzione ha (interactive "bGive me a buffer: ") nella sua definizione, la funzione sarà chiamabile con M-x. Quando l'utente chiama la funzione con M-x, Emacs richiederà all'utente un nome di buffer (a causa dello b) e il nome che digitano verrà passato come argomento alla funzione.

Il punto in cui si esegue un comando di una funzione è rendere semplice la chiamata agli utenti finali, non solo per i programmatori Emacs Lisp. I comandi (eseguito con M-x) sono più facili da eseguire in modo interattivo in questi modi:

  • Non è necessario circondare il nome del comando con () per renderlo un S-espressione valida.
  • Gli argomenti possono essere passati automaticamente (come la posizione del cursore), oppure è possibile richiederli in modo da non dover ricordare quali argomenti sono necessari.
  • Quando viene richiesto un argomento, è possibile completarlo automaticamente, poiché lo code characters del modulo (ad esempio b) specifica quale tipo di input attendersi.

La ragione per cui non si può chiamare la funzione set-face-attribute con M-x è che la sua definizione non contiene una forma interactive, e così set-face-attribute non è un comando. Devi chiamarlo come una funzione semplice, nelle espressioni S. Puoi farlo dal minibuffer con M-: o da altri luoghi con uno qualsiasi degli altri ways of evaluating code.


Emacs Mini Manual → Concepts → Command ha una breve spiegazione diversamente formulazione della differenza tra le funzioni e comandi normali. Relationship between Emacs functions and commands spiega alcuni dettagli non in questa risposta.

+1

Buona iniziativa per metterlo in un'altra domanda. Tecnicamente la tua risposta è ottima, ma, per completezza, aggiungerei che dal punto di vista dell'esperienza utente non è saggio esporre tutte le funzioni come comandi: questo ingombra lo spazio dei nomi e rende il completamento automatico meno utile. Pertanto la maggior parte delle funzioni non sono disponibili tramite M-x (a mio parere, ci sono ancora troppi comandi per un essere umano da ricordare in là;)) – Vasiliy

Problemi correlati