Например, если у меня есть текст:
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 по technomancy, есть функция "esk-eval-and-replace", которая оценивает elisp sexp и заменяет их. Его привязка к C-c e
по умолчанию.
Посмотрите на функцию 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)
Это отлично работает, но есть одна проблема: вам нужно быть в end sexp (т.е. после последнего правого), чтобы заставить его работать.
Кроме того, я выбрал случайный несвязанный ключ (C-x C-a
) - не стесняйтесь изменить это на что-то большее по своему вкусу.