Подтвердить что ты не робот

В Emacs вы можете оценить выражение Emacs Lisp и заменить его результатом?

Например, если у меня есть текст:

Sum of items is (+ 1 2 3)

Я хочу перейти в конец строки, оценить выражение и заменить его результатом, чтобы он читал:

Sum of items is 6
4b9b3361

Ответ 1

С курсором в конце строки C-u C-x C-e вставляет в предыдущее значение значение предыдущего заключенного в скобки выражения. Вы можете это сделать, затем вручную создать резервную копию и удалить исходное выражение. Если это слишком много, выполните команду, которая оценивает предыдущее выражение и заменяет его своим значением:

  (defun replace-last-sexp ()
    (interactive)
    (let ((value (eval (preceding-sexp))))
      (kill-sexp -1)
      (insert (format "%S" value))))

Ответ 2

В связи с этим вам может понравиться Luke Gorrie " lively.el", который обеспечивает живую замену выражений emacs lisp в тексте буфер. Это аккуратный взлом.

Ответ 3

У меня было решение для этого, когда я столкнулся с одним в результатах поиска 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/

Ответ 4

функции replace-regex могут выполнять lisp, чтобы сгенерировать замены.

В тривиальном примере, где рассматриваемый sexp находится в одной строке, и это единственное, что содержит скобки, тогда вы можете сопоставить "(. +)" и заменить на "\, (eval (read\&)) )".

Ответ 5

Если вы используете стартовый комплект emacs по technomancy, есть функция "esk-eval-and-replace", которая оценивает elisp sexp и заменяет их. Его привязка к C-c e по умолчанию.

Ответ 6

Посмотрите на функцию eval-print-last-sexp, вы можете создать что-то, используя ее

Ответ 7

Мой 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) - не стесняйтесь изменить это на что-то большее по своему вкусу.