您发布的代码是shell脚本和elisp的组合。
function info()
{
emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))"
}
这定义了一个名为info
的shell脚本函数。它有1个参数,命名为$1
。当您调用此函数(例如从另一个shell脚本中),参数的值将替换$1
,并按顺序运行指定的命令。因此,如果您像这样调用它:
info("something")
Shell将执行这个命令:
emacs -eval "(progn (setq Man-notify-method 'bully) (info \"something\"))"
这将使用两个参数调用emacs可执行文件,
-eval
和包含嵌入转义引号的命令字符串。 这要求emacs调用以下elisp代码:
(progn (setq Man-notify-method 'bully) (info "something"))
progn
是一种特殊形式。特殊形式对待它们的参数与普通函数调用有所不同。你可以在GNU Emacs Lisp参考手册的第10.1章找到progn
的文档。 progn
是一种简单的结构,用于按顺序执行一系列语句。你可能需要这样做的原因是当你想要执行多个语句时,但上下文只期望单个语句。
例如,一个if
语句需要3个(或更多)参数:要评估的条件、如果为真则要评估的表达式和如果为假则要评估的表达式。如果提供了多于3个参数,则后续参数属于else分支。如果你想在true分支中使用多个语句,你必须使用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
是另一种特殊形式。请参阅
chapter 11.8了解其文档。它只是将第一个参数命名的变量设置为第二个参数的值。第一个参数不会被评估 - 它被直接使用。
以单引号开头的值(例如
'bully
)不会被评估。有关引用的详细信息,请参阅
chapter 9.3。因此,
(setq Man-notify-method)
将变量命名为
Man-notify-method
并将其设置为字面标记
bully
(这是一种称为
符号的数据类型,与字符串
"bully"
不同)。
我找不到关于info
函数的文档,你可以通过输入C-h f 函数名称
在emacs中获取任何给定函数的帮助。所以,通过输入C-h f info
,我得到了以下内容:
info是`info'中一个交互式自动加载的Lisp函数。
[参数列表在函数定义加载之前不可用。]
进入Info,文档浏览器。
可选参数FILE指定要检查的文件;默认值为Info的顶级目录。
从程序调用,FILE可以指定形式为`(FILENAME)NODENAME'的Info节点。
在交互使用中,前缀参数将该命令指向从minibuffer读取文件名。
Info文件的搜索路径在变量`Info-directory-list'中。
顶级Info目录由该路径中所有目录中名为`dir'的所有文件组成。
在线参考手册非常有用,而emacs的交互式帮助也是必不可少的。如果您不理解特定功能的作用,请输入C-h f
。