कैसे जांचें कि कोई बफर किसी फाइल पर जा रहा है या नहीं?


9

मैं जांचना चाहूंगा कि क्या कुछ (कहते हैं, वर्तमान) बफर एक फ़ाइल पर जा रहा है या नहीं। मैं कह सकता था:

(if (buffer-file-name) ...)

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

मुझे इसकी आवश्यकता है कि क्या मैं वर्तमान बफ़र फ़ाइल के नाम के आधार पर एक निर्देशिका बनाना चाहता हूं, और वर्तमान में मैं कम या ज्यादा कर रहा हूं:

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

तो, ऐसा करने का एलिस्प-मुहावरेदार तरीका क्या होगा?


2
सुनिश्चित नहीं है कि आप buffer-file-nameवास्तव में उपयोग करने पर आपत्ति क्यों करते हैं , यह करने का सही तरीका है (यदि आप वास्तव में चाहते हैं t, तो करें (and (buffer-file-name) t)लेकिन यह बदसूरत आईएमओ है)। इसका कार्यान्वयन filenameबफर सी संरचना के क्षेत्र को पढ़ रहा है , जो वैसे भी सीधे एलिस्प से सुलभ नहीं है। अंत में, यह सिर्फ एक संकेतक है जो या तो अशक्त है या नहीं।
सिग्मा

खैर, अगर यह सही तरीका है, तो मेरे साथ ठीक है। जैसा कि मैंने कहा - मैं सी कार्यान्वयन को नहीं जानता था, और सामान्य ज्ञान कहता है कि फ़ाइल नाम के लिए पूछना जब मैं केवल यह जानना चाहता हूं कि क्या कोई निरर्थक हो सकता है।
mbork

और मैं मानता हूं कि (and (buffer-file-name) t)अजीब लग रहा है।
mbork

अगर आपको नहीं लगता है कि (if (buffer-file-name) ... )यह सुरुचिपूर्ण है, तो आप बहुत लंबे समय तक क्विज़ में कोडिंग नहीं कर रहे हैं। यह केवल यहाँ से बदसूरत हो जाता है।
nispio

जवाबों:


12

मैं बहस चाहते हैं कि अपने उपयोग है मुहावरेदार elisp, के बाद से बफर का नाम अपने आप में एक पूरी तरह से उचित बूलियन मान है। मैनुअल से उद्धरण :

अगर एक अभिव्यक्ति में सत्य परीक्षण के लिए एक महत्वपूर्ण पहलू है। अब तक, हमने 'सत्य' और 'असत्य' के बारे में भविष्यवाणी के मूल्यों के रूप में बात की है, जैसे कि वे नए प्रकार के एमएसीएस लिस्प ऑब्जेक्ट थे। वास्तव में, `झूठा 'सिर्फ हमारा पुराना दोस्त है nil। और कुछ भी - कुछ भी - सच है '।

बिंदु को आगे बढ़ाने के लिए, कोड देखें clone-buffer। मुझे उम्मीद है कि आप निम्नलिखित देखेंगे:

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

ध्यान दें कि यह buffer-file-nameफ़ंक्शन को तर्क के बिना कॉल करने के बजाय चर बंधन का परीक्षण कर रहा है (buffer-file-name), लेकिन दोनों को हमेशा एक ही व्यवहार करना चाहिए।


8

आप (buffer-file-name)(वैकल्पिक बफर तर्क के साथ) या बफर-स्थानीय buffer-file-nameचर का उपयोग कर सकते हैं । दोनों दिए गए बफर के लिए एक ही मूल्य का मूल्यांकन करते हैं।

यही कारण है कि है , इसलिए आपका कोड ठीक है, हालांकि elisp में ऐसा करने के लिए,, मुहावरेदार रास्ता। यदि आप सख्त चाहते थे तो आप हमेशा एक buffer-has-file-pरैपर फंक्शन कर सकते थे ।


धन्यवाद। क्या फंक्शन या वैरिएबल चुनने में कोई महत्वपूर्ण अंतर है?
mbork

1
मुझे ऐसा नहीं लगता। यदि आपको बफ़र तर्क को इंगित करने की आवश्यकता है, तो (buffer-file-name BUFFER)निश्चित रूप से अच्छा है (with-current-buffer BUFFER buffer-file-name), लेकिन अन्यथा मुझे नहीं लगता कि यह आपके द्वारा उपयोग किए जाने वाले मामलों (और जैसा कि फ़ंक्शन सी में लिखा गया है, मुझे संदेह है कि प्रदर्शन में बहुत अंतर है)।
फिल्स

3

बस उपयोग करें buffer-file-name। लिस्प में, हम अक्सर एक गैर- nilमूल्य का उपयोग करते हैं, जिसका अर्थ है सच

केवल आप इससे बचना चाहते हैं यदि फ़ंक्शन महंगा है या अवांछित दुष्प्रभाव हैं।


समझा। मुझे पता है कि कुछ भी गैर- nilसत्य है, मैंने सोचा था कि मैं नाम को हथियाना चाहता हूं जब मैं केवल यह जानना चाहता हूं कि क्या कोई नाम मौजूद है "महंगा" - लेकिन प्रतीत होता है कि यह नहीं है।
mbork

1

से "बफर सूची" अध्याय दस्तावेज की:

बफर-लिस्ट द्वारा लौटी सूची विशेष रूप से निर्मित है; यह एक आंतरिक Emacs डेटा संरचना नहीं है , और इसे संशोधित करने का बफ़र्स के आदेश पर कोई प्रभाव नहीं है।

इसलिए आपको जीवित बफ़र्स की सूची में खोज करने का एक तरीका खोजना होगा। यहां एक है:

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.