2010-06-14 15 views
23

उदाहरण के लिए अगर मैं पाठ है:Emacs में आप Emacs Lisp अभिव्यक्ति का मूल्यांकन कर सकते हैं और परिणाम के साथ इसे प्रतिस्थापित कर सकते हैं?

Sum of items is (+ 1 2 3) 

मैं पंक्ति के अंत तक ले जाना चाहते हैं, अभिव्यक्ति का मूल्यांकन करें और परिणाम के साथ बदलना है, ताकि इसे पढ़ता है:

Sum of items is 6 

उत्तर

36

लाइन के अंत में कर्सर के साथ, सी-यू सी-एक्स सी-ई बफर में पिछली कोष्ठक अभिव्यक्ति के मान को सम्मिलित करेगा। आप ऐसा कर सकते हैं, फिर मैन्युअल रूप से बैक अप लें और मूल अभिव्यक्ति को हटा दें।

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

बहुत धन्यवाद – justinhj

0

फ़ंक्शन eval-print-last-sexp को देखें, आप इसका उपयोग कर कुछ बना सकते हैं

0

मेरा emacs-fu इतना मजबूत नहीं है, इसलिए मुझे नहीं पता कि ऐसा करने के लिए एक ही आदेश है, लेकिन आप कर सकते हैं अपने लिए एक (कुछ हद तक नाजुक) मैक्रो बनाओ ... इन लाइनों को अपनेमें छोड़ दें:

(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) चुना - अपनी पसंद के अनुसार कुछ और बदलने के लिए स्वतंत्र महसूस करें।

6

मैं इस के लिए एक समाधान में एक जाना हो रही थी जब मैं किसी 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/

8

इस से संबंधित है, तो आप ल्यूक Gorrie के "lively.el" है, जो एक पाठ बफर भीतर Emacs तुतलाना भाव का सीधा प्रतिस्थापन प्रदान करता है पसंद कर सकते हैं। यह एक साफ हैक है।

+0

यह वास्तव में बहुत बढ़िया धन्यवाद – justinhj

+0

हाँ, यह बहुत अच्छा है। – kjfletch

2

प्रतिस्थापन-रेगेक्स फ़ंक्शन प्रतिस्थापन उत्पन्न करने के लिए lisp निष्पादित कर सकते हैं।

छोटे उदाहरण में जहां प्रश्न में लिंग एक पंक्ति पर है, और केवल एक ही चीज है जिसमें ब्रांड्स है, तो आप "(। +)" से मिलान कर सकते हैं और "\, (eval (पढ़ें \ &)) "।

2

यदि आप टेक्नोमैंसी द्वारा एमएक्स स्टार्टर किट का उपयोग कर रहे हैं तो "एस्क-eval-and-replace" फ़ंक्शन है जो elisp sexp का मूल्यांकन करता है और उन्हें प्रतिस्थापित करता है। यह डिफ़ॉल्ट रूप से C-c e से जुड़ा हुआ है।

संबंधित मुद्दे