Код, который вы разместили, представляет собой комбинацию сценария оболочки и elisp.
function info()
{
emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))"
}
Определяет функцию сценария оболочки с именем info
. Требуется 1 параметр с именем $1
. Когда вы вызываете эту функцию (скажем, из другого сценария оболочки), значение аргумента подставляется вместо $1
, и он выполняет команды, указанные в последовательности. Итак, если бы вы назвали это так:
info("something")
Оболочка выполнит эту команду:
emacs -eval "(progn (setq Man-notify-method 'bully) (info \"something\"))"
Это вызывает исполняемый файл emacs с двумя аргументами -eval
и командной строкой, которая содержит встроенные экранированные кавычки. Это просит emacs вызвать следующий код elisp:
(progn (setq Man-notify-method 'bully) (info "something"))
progn
- это специальная форма . Специальные формы оценивают свои аргументы иначе, чем обычные вызовы функций. Вы можете найти документацию для progn
в главе 10.1 Справочного руководства по GNU Emacs Lisp . progn
- это простая конструкция для выполнения последовательности операторов по порядку. Причина, по которой вам может потребоваться это сделать, относится к случаям, когда вы хотите выполнить несколько операторов, но контекст, в котором вы находитесь, ожидает только одного оператора.
Например, оператор if
принимает 3 (или более) аргумента: условие для оценки, выражение для оценки, если true, и выражение для оценки, если false. Если указано более 3 аргументов, последующие аргументы являются частью ветви else. Если вы хотите использовать более одного оператора в истинной ветви, вы должны использовать progn
:
(if condition
(progn first-statement-if-true
second-statement-if-true)
first-statement-if-false
second-statement-if-false
)
В этом случае, если condition
истинно, тогда будут оцениваться first-statement-if-true
и second-statement-if-true
. В противном случае first-statement-if-false
и second-statement-if-false
будут оцениваться.
Таким образом, ваш код просто оценит два оператора (setq Man-notify-method 'bully)
и (info "something")
по порядку.
setq
- другая специальная форма. См. главу 11.8 для документации. Он просто устанавливает переменную, названную первым параметром, в значение второго параметра. Первый параметр не оценивается - он принимается буквально.
Значение, которому предшествует одинарная кавычка (например, 'bully
), не оценивается. См. главу 9.3 для получения подробной информации о цитировании. Следовательно, (setq Man-notify-method)
устанавливает переменную с именем Man-notify-method
в буквальный токен bully
(это тип данных, называемый символом , который отличается от строки "bully"
).
Я не могу найти документацию по функции info
онлайн, вы можете получить помощь по любой функции в emacs, набрав C-h f function-name
. Итак, набрав C-h f info
, я получил это:
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.
Электронное справочное руководство очень полезно, и интерактивная помощь emacs также необходима. Если вы не понимаете, что делает определенная функция, просто C-h f
.