`खोजने-फ़ाइल-नाक-नक्श 'में क्या गड़बड़ है?


11

हाल ही में एक में जवाब द्वारा lunaryorn , उन्होंने कहा:

हालाँकि, मैं ओर्ग के अधिकांश अन्य हिस्सों के खिलाफ सुझाऊंगा, क्योंकि पहले से ही टिप्पणियों में बताए गए कारणों के लिए: यह पुरानी है, और विरासत और हानिकारक प्रथाओं से भरा है (जैसे कि गैर-संवादात्मक रूप से फ़ाइलों को पढ़ने के लिए फ़ाइल-नोजल खोजें)।

क्या कोई समझा सकता है कि find-file-noselectएलिस्प कार्यक्रमों में फ़ाइलों को पढ़ने के लिए एक बुरा विचार क्यों है ? क्या कोई बेहतर तरीका है? मैं पूछ रहा हूं क्योंकि मैं अपने एक प्रोजेक्ट में इसका इस्तेमाल करने की सोच रहा था।


लगता है, good-practicesपहले कोई टैग नहीं था ; क्या इसका उपयोग करना अच्छा विचार है?
mbork

मुझे लगता है कि good-practices"मेटा टैग," जो है की श्रेणी में आते हैं पर नाक-भौं सिकोड़ी एसई द्वारा।
22

1
@nispio मुझे लगता है कि यह एक वैध टैग है, लेकिन हम इसे पाठ्यक्रम के मेटा में ले जा सकते हैं।
मालाबार

1
@nsipio: मैंने उस लेख के माध्यम से स्किम किया है, और मैं सहमत नहीं हूं। लेकिन यह मुझे नहीं है जो फैसला करता है। ;-)
mbork

जवाबों:


14

TL; DR : वास्तव में क्या होता है, इसके बारे में find-file-noselectआपके पास कोई नियंत्रण नहीं है, और आप बफर में सक्षम मनमाने ढंग से मामूली मोड के साथ समाप्त हो सकते हैं, यह इस बात पर निर्भर करता है कि उपयोगकर्ता अपने में सक्षम क्या है init.el। इसके अलावा, सफाई कठिन है।

उपयोग करें with-temp-bufferऔर insert-file-contentsइसके बजाय। यदि आपको बफर में विशिष्ट प्रमुख या मामूली मोड की आवश्यकता है, तो उन्हें स्पष्ट रूप से सक्षम करें । फ़ाइलों को लिखने के लिए, with-temp-fileइसके बजाय उपयोग करें , जो इसके नाम के बावजूद — आपको मनमानी फ़ाइलों को लिखने देता है।

दुष्प्रभाव

find-file-noselectहै एक बहुत , दुष्प्रभाव के सहित

  • अंतःक्रियात्मक रूप से प्रश्न पूछने (कि अकेले गैर-संवादात्मक उपयोग में एक जाना है),
  • स्वचालित रूप से पठनीय फ़ाइलों के लिए व्यू मोड को सक्षम करना,
  • सामान्य मोड में प्रवेश करना अन्यथा,
  • और चल रहा है find-file-hook

सामान्य मोड ही

  • स्वचालित रूप से वर्तमान बफर के लिए एक उचित प्रमुख मोड का चयन करता है,
  • सभी संबंधित प्रमुख और मामूली मोड हुक चलाता है,
  • और वर्तमान बफ़र, यानी फ़ाइल चर और निर्देशिका चर के लिए सभी स्थानीय चर पढ़ता है, जो फिर से असुरक्षित असुरक्षित चर के बारे में इंटरैक्टिव सवाल पूछ सकता है।

चूंकि सभी हुक चलाए जाते हैं, इसलिए आपको उपयोगकर्ता द्वारा सक्षम किए गए सभी मामूली मोड और हुक फ़ंक्शंस मिलते हैं init.el, जो मामूली असुविधाओं (यदि अवांछनीय मामूली मोड सक्षम हैं) से लेकर प्रमुख कहर तक हो सकते हैं (यदि उपयोगकर्ता ने हुक फ़ंक्शन जोड़ा है, जो अपेक्षा करता है एक संवादात्मक संदर्भ से कहा जाता है)।

एक उदाहरण के लिए https://github.com/flycheck/flycheck/issues/366 देखें । find-file-noselectफ्लाईकैच द्वारा एक डेटा फ़ाइल को वाक्यविन्यास-जांच के कारण प्रयोग किया जाता है, और चूंकि यह एमएसीएस शट-डाउन हो रहा था, इसलिए एक अस्थायी फ़ाइल को पीछे छोड़ते हुए, इसे ठीक से साफ करने का समय नहीं था।

साफ - सफाई

साथ find-file-noselectबफर फिर से मारने के लिए आप अतिरिक्त सावधान रहने की जरूरत है। find-file-noselectआपके लिए ऐसा नहीं है।

आपको किसी स्थान पर बफर को याद करने की आवश्यकता है, और unwind-protectयह सुनिश्चित करने के लिए सावधानीपूर्वक उपयोग करें कि बफर गैर-स्थानीय निकास के मामले में भी मारा जाता है।

वैकल्पिक

फ़ाइलों को पढ़ने के लिए, उपयोग करें with-temp-bufferऔर insert-file-contents, जो केवल सबसे बुनियादी चीजें करता है, उदाहरण के लिए कोडिंग सिस्टम रूपांतरण, लेकिन सवाल नहीं पूछता है, हुक सक्षम करता है, या स्थानीय चर सेट करता है:

(with-temp-buffer
  (insert-file-contents (locate-user-emacs-file "foo.el"))
  ;; Enter the major mode explicitly
  (emacs-lisp-mode)
  ;; …
  )

with-temp-buffer अपने शरीर के अंत में अस्थायी बफर को ठीक से मारने का ख्याल रखता है।

फ़ाइलों को लिखने के लिए, उपयोग करें with-temp-file, जो एक अस्थायी बफर बनाता है और उसके शरीर के अंत में दिए गए फ़ाइल नाम पर सामग्री लिखता है:

(with-temp-file  (locate-user-emacs-file "foo.el")
  (prin1 (list 'my 'data) (current-buffer)))

10

एलिसा मैनुअल में धारा 24.3 से:

किसी फ़ाइल की सामग्री को एक बफर में कॉपी करने के लिए, फ़ंक्शन का उपयोग करें insert-file-contents। ( insert-fileलिस्प कार्यक्रम में कमांड का उपयोग न करें , क्योंकि यह चिह्न सेट करता है।)

इसके लिए Elisp प्रलेखन की खोज find-file-noselectस्पष्ट है कि यह एक बफर में फ़ाइल पढ़ने से बहुत अधिक है। शायद जो लोग इस फ़ंक्शन का उपयोग करने के बारे में सोचते हैं, वह एक बुरा विचार है, संभवतः अवांछित, दुष्प्रभावों के बारे में सोच रहे हैं? मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं। यदि आप यथासंभव स्वच्छ / अछूता बफर सामग्री रखना चाहते हैं, तो पुराने और भरोसेमंद with-temp-buffer+ insert-file-contentsसंयोजन का उपयोग करना एक अच्छा विचार हो सकता है । यदि आप चाहते हैं कि बफर सामग्री क्या find-fileउत्पादन के करीब हो , तो शायद आप उपयोग करना चाहते हैं find-file-noselect? या शायद वह के बारे में सोच रहा था find-file;)


3
अगर कुछ गैर-अंतःक्रियात्मक रूप से किया जा रहा है, तो मैं ऐसा कोई परिदृश्य नहीं देख सकता जिसमें आप चाहते हैं कि "बफर सामग्री जो खोजे जाने वाली फ़ाइल के करीब होगी" । फाइंड-फाइल धीमा है क्योंकि यह एक टन अनावश्यक सामान करता है, जिसमें सभी प्रकार के हुक भी शामिल हैं। खोज-फ़ाइल का एकमात्र "फ़ीचर" जो आप चाहते हैं कि प्रमुख-मोड हो सकता है, लेकिन फिर आपको बस इसे स्वयं सक्रिय करना चाहिए (आप यह भी गारंटी नहीं ले सकते हैं कि खोजने-फ़ाइल उस मोड को चालू कर दें जो आप वैसे भी चाहते हैं)।
मालाबार

मालाबार: यदि आप उपयोगकर्ता द्वारा संपादन के लिए बफर के लिए उपलब्ध रहने का इरादा रखते हैं, तो आप इस find-fileप्रक्रिया की नकल करना चाहते हैं ।
फोलेट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.