例如,如果我有文字:
Sum of items is (+ 1 2 3)
我想移到行尾,评估表达式并将其替换为结果,以便显示:
Sum of items is 6
答案 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)
) - 随意根据自己的喜好将其更改为更多内容。