在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))))
答
看功能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/
答
replace-regex函数可以执行lisp来生成替换。你可以匹配“(。+)”并替换为“\,(eval(阅读\ &)”)。在一个普通的情况下,如果sexp在单行上,并且是唯一包含括号的事情, )”。
答
如果您使用的是技术人员使用的emacs入门工具包,那么会有“esk-eval-and-replace”函数来评估elisp sexp并将其替换。它默认绑定到C-c e
。
非常感谢,这是完美的 – justinhj 2010-06-15 03:25:08