2010-06-14 14 views

Odpowiedz

36

Za pomocą kursora na końcu wiersza, C-u C-x C-e wstawi wartość poprzedniego wyrażenia parentetyzowanego do bufora. Możesz to zrobić, a następnie ręcznie wykonaj kopię zapasową i usuń oryginalne wyrażenie. Jeśli to zbyt wiele pracy, tutaj jest polecenie, które ocenia poprzedniego wyrażenia i zastępuje go jego wartości:

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

Wielkie dzięki, to jest idealne – justinhj

0

spójrz na funkcję eval-print-last-sexp, możesz coś z niej zbudować

0

Moje emacs-fu nie jest tak silne, więc nie wiem, czy jest to jedno polecenie, ale możesz zrób sobie (nieco delikatne) makro ... upuść te linie w swoim .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) 

Działa to dobrze, ale jest jeden problem z tym: trzeba być na końcu z s-wyrażenie (tj po ostatnim prawym dokumencie), aby uruchomić go.

Ponadto wybrałem losowy klucz niezwiązany (C-x C-a) - możesz to zmienić na coś bardziej odpowiadającego Twoim potrzebom.

8

Wiąże się z tym, może chcesz Luke Gorrie w "lively.el", który zapewnia wymianę żywo Emacs Lisp wyrażeń w buforze tekstowym. To zgrabny hack.

+0

To naprawdę niesamowite dzięki – justinhj

+0

Tak, to jest całkiem fajne. – kjfletch

2

Funkcje replace-regex mogą wykonywać selp, aby wygenerować zamienniki.

W banalnym przypadku, w którym dany sex jest w jednym wierszu, i jest jedyną rzeczą zawierającą nawias, można dopasować "(. +)" I zastąpić "\, (eval (read \ &)) ".

2

Jeśli używasz zestawu startowego emacs według technomancy, dostępna jest funkcja "esk-eval-and-replace", która analizuje elipsy i zastępuje je. Domyślnie jest to powiązane z C-c e.

Powiązane problemy