2015-05-29 5 views
6

क्या Emacs लिस्प प्रोग्रामर, करते हैं जब वे कुछ मोटे तौर पर के बराबर लिखने के लिए चाहते हैं ...ईएमएसीएस लिस्प प्रोग्रामर गैर-संपादन उद्देश्यों के लिए टेक्स्ट फ़ाइलों को कैसे पढ़ते हैं?

for line in open("foo.txt", "r", encoding="utf-8").readlines(): 
    ...(split on ws and call a fn, or whatever)... 

..?

जब मैं ईएमएसीएस लिस्प सहायता में देखता हूं, तो मुझे टेक्स्ट संपादन बफर में फ़ाइलों को खोलने के बारे में कार्य दिखाई देता है - बिल्कुल वही नहीं जो मैं चाहता था। मुझे लगता है कि मैं फाइल की लाइनों पर जाने के लिए फ़ंक्शन लिख सकता हूं, लेकिन अगर मैंने ऐसा किया, तो मैं नहीं चाहता कि उपयोगकर्ता इसे देख सके, और इसके अलावा, यह टेक्स्ट-प्रोसेसिंग स्टैंडपॉइंट से बहुत प्रभावी प्रतीत नहीं होता है।

उत्तर

9

मैं का एक और अधिक प्रत्यक्ष अनुवाद लगता है मूल अजगर कोड इस प्रकार है:

(with-temp-buffer 
    (insert-file-contents "foo.txt") 
    (while (search-forward-regexp "\\(.*\\)\n?" nil t) 
    ; do something with this line in (match-string 1) 
    )) 

मुझे लगता है कि with-temp-buffer/insert-file-contents आम तौर पर with-current-buffer/find-file-noselect बेहतर है, क्योंकि पूर्व की गारंटी देता है वें आप पूरी फाइल सामग्री की ताजा प्रति के साथ काम कर रहे हैं।बाद के निर्माण के साथ, यदि आपके पास पहले से ही लक्ष्य फ़ाइल पर जाकर एक बफर होता है, तो उस बफर को find-file-noselect द्वारा वापस कर दिया जाता है, इसलिए यदि उस बफर को संकुचित कर दिया गया है, तो आप इसे तब संसाधित करते समय फ़ाइल के उस भाग को देखेंगे।

ध्यान रखें कि यह फ़ाइल लाइन-दर-लाइन को संसाधित करने के लिए पर अधिक सुविधाजनक हो सकता है।

(with-temp-buffer 
    (insert-file-contents "foo.txt") 
    (loop while (search-forward-regexp "[0-9]+" nil t) 
     collect (match-string 0))) 

(require 'cl)loop मैक्रो में लाने के लिए पहले: उदाहरण के लिए, यह एक अभिव्यक्ति है कि फाइल में लगातार अंकों के सभी दृश्यों की एक सूची लौटाती है।

+1

यदि लाइन लाइन से लाइन लाइन को प्रोसेस करना है, तो आमतौर पर 'फॉरवर्ड लाइन' या 'एंड-ऑफ-लाइन' का उपयोग करना तेज़ होता है। – jch

+1

मेरे अनुभव में 'अग्रेषित लाइन' और किन का उपयोग करके फ़ाइल के अंत की पहचान करना थोड़ा मुश्किल है यदि अंतिम पंक्ति एक नई लाइन के साथ समाप्त हो सकती है या नहीं। – Sean

4
  1. हाँ, कि है कि आप क्या करना चाहते हैं: एक बफर में फ़ाइल पर जाएँ, और कि बफर में पाठ पर कार्य करते हैं।

  2. आप नहीं को बफर प्रदर्शित करना है, यानी, उपयोगकर्ता को इसे देखने की आवश्यकता नहीं है।

  3. और दक्षता के लिए: एक बफर में पाठ को जोड़ना आमतौर पर अधिक टेक्स्ट में हेरफेर करने का प्रभावी तरीका है।


आप कई तरीकों से एक बफर में एक फ़ाइल पर जा सकते हैं। उपयोग के मामले के आधार पर आप इसके लिए मौजूदा फ़ाइल बफर का उपयोग करना चाहेंगे। यही है, अगर फ़ाइल Emacs में पहले से ही "खुला" है तो आप इसके बफर का उपयोग करना चाहेंगे।

या आप किसी भी मौजूदा फ़ाइल बफर को पहले से ही "खुली" फ़ाइल के लिए अवहेलना करना चाहेंगे, और फ़ाइल को नए बफर में पढ़ सकते हैं। इसके लिए, @Sean उल्लेख के रूप में, आप insert-file-contents का उपयोग कर रहे बफर के साथ कर सकते हैं। आप with-temp-buffer या generate-new-buffer का उपयोग करके बफर बना सकते हैं, फिर से, जो आप चाहते हैं/इसके साथ करने की आवश्यकता है।

यदि आप पहले से ही फ़ाइल पर जा रहे बफर का पुन: उपयोग करना चाहते हैं, तो आप यह जांच सकते हैं कि इसे स्मृति में संशोधित किया गया है, चाहे वह संकुचित हो, आदि, और जो भी आपके उपयोग के मामले के लिए उपयुक्त है। फ़ंक्शन find-buffer-visiting का उपयोग करके आप जांच सकते हैं कि पहले से ही एक बफर फ़ाइल (किसी भी पथ/फ़ाइल नाम का उपयोग कर) का दौरा कर रहा है।

फ़ाइल पर जाने के लिए, किसी भी मौजूदा बफर का लाभ उठाकर, आप find-file-noselect का उपयोग कर सकते हैं। वह फ़ंक्शन उस बफर को लौटाता है जो फ़ाइल पर जाता है, ताकि आप उस बफर को with-current-buffer पर पहली तर्क के रूप में पास कर सकें। ये रहा एक सरल उदाहरण।

(with-current-buffer (let ((enable-local-variables ())) (find-file-noselect file)) 
    ;; Do some stuff with the text in the buffer. 
    ;; Optionally save the buffer back to the file. 
) 

(enable-local-variablesnil करने के बंधन एक छोटी सी अनुकूलन, मामले ऐसे हैं जिनमें बफर-स्थानीय चर के साथ परेशान करने के लिए की जरूरत नहीं है के लिए है।)

+0

'find-file-noselect' के साथ समस्या यह है कि क्या होता है यदि उपयोगकर्ता पहले से ही फ़ाइल पर जा रहा है। यही कारण है कि शॉन के उत्तर में, एक अस्थायी बफर में 'insert-file' का उपयोग करना बेहतर है। – jch

+0

@jch: नहीं, सामान्यीकरण "यह बेहतर है" गलत है। यह सब उस चीज पर निर्भर करता है जो आप चाहते हैं/करने की आवश्यकता है - समाधान/कार्यान्वयन का शैतान समस्या/आवश्यकता के विवरण में है। सवाल का महत्वपूर्ण जवाब यह है कि मैंने 1, 2, 3 के रूप में सामने रखा है। प्रश्न के रूप में प्रश्न गलतफहमी पर आधारित है, जो 1, 2, 3 को साफ़ करना चाहिए। – Drew

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

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