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

问题描述:

例如,如果我有文本:在Emacs中,您可以评估一个Emacs Lisp表达式并将其替换为结果?

Sum of items is (+ 1 2 3) 

我想移动到该行的末尾,计算表达式,并用结果替换它,所以它的内容:

Sum of items is 6 

将光标放在行尾,C-u C-x C-e将插入先前加括号的表达式的值到缓冲区中。你可以做到这一点,然后手动备份并删除原始表达式。如果这是太多的工作,这里的计算结果前面的表达式,并用它的值替换它的命令:

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

非常感谢,这是完美的 – justinhj 2010-06-15 03:25:08

看功能eval-print-last-sexp,你可以使用它建立一些东西

我的emacs-fu没有那么强大,所以我不知道是否有一个单一的命令来做到这一点,但你可以让自己成为一个(有点脆弱的)宏...将这些行放入你的.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) 

这工作得很好,但是有一个问题,它:你必须在SEXP的(即在最后一个权利之后)让它工作。

此外,我选择了一个随机的未绑定的密钥(C-x C-a) - 随意更改为更喜欢你的东西。

我是有在一个解决方案一去,当我在谷歌搜索结果跨越一个来了。

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

与此相关的,你可能会喜欢卢克戈里的“lively.el”,它提供了一个文本缓冲区内带电更换的Emacs Lisp表达式。这是一个整洁的黑客。

+0

这真的很棒谢谢 – justinhj 2010-06-15 04:23:08

+0

是的,这很酷。 – kjfletch 2010-06-17 08:20:43

replace-regex函数可以执行lisp来生成替换。你可以匹配“(。+)”并替换为“\,(eval(阅读\ &)”)。在一个普通的情况下,如果sexp在单行上,并且是唯一包含括号的事情, )”。

如果您使用的是技术人员使用的emacs入门工具包,那么会有“esk-eval-and-replace”函数来评估elisp sexp并将其替换。它默认绑定到C-c e