Na przykład, jeśli mam tekst:W Emacs można ocenić wyrażenie Emacs Lisp i zastąpić go wynikiem?
Sum of items is (+ 1 2 3)
chcę, aby przejść do końca linii, ocena ekspresji i zastąpić go z wyniku, tak, że brzmi:
Sum of items is 6
Na przykład, jeśli mam tekst:W Emacs można ocenić wyrażenie Emacs Lisp i zastąpić go wynikiem?
Sum of items is (+ 1 2 3)
chcę, aby przejść do końca linii, ocena ekspresji i zastąpić go z wyniku, tak, że brzmi:
Sum of items is 6
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))))
spójrz na funkcję eval-print-last-sexp, możesz coś z niej zbudować
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.
miałem go na rozwiązanie tego kiedy natknąłem jeden w wynikach wyszukiwania 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/
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 \ &)) ".
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
.
Wielkie dzięki, to jest idealne – justinhj