例如,如果我有文本:
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))))
当我试图解决这个问题时,在谷歌搜索结果中找到了一个解决方案。
(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/
替换正则表达式函数可以执行Lisp以生成替换内容。
在仅包含一个括号的单行sexp的简单示例中,您可以匹配“( . + )”并用“\,(eval(read \&))”替换。
C-c e
。看一下 eval-print-last-sexp 函数,你可以利用它构建一些东西。
我的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
),你可以自由更改为其他更适合你的键。