मैंने एक Emacs Lisp फ़ंक्शन लिखा है जो पर एक शेल कमांड को एक दिए गए स्ट्रिंग को संसाधित करता है और परिणामी स्ट्रिंग को वापस करता है। यहाँ एक सरलीकृत उदाहरण जो सिर्फ tr
कॉल अपरकेस करने के लिए पाठ परिवर्तित करने के लिए है:Emacs को पूर्ववत सीमा सेट करने से कैसे रोकें?
(defun test-shell-command (str)
"Apply tr to STR to convert lowercase letters to uppercase."
(let ((buffer (generate-new-buffer "*temp*")))
(with-current-buffer buffer
(insert str)
(call-process-region (point-min) (point-max) "tr" t t nil "'a-z'" "'A-Z'")
(buffer-string))))
इस समारोह, एक अस्थायी बफर बनाता पाठ सम्मिलित करता है, कहता है tr
, परिणाम के साथ पाठ की जगह है, और परिणाम देता है।
ऊपर समारोह की उम्मीद रूप में काम करता है, तथापि, जब मैं इस समारोह क्षेत्र के लिए आदेश लागू करने के लिए चारों ओर एक आवरण लिखते हैं, के दो चरण हैं पूर्ववत इतिहास में जोड़ा जा रहा। यहाँ एक और उदाहरण है:
(defun test-shell-command-region (begin end)
"Apply tr to region from BEGIN to END."
(interactive "*r")
(insert (test-shell-command (delete-and-extract-region begin end))))
जब मैं फोन M-x test-shell-command-on-region
, क्षेत्र अपरकेस पाठ के साथ बदल दिया जाता है, लेकिन जब मैं C-_
(undo
) दबाते हैं, तो पूर्ववत इतिहास में पहली कदम का पाठ हटाया वाला राज्य है, । पर जाकर दो कदम पीछे जाएं, मूल पाठ पुनर्स्थापित किया गया है।
मेरा सवाल यह है कि, मध्यवर्ती चरण को से पूर्ववत इतिहास में कैसे जोड़ा जाता है? मैंने Emacs documentation on undo, पढ़ा है, लेकिन जहां तक मैं कह सकता हूं इसे संबोधित नहीं करता है।
यहाँ एक समारोह जो फोन करके एक ही बात सिद्ध है निर्मित Emacs समारोह upcase
, बस से पहले के रूप में:
(defun test-upcase-region (begin end)
"Apply upcase to region from BEGIN to END."
(interactive "*r")
(insert (upcase (delete-and-extract-region begin end))))
: delete-and-extract-region
परिणाम के साथ के परिणाम पर insert
को हस्तांतरित कर दिया जा रहा है M-x test-upcase-region
पर कॉल करते समय, पूर्ववत इतिहास में केवल एक ही चरण है, जैसा कि अपेक्षित है। तो, ऐसा लगता है कि test-shell-command
पर कॉल करना एक पूर्ववत सीमा बनाता है। क्या इसे किसी भी तरह से बचा जा सकता है?
अव्यवस्थित होने से आदेशों को रोकने के लिए हमेशा की तरह '(पूर्ववत करें)' एक अलग तरह से मिल रहा है , वह ऐसा नहीं करता है। यहां उदाहरण यह है कि आपको लगभग अस्थायी बफर कभी नहीं बनाना चाहिए, बल्कि वस्तुओं के साथ काम करना चाहिए। – PascalVKooten
अस्थायी फ़ाइलों को मैन्युअल रूप से पढ़ने और लिखने के अलावा, मुझे प्रक्रिया आउटपुट को कैप्चर करने का एक और तरीका सुनिश्चित नहीं है। यहां तक कि 'स्टार्ट-प्रोसेस' जैसे एसिंक्रोनस प्रोसेस कमांड भी बफर को आउटपुट भेजना चाहते हैं। –
@JasonBlevins 'shell-command-on-region' के लिए पांचवां पैरामीटर प्रतिस्थापन है, तो आपको इसे लपेटने की आवश्यकता क्यों है? –