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
.
J'accepte cette réponse, car il est compact. La réponse d'Adam est également excellente. --- Merci pour vos réponses! –