2009-06-03 8 views
58

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

;; 
;; 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)))) 

मैं "??? file-exist ???" के लिए क्या उपयोग कर सकता हूं?

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

पृष्ठभूमि

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

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

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

समाधान

उनकी मदद और टिप्पणियों के लिए हर किसी के लिए धन्यवाद। उपयोग करने के लिए सही फ़ंक्शन को इंगित करने के लिए 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)) 
     ) 
    ) 
) 
+3

एलिसप में, अपने कार्यों के ऊपर टिप्पणियां डालने के बजाय, आप उन्हें फ़ंक्शन घोषणा की पहली पंक्ति में लिख सकते हैं। इसे "डॉकस्ट्रिंग" कहा जाता है। Http: //www.gnu देखें।संगठन/सॉफ्टवेयर/emacs/elisp/html_node/दस्तावेज़ीकरण- Basics.html –

+9

नोट: आपके पहले दो कार्य Emacs के साथ आते हैं, उन्हें 'फ़ाइल-नाम-एक्सटेंशन' और फ़ाइल-नाम-संस-एक्सटेंशन –

उत्तर

79

कोशिश file-exists-p

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

+2

नाम क्यों दिया जाता है जब मैं "सीएच ए" एप्रोस खोज करता हूं तो फ़ंक्शन दिखाई देता है? मैंने फ़ाइल की खोज करने और 'अस्तित्व' के परिणामों के माध्यम से जाने की कोशिश की, और अस्तित्व में कोई मिलान नहीं है! –

+0

हाँ, मैंने इस तरह से 'अस्तित्व' की तलाश करने की कोशिश की, फिर फाइलों में 'find-file-मौजूदा' फ़ंक्शन पाया। इसे खोल दिया और फ़ाइल-मौजूद-पी पाया। पता नहीं क्यों यह सी-एच के तहत दिखाई नहीं देता है – cobbal

+12

फ़ाइल-मौजूद-पी "सी-एच ए" के तहत दिखाई नहीं देता है क्योंकि यह "इंटरैक्टिव" फ़ंक्शन नहीं है। हालांकि यह "एम-एक्स apropos" के तहत दिखाना चाहिए। – Edric

14
  • आपको क्या चाहिए के आधार पर आप file-readable-p बजाय file-exists-p चाहते हो सकता है।

  • Apropos केवल आपको अभी तक प्राप्त करेगा। Iciclesapropos completion और progressive completion प्रदान करता है जो आपको कमांड, फ़ंक्शन, वेरिएबल इत्यादि के लिए आसानी से मदद ढूंढने देता है जो उपनिवेशों को मनमानी क्रम में मिलान करता है (क्या यह file-exists-p या exists-file-p है?)।

7

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

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

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