2010-06-14 24 views

Trả lời

36

Với con trỏ ở cuối dòng, C-u C-x C-e sẽ chèn giá trị của biểu thức được lồng vào trước vào bộ đệm. Bạn có thể làm điều đó, sau đó sao lưu thủ công và xóa biểu thức gốc. Nếu đó là quá nhiều công việc, đây là một lệnh đánh giá biểu thức trước đó và thay thế nó bằng giá trị của nó:

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

Cảm ơn rất hoàn hảo – justinhj

0

nhìn vào hàm eval-print-last-sexp, bạn có thể tạo thứ gì đó bằng cách sử dụng nó

0

Emacs-fu của tôi không quá mạnh, vì vậy tôi không biết nếu có một lệnh duy nhất để làm điều này, nhưng bạn có thể tạo cho mình một macro (hơi dễ vỡ) cho nó ... thả những dòng này vàocủa bạn:

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

này hoạt động tốt, nhưng có một vấn đề với nó: bạn cần phải có mặt tại cuối của sexp (ví dụ: sau khi paren bên phải cuối cùng) để làm cho nó hoạt động.

Ngoài ra, tôi đã chọn một phím không liên kết ngẫu nhiên (C-x C-a) - cảm thấy tự do thay đổi điều đó theo ý thích của bạn.

8

Về vấn đề này, bạn có thể muốn Luke Gorrie "lively.el", cung cấp thay thế sống của emacs biểu thức lisp trong một bộ đệm văn bản. Đó là một hack gọn gàng.

+0

Cảm ơn bạn rất tuyệt vời – justinhj

+0

Vâng, điều này khá thú vị. – kjfletch

2

chức năng thay thế regex có thể thực thi lisp để tạo các thay thế.

Trong trường hợp tầm thường trong đó sexp được đề cập trên một dòng và là dấu ngoặc đơn duy nhất, bạn có thể khớp dấu "(. +)" Và thay thế bằng "\, (eval (đọc \ &)) ".

2

Nếu bạn đang sử dụng bộ khởi động emacs bằng kỹ thuật, có chức năng "esk-eval-and-replace" để đánh giá sexp elisp và thay thế chúng. Liên kết của nó theo mặc định là C-c e.

Các vấn đề liên quan