2009-06-26 8 views
4

La ligne estImpossible de comprendre une ligne d'Emacs Lisp

function info() { 
    emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))" 
} 

Je sais de manuels

PROGN

progn est une forme particulière dans `C code source '.

setq

setq est une forme particulière dans le code source de `C ». (setq SYM VAL SYM VAL ...)

Définissez chaque SYM sur la valeur de son VAL. Les symboles SYM sont des variables; ils sont littéraux (non évalués). Les valeurs VAL sont des expressions; ils sont évalués. Ainsi, (setq x (1+ y)) définit x' to the value of (1+ y) '. La seconde validation VAL n'est pas calculée avant que le premier SYM ne soit défini, et ainsi de suite; chaque VAL peut utiliser la nouvelle valeur des variables définie précédemment dans le formulaire setq'. The return value of the setq 'est la valeur de la dernière VAL.

$ semble une référence au premier paramètre après la commande man que l'utilisateur donne.

'bully semble être une variable aléatoire.

Man-notify-method semble être une fonction d'action qui est exécutée lorsque la commande man est exécutée.

-eval semble être un statmant d'évaluation qui dit à Emacs d'exécuter l'instruction qui le suit.

Cependant, je ne suis pas complètement sûr de la fonction.

J'ai besoin de comprendre la fonction, puisque je veux lier un code bash de la mienne à la fonction d'action de l'homme. Man-notify-method semble être cette fonction d'action, au moins dans Emacs.

Comment comprenez-vous la ligne d'Emacs Lisp?

Répondre

6

PROGN évalue simplement les expressions dans l'ordre, renvoyant la valeur de retour du dernier.

SETQ est l'opérateur d'affectation de base.

INFO ouvre le navigateur d'informations emacs. Donc, ce que cela fait est d'abord affecter le symbole 'bully à la variable Man-notify-method, puis entrez dans le navigateur d'informations. 'bully est probablement le nom d'une fonction, et Man-notify-method un endroit où le navigateur d'informations recherche une fonction pour appeler une notification (Attention: je devine juste ici).

Je suppose que vous devrez définir votre propre fonction qui appelle votre commande shell comme ceci:

(defun my-cmd() 
    (call-process ; Look up the syntax in the emacs lisp manual 
)) 

puis attribuez-lui son symbole à Man-notify-method:

(setq Man-notify-method 'my-cmd) 
+0

J'accepte cette réponse, car il est compact. La réponse d'Adam est également excellente. --- Merci pour vos réponses! –

12

Le code que vous avez publié est une combinaison de script shell et d'élisp.

function info() 
{ 
    emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))" 
} 

Ceci définit une fonction de script shell nommée info. Il prend 1 paramètre, nommé $1. Lorsque vous appelez cette fonction (disons d'un autre script shell), la valeur de l'argument est remplacée par $1 et exécute les commandes spécifiées dans la séquence.Donc, si vous deviez appeler comme ceci:

info("something") 

le shell exécuter cette commande:

emacs -eval "(progn (setq Man-notify-method 'bully) (info \"something\"))" 

Cela appelle les emacs exécutables avec deux arguments, -eval et la chaîne de commande, qui contient intégré citations échappées. Cette demande emacs d'invoquer le code elisp suivant:

(progn (setq Man-notify-method 'bully) (info "something")) 

progn est une forme particulière . Les formulaires spéciaux évaluent leurs arguments différemment des appels de fonction normaux. Vous pouvez trouver la documentation pour progn dans chapter 10.1 of the GNU Emacs Lisp Reference Manual. progn est une construction simple pour exécuter une séquence d'instructions dans l'ordre. La raison pour laquelle vous devrez peut-être faire cela est pour les cas où vous voulez exécuter plusieurs instructions, mais le contexte dans lequel vous vous trouvez n'attend qu'une seule instruction.

Par exemple, une instruction if prend 3 (ou plus) arguments: la condition à évaluer, l'expression à évaluer si elle est vraie et l'expression à évaluer si elle est fausse. Si plus de 3 arguments sont fournis, les arguments suivants font partie de la branche else. Si vous souhaitez utiliser plus d'une instruction dans la vraie branche, vous devez utiliser progn:

(if condition 
    (progn first-statement-if-true 
      second-statement-if-true) 
    first-statement-if-false 
    second-statement-if-false 
) 

Dans ce cas, si condition est vrai, alors first-statement-if-true et second-statement-if-true seront évaluées. Sinon, first-statement-if-false et second-statement-if-false seront évalués.

Ainsi, votre code évaluera simplement les deux instructions (setq Man-notify-method 'bully) et (info "something") dans l'ordre.

setq est une autre forme spéciale. Voir chapter 11.8 pour sa documentation. Il définit simplement une variable, nommée par le premier paramètre, à la valeur du second paramètre. Le premier paramètre est pas évalué - il est pris littéralement.

Une valeur précédée d'une seule citation (telle que 'bully) n'est pas évaluée. Voir chapter 9.3 pour plus de détails sur la citation. Par conséquent, (setq Man-notify-method) définit une variable nommée Man-notify-method au jeton littéral bully (qui est un type de données appelé un le symbole, qui est distinct de la chaîne "bully").

Je ne trouve pas la documentation sur la fonction info en ligne, vous pouvez obtenir de l'aide sur une fonction donnée dans emacs en tapant C-h f function-name. Ainsi, en tapant C-h f info, je suis arrivé ceci:

info is an interactive autoloaded Lisp function in `info'. 
[Arg list not available until function definition is loaded.] 

Enter Info, the documentation browser. 
Optional argument FILE specifies the file to examine; 
the default is the top-level directory of Info. 
Called from a program, FILE may specify an Info node of the form 
`(FILENAME)NODENAME'. 

In interactive use, a prefix argument directs this command 
to read a file name from the minibuffer. 

The search path for Info files is in the variable `Info-directory-list'. 
The top-level Info directory is made by combining all the files named `dir' 
in all the directories in that path.

Le manuel de référence en ligne est très utile, et une aide interactive de emacs est également indispensable. Si vous ne comprenez pas ce qu'une fonction particulière fait, juste C-h f.