在Emacs中,您可以评估Emacs Lisp表达式并将其替换为结果吗?

时间:2010-06-14 06:29:43

标签: emacs elisp

例如,如果我有文字:

Sum of items is (+ 1 2 3)

我想移到行尾,评估表达式并将其替换为结果,以便显示:

Sum of items is 6

7 个答案:

答案 0 :(得分:39)

将光标放在行的末尾, C-u C-x C-e 会将前面带括号的表达式的值插入缓冲区。您可以这样做,然后手动备份并删除原始表达式。如果这工作太多,这里有一个命令来评估前面的表达式并用它的值替换它:

  (defun replace-last-sexp ()
    (interactive)
    (let ((value (eval (preceding-sexp))))
      (kill-sexp -1)
      (insert (format "%S" value))))

答案 1 :(得分:8)

与此相关,你可能会喜欢Luke Gorrie的“lively.el”,它提供了文本缓冲区中emacs lisp表达式的实时替换。这是一个很好的黑客。

答案 2 :(得分:6)

当我在谷歌搜索结果中遇到一个解决方案时,我正在寻找解决方案。

(defun fc-eval-and-replace ()
  "Replace the preceding sexp with its value."
  (interactive)
  (backward-kill-sexp)
  (prin1 (eval (read (current-kill 0)))
         (current-buffer)))

http://emacs.wordpress.com/2007/01/17/eval-and-replace-anywhere/

答案 3 :(得分:2)

replace-regex函数可以执行lisp来生成替换。

在所讨论的sexp在一行的简单实例中,并且是唯一包含括号的实例,那么你可以匹配“(。+)”并替换为“\,(eval(read \&)) )”。

答案 4 :(得分:2)

如果您通过技术使用emacs入门套件,则有“esk-eval-and-replace”功能,用于评估elisp sexp并替换它们。它默认绑定到C-c e

答案 5 :(得分:0)

查看函数eval-print-last-sexp,你可以使用它构建一些东西

答案 6 :(得分:0)

我的emacs-fu不是那么强大,所以我不知道是否有一个命令可以做到这一点,但是你可以让自己成为一个(有点脆弱的)宏...把这些行放在你的{ {1}}:

.emacs

这很好用,但是有一个问题:你需要在sexp的结束(即在最后一个权利之后)才能使它工作。

此外,我选择了一个随机的未绑定密钥((fset 'eval-sexp-in-place [?\M-x ?e ?v ?a ?l ?- ?p ?r ?i ?n tab return ?\M-^ ?\M-^ ?\C-\M-b ?\C-\M-k ?\C-d]) (global-set-key [(control x) (control a)] 'eval-sexp-in-place) ) - 随意根据自己的喜好将其更改为更多内容。