【问题标题】:A basic function for emacsemacs的一个基本函数
【发布时间】:2013-06-12 22:45:33
【问题描述】:

我以前从未编写过 emacs 函数,想知道是否有人可以帮助我入门。我想要一个函数,它需要一个突出显示的区域来解析它(通过“,”),然后用另一个已经内置在 emacs 中的函数来评估每个块。

突出显示的代码可能如下所示:x <- function(w=NULL,y=1,z=20){}(r 代码),我想删除 w=NULLy=1z=20,然后将每个函数传递给 emacs 中已包含的函数。关于如何开始的任何建议?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    lisp 函数是使用defun 定义的(你真的应该读the elisp intro,它会为你节省很多时间——“一品脱的汗水可以节省一加仑的血”)。

    要将单纯的函数转换为 interactive command(可以使用 M-x 调用或绑定到键),请使用 interactive

    要将区域(选择)传递给函数,请使用"r" 代码:

    (defun my-command (beg end)
      "Operate on each word in the region."
      (interactive "r")
      (mapc #'the-emacs-function-you-want-to-call-on-each-arg
            ;; split the string on any sequence of spaces and commas
            (split-string (buffer-substring-no-properties beg end) "[ ,]+")))
    

    现在,将上面的表格复制到*scratch* emacs buffer,将点(光标)放在一个函数上,比如mapcsplit-string,然后点击C-h f RET,您将请参阅 *Help* buffer 解释该函数的作用。

    您可以通过点击 C-M-x 来评估函数定义(不要忘记用有意义的东西替换 the-emacs-function-you-want-to-call-on-each-arg),然后选择 w=NULL,y=1,z=20 和进行测试点击 M-x my-command RET

    顺便说一句,C-h f my-command RET 现在将在*Help* 缓冲区中显示Operate on each word in the region

    【讨论】:

    • 我认为 # 是不必要的。来自 elisp 手册,第 12.7 节。 "读取语法#'' is a short-hand for using function'。以下形式都是等价的: (lambda (x) (* x x)) (function (lambda (x) (* x x))) #'(lambda (x) (* x x ))"
    • @seanmcl:lambda 是一个非常特殊的情况。在ELisp(但不是其他Lisps!)此时(但不一定在将来!)确实#'foo'foo是等价的,但是在处理函数调用时,应该使用前者。
    • 您能解释一下为什么(对于其他 lisps)应该使用 # 吗?来自 ML/Haskell 背景,将函数与任何其他数据区别对待似乎很奇怪。省略 # 时是否读取不同的单元格(函数与变量)?
    • @sds,我认为这正是我想要的,但似乎它可能会以逗号分隔,但也将其作为论点的一部分。关于如何使用它们进行拆分但将它们删除的任何想法?我使用 ess-eval-line-and-step 作为我的功能。
    • 我没有观察到这个:(split-string "a,b, c" "[, ]+") ==> ("a" "b" "c")`
    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多