【问题标题】:Cannot add function in Emacs无法在 Emacs 中添加功能
【发布时间】:2017-04-07 17:25:43
【问题描述】:

我最近开始使用 Emacs,我正在尝试添加一个函数,将输入的句子拆分为单词列表(由一个空格分隔):

(defun split-by-one-space (string)    ; from: http://cl-cookbook.sourceforge.net/strings.html
        "Returns a list of substrings of string
        divided by ONE space each.
        Note: Two consecutive spaces will be seen as
        if there were an empty string between them."
    (loop for i = 0 then (1+ j)
          as j = (position #\Space string :start i)
          collect (subseq string i j)
          while j))

(defun myfn (ss)
    "documentation of fn: to be added"
    (interactive "s\Enter some words: ")
    (message "Read: %s" (split-by-one-space ss)))

我在文件夹~/.emacs.d/init.el 中保存了上面的内容,其中还有两个其他功能也被正确拾取和执行。但是,当我尝试使用M-x 方法执行它时,找不到上面的函数'myfn'。也找不到函数'split-by-one-space'

问题出在哪里,我该如何解决?

编辑:

使用命令“emacs --debug-init”启动 Emacs 显示以下错误:

(invalid-read-syntax "#")

显然 \#Space 在 Emacs Lisp 中无法识别。我用'?\ ' 替换了它,这个错误就消失了。函数 myfn 现在可以执行了。但是,在执行它时,会显示以下错误:

Symbol's function definition is void: loop

显然循环部分需要用 Emacs Lisp 重写。

【问题讨论】:

  • SPLIT-BY-ONE-SPACE 是 Common Lisp,而不是 Emacs Lisp。
  • M-x 只会找到interactive functions。使用M-:执行任意elisp。
  • @Juancho:但它交互式的。
  • 您如何知道文件正在(重新)加载?如果您访问它并执行M-x load-file RET 会发生什么?
  • 我重启了 Emacs 很多次,但都没有帮助。重启电脑后还是不行。

标签: emacs command


【解决方案1】:

#\Space 不是有效的 Elisp 并且会导致读取错误,因此大多数 Emacs 将在此时停止处理您的文件。您想改写 ?\s?\,这是 Elisp 中用于字符文字的语法。

之后,您会看到 Emacs 不知道 loop。您想改用cl-loop,它由cl-lib 包提供,因此您不仅需要将loop 重命名为cl-loop,还需要添加

(require 'cl-lib)

早些时候。同样,Elisp 不知道 subseqpositions,您需要改用 cl-subseqcl-position(也由 cl-lib 提供)。

【讨论】:

  • 请参阅我的问题中的编辑和 cmets 中的讨论。即使在校正空格字符后它也不起作用。
  • @mso:是的,Elisp 不是 Common Lisp,所以你的代码有很多问题。我为我可以预见的问题添加了更多细节。
  • 我还发现了 'split-string' 这似乎是 emacs lisp 的一部分!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多