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

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

Sum of items is (+ 1 2 3)

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

Sum of items is 6
23
задан Luke Girvin 4 September 2011 в 01:56
поделиться

6 ответов

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

  (defun replace-last-sexp ()
    (interactive)
    (let ((value (eval (preceding-sexp))))
      (kill-sexp -1)
      (insert (format "%S" value))))
40
ответ дан 29 November 2019 в 01:14
поделиться

Функции replace-regex могут выполнять lisp для генерации замен.

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

2
ответ дан 29 November 2019 в 01:14
поделиться

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

8
ответ дан 29 November 2019 в 01:14
поделиться

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

7
ответ дан 29 November 2019 в 01:14
поделиться

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

0
ответ дан 29 November 2019 в 01:14
поделиться

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

0
ответ дан 29 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: