在Emacs中,你能够评估一个Emacs Lisp表达式并用结果替换它吗?

24

例如,如果我有文本:

Sum of items is (+ 1 2 3)

我要移动到行尾,计算表达式并用结果替换它,使其变为:

Sum of items is 6
7个回答

41

将光标放在行末,C-u C-x C-e会将前一个括号表达式的值插入到缓冲区中。你可以这样做,然后手动返回并删除原始表达式。如果这太麻烦了,这里有一个命令,它会评估前面的表达式并用其值替换它:

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

9

与此相关的是,您可能会喜欢Luke Gorrie的"lively.el",它可以在文本缓冲区内实时替换emacs lisp表达式。这是一个不错的技巧。


7

当我试图解决这个问题时,在谷歌搜索结果中找到了一个解决方案。

(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

替换正则表达式函数可以执行Lisp以生成替换内容。

在仅包含一个括号的单行sexp的简单示例中,您可以匹配“( . + )”并用“\,(eval(read \&))”替换。


2
如果您正在使用技术人员的emacs入门套件,则有一个名为“esk-eval-and-replace”的函数,它会评估elisp sexp并替换它们。默认情况下,它绑定到C-c e

1

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


0

我的emacs技能不是很强,所以我不知道是否有一个单一的命令可以做到这一点,但你可以为此制作一个(有些脆弱的)宏...将这些行放入你的.emacs中:

(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)

这个程序可以运行,但是有一个问题:你需要在性质表达式的结尾(即最后一个右括号后面)才能让它工作。
此外,我选择了一个随机未绑定的键(C-x C-a),你可以自由更改为其他更适合你的键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接