Например, если у меня есть текст:
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))))
Функции replace-regex могут выполнять lisp для генерации замен.
В тривиальном случае, когда рассматриваемый sexp находится в одной строке и является единственным элементом, содержащим круглые скобки, вы можете сопоставить «(. +)» И заменить на «\, (eval (read \ &)) ".
В связи с этим вам может понравиться " 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/
посмотрите на функцию 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
) - не стесняйтесь менять его на что-то большее по своему вкусу.