无法理解一系列Emacs Lisp

时间:2009-06-26 18:45:13

标签: emacs lisp

该行是

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的界限?

2 个答案:

答案 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-truesecond-statement-if-true。否则,将评估first-statement-if-falsesecond-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)