2010-06-14 6 views

Antwort

36

Wenn der Cursor am Ende der Zeile steht, fügt C-C-x C-e den Wert des vorhergehenden geklammerten Ausdrucks in den Puffer ein. Sie könnten das tun, dann den ursprünglichen Ausdruck manuell sichern und löschen. Wenn das zu viel Arbeit ist, hier ist ein Befehl, der den vorhergehenden Ausdruck auswertet und ersetzt ihn durch seinen Wert:

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

Vielen Dank, das ist perfekt – justinhj

0

schau auf die Funktion eval-print-last-sexp, du kannst etwas damit bauen

0

Mein Emacs-Fu ist nicht so stark, also weiß ich nicht, ob es einen einzigen Befehl gibt, um das zu tun, aber du kannst mach dir ein (etwas zerbrechliches) Makro dafür ... lass diese Zeilen in deinefallen:

(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) 

Dies funktioniert gut, aber es gibt ein Problem mit sich: Sie am Ende des sexp sein müssen (d nach dem letzten Recht paren), um es zur Arbeit zu bringen.

Auch ich wählte einen zufälligen ungebundenen Schlüssel (C-x C-a) - fühlen Sie sich frei, um etwas mehr nach Ihren Wünschen zu ändern.

8

Diesem verwandt, könnte man Luke Gorrie des "lively.el" mögen, die innerhalb eines Textpuffer Live-Ersatz von Emacs Lisp Ausdrücke zur Verfügung stellt. Es ist ein ordentlicher Hack.

+0

Das ist wirklich super danke – justinhj

+0

Ja, das ist ziemlich cool. – kjfletch

2

replace-regex-Funktionen können Lisp ausführen, um die Ersetzungen zu generieren.

In der trivialen Instanz, in der sich der fragliche Sexp in einer einzigen Zeile befindet und nur Klammern enthält, können Sie "(. +)" Mit "\, (eval (read \ &)) ".

2

Wenn Sie Emacs Starter Kit von Technomancy verwenden, gibt es "esk-eval-and-replace" -Funktion, die die elisp sexp auswertet und ersetzt. Seine Bindung an C-c e standardmäßig.