该行是
function info() {
emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))"
}
我从手册中了解到
progn这个
预测是C源代码中的一种特殊形式 代码”。
Setq
setq是`C源代码中的一种特殊形式 码'。 (setq SYM VAL SYM VAL ...)
将每个SYM设置为其VAL的值。 符号SYM是变量;他们 是文字的(未评估)。该 值VAL是表达式;他们是 评估。因此,(setq x(1+ y))设定
x' to the value of
(1+ y)'。该 直到之后才计算第二个VAL 设置第一个SYM,依此类推;每 VAL可以使用变量的新值 先前在setq'. The return value of the
setq'表单中设置的是值 最后一个VAL。
$ 1 似乎是对用户提供的命令man
之后的第一个参数的引用。
'欺负似乎是一个随机变量。
Man-notify-method 似乎是一个在执行man命令时运行的动作函数。
-eval
似乎是一个评估状态,它告诉Emacs运行它后面的语句。
但是,我对这个功能并不完全确定。
我需要理解这个函数,因为我想将我的 bash代码绑定到man的action函数。 Man-notify-method 似乎是该动作函数,至少在Emacs中。
您如何理解Emacs Lisp的界限?
答案 0 :(得分:12)
您发布的代码是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\"))"
这将使用两个参数-eval
和命令字符串调用emacs可执行文件,该字符串包含嵌入的转义引号。这要求emacs调用以下elisp代码:
(progn (setq Man-notify-method 'bully) (info "something"))
progn
是特殊表单。特殊形式评估它们的参数与普通函数调用不同。您可以在chapter 10.1 of the GNU Emacs Lisp Reference Manual中找到progn
的文档。 progn
是一个简单的结构,用于按顺序执行一系列语句。您可能需要执行此操作的原因是您希望执行多个语句的情况,但您所处的上下文只需要一个语句。
例如,if
语句需要3个(或更多)参数:要评估的条件,要评估的表达式是否为true,以及要评估的表达式是否为false。如果提供的参数超过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
(这是一种称为符号的数据类型,它与字符串{{不同1}})。
我无法在线查找"bully"
功能的文档,您可以通过键入info
获取有关emacs中任何给定功能的帮助。因此,通过输入C-h f function-name
,我得到了这个:
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 info
它。
答案 1 :(得分:6)
PROGN只是按顺序计算表达式,返回最后一个表达式的返回值。
SETQ是基本的赋值运算符。
INFO进入emacs信息浏览器。
所以,这样做首先将符号'bully
分配给变量Man-notify-method
,然后进入信息浏览器。 'bully
可能是函数的名称,Man-notify-method
是信息浏览器查找函数以调用某些通知的地方(警告:我只是在这里猜测)。
我想你必须定义自己的函数来调用你的shell命令:
(defun my-cmd ()
(call-process ; Look up the syntax in the emacs lisp manual
))
然后将其符号分配给Man-notify-method
:
(setq Man-notify-method 'my-cmd)