这条线是
function info() { emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))" }
我从手册中了解到
progn这个
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)'.在设置第一个SYM之后才计算第二个VAL,依此类推; 每个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的界限?
您发布的代码是shell脚本和elisp的组合.
function info() { emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))" }
这定义了一个名为的shell脚本函数info
.它需要1个参数,名为$1
.当您调用此函数(例如,从另一个shell脚本)时,参数的值将替换为for $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
是一种特殊形式.特殊形式评估它们的参数与普通函数调用不同.您可以在文档progn
中的GNU的Emacs Lisp参考手册的10.1章节. 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
是另一种特殊形式.有关其文档,请参见第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
它.
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)