【发布时间】:2010-06-14 06:29:42
【问题描述】:
例如,如果我有文字:
Sum of items is (+ 1 2 3)
我想移动到行尾,计算表达式并用结果替换它,这样它就变成了:
Sum of items is 6
【问题讨论】:
例如,如果我有文字:
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))))
【讨论】:
与此相关,您可能会喜欢 Luke Gorrie 的“lively.el”,它提供了文本缓冲区中 emacs lisp 表达式的实时替换。这是一个巧妙的技巧。
【讨论】:
当我在 Google 搜索结果中遇到一个解决方案时,我正在尝试解决这个问题。
(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 来生成替换。
在有问题的 sexp 在单行上并且是唯一包含括号的简单实例中,您可以匹配 "(.+)" 并替换为 "\,(eval (read \&)) ”。
【讨论】:
如果您通过技术使用 emacs 入门套件,则可以使用“esk-eval-and-replace”功能评估 elisp 性别并替换它们。默认绑定到C-c e。
【讨论】:
查看函数 eval-print-last-sexp,您可以使用它构建一些东西
【讨论】:
我的 emacs-fu 不是那么强大,所以我不知道是否有一个命令可以做到这一点,但你可以为它自己制作一个(有点脆弱的)宏......将这些行放在你的 @ 987654321@:
(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) - 您可以随意将其更改为您喜欢的更多内容。
【讨论】: