例如,如果我有文本:在Emacs中,您可以評估一個Emacs Lisp表達式並將其替換爲結果?
Sum of items is (+ 1 2 3)
我想移動到該行的末尾,計算表達式,並用結果替換它,所以它的內容:
Sum of items is 6
例如,如果我有文本:在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