当前位置:  开发笔记 > 编程语言 > 正文

无法理解一系列Emacs Lisp

如何解决《无法理解一系列EmacsLisp》经验,为你挑选了2个好方法。

这条线是

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 thesetq'形式中先前设置的变量的新值,即最后一个VAL的值.

$ 1似乎是man在用户给出的命令之后引用第一个参数.

'欺负似乎是一个随机变量.

Man-notify-method似乎是在执行man命令时运行的动作函数.

-eval 似乎是一个评估状态,它告诉Emacs运行它后面的语句.

但是,我不完全确定这个功能.

我需要理解这个函数,因为我想将我的bash代码绑定到man的action函数.man-notify-method似乎是动作函数,至少在Emacs中.

你如何理解Emacs Lisp的界限?



1> Adam Rosenfi..:

您发布的代码是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-truesecond-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它.



2> Svante..:

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)

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有