अगर कोई फ़ाइल Emacs Lisp का उपयोग करके मौजूद है, तो मैं कैसे जांच सकता हूं?




elisp (2)

फ़ाइल और निर्देशिका हेरफेर के लिए f.el , आधुनिक लाइब्रेरी का उपयोग करें। आप f-exists? उपयोग कर सकते हैं f-exists? , f-file? , f-directory? और कई अन्य भविष्यवाणी की है। पुस्तकालय मानक कार्यों की तुलना में बेहतर है, क्योंकि यह हर फ़ाइल से संबंधित कार्य है जिसे आपको कभी भी एक नामस्थान की आवश्यकता होगी

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

;;
;; get file extension
;;
(defun get-ext (file-name)
  (car (cdr (split-string file-name "\\."))))

;; 
;; get the base name of the file
;;
(defun base-name (file-name)
  (car (split-string file-name "\\.")))

;;
;; if an 'lzz' file exists for this header, mark it as read only
;;
(defun mark-read-only ()
  (if (string= (get-ext (cur-file)) "h")
      (if ( ??file-exists??? (concat (base-name (cur-file)) ".lzz") )
          (toggle-read-only))))

मैं "??? फ़ाइल-मौजूद ???" के लिए क्या उपयोग कर सकता हूं?

एक बार जब मुझे यह पता चलता है, तो मैं "हुक-रीड-ओनली" को उपयुक्त हुक में जोड़ दूंगा (जो मुझे लगता है कि फाइल-हुक है)।

पृष्ठभूमि

हम अपनी C / C ++ विकास प्रक्रिया को सरल बनाने के लिए एक कोड जनरेटर के रूप में lzz उपयोग करते हैं। संक्षेप में, लेज़ एक एकल इनपुट फ़ाइल लेता है (जो सी / सी ++ की तरह दिखता है) और हेडर और स्रोत फ़ाइलों को उपयुक्त बनाता है।

डिफ़ॉल्ट रूप से, lzz में #line निर्देश शामिल होते हैं ताकि डिबगर मूल स्रोत की ओर इंगित करता है न कि उत्पन्न स्रोत, हालाँकि, संकलन निर्भरता को कम करने के लिए हम सामान्यतया हेडर फ़ाइलों में इन निर्देशों को अक्षम करते हैं। परिणाम यह है कि जब डीबगिंग टेम्प्लेट या इनलाइन फ़ंक्शन होते हैं, तो डिबगर सामान्य रूप से उत्पन्न हेडर फ़ाइल को इंगित करता है न कि मूल स्रोत फ़ाइल को।

यह कोई बड़ी बात नहीं है, हालांकि, हाल ही में मैंने पाया है कि डिबगिंग करते समय मैं प्रदर्शित फ़ाइल में एक त्वरित संशोधन करूँगा और फिर मैं पुनर्निर्माण करूँगा। निश्चित रूप से इसका सामान्य अर्थ है कि मैंने जो बदलाव किया है वह गायब हो जाता है क्योंकि मैंने जो फ़ाइल संपादित की है वह उत्पन्न हुई है और इसलिए लाइब्रेरी के पुनर्निर्माण के दौरान परिवर्तन "उड़ाए गए" हैं।

उपाय

उनकी मदद और टिप्पणियों के लिए सभी को धन्यवाद। एक विशेष धन्यवाद cobbal का उपयोग करने के लिए सही फ़ंक्शन को इंगित करने के लिए।

यहां परिणामी कोड (अन्य टिप्पणियों के आधार पर अपडेट यहां भी):

(defun cur-file ()
  "Return the filename (without directory) of the current buffer"
  (file-name-nondirectory (buffer-file-name (current-buffer)))
  )

(defun mark-generated-as-read-only ()
  "Mark generated source files as read only.
Mark generated files (lzz or gz) read only to avoid accidental updates."
  (if
      (or (string= (file-name-extension (cur-file)) "h")
          (string= (file-name-extension (cur-file)) "cpp"))
      (cond
       (
        (file-exists-p (concat (file-name-sans-extension (cur-file)) ".lzz"))
        (toggle-read-only))
       (
        (file-exists-p (concat (file-name-sans-extension (cur-file)) ".gz") )
        (toggle-read-only))
       )
    )
  )

file-exists-p प्रयास करें

"फ़ाइल फ़ाइल नाम मौजूद है या नहीं (आप इसे पढ़ सकते हैं या नहीं)।"





elisp