बिंदीदार बफ़र्स में, उस निर्देशिका की सबसे महत्वपूर्ण फ़ाइल पर बिंदु को रखें


14

जब मैं Emacs में किसी डायरेक्टरी को देखने जाता हूं, तो 90% मैं एक विशिष्ट फाइल की ओर जाता हूं और उसे खोलता हूं। बहुत बार, मुझे जिस फ़ाइल को खोलने की आवश्यकता है, वह बहुत अनुमानित है। उदाहरण के लिए:

  • यदि .texइस निर्देशिका में फाइलें हैं , तो मैं आमतौर पर सीधे जाता हूं master.tex
  • एंड्रॉइड प्रोजेक्ट की जड़ में, यह आमतौर पर है AndroidManifest.xml
  • एक निर्देशिका में जहां मैं एक एमएसीएस पैकेज विकसित करता हूं, यह लगभग हमेशा पैकेज का मुख्य स्रोत फ़ाइल है। यह आमतौर पर है, लेकिन हमेशा नहीं, .elइस निर्देशिका में एकमात्र फ़ाइल।

जब मैं इन निर्देशिकाओं को खोलता हूं तो क्या इन फाइलों पर बिंदु स्वचालित रूप से रखने का कोई तरीका है?

यह बहुत अधिक सुविधा प्रदान करेगा (जैसा कि मैं उन्हें सिर्फ मारकर खोल सकता था RET), लेकिन फिर भी अन्य फ़ाइलों पर जाने का लचीलापन देगा।

जवाबों:


16

के लिए एक कस्टम फ़ंक्शन लिखें dired-initial-position-hook। इस फ़ंक्शन में आप फ़ाइलों के लिए खोज करने के लिए विभिन्न डायरेटेड फ़ंक्शंस का उपयोग कर सकते हैं, और अंततः dired-goto-file"बेस्ट" फ़ाइल पर जाने के लिए कॉल कर सकते हैं:

(defun my-dired-goto-important-file ()
  "Go to an important file in the current dired buffer."
  (unless (bound-and-true-p save-place)
    (let ((candidates '("master.tex" "AndroidManifest.xml"))
          candidate)
      (while (and candidates
                  (not (dired-goto-file (expand-file-name (pop candidates)))))
        nil))))

(add-hook 'dired-initial-position-hook #'my-dired-goto-important-file)

निम्नलिखित में मैं इस फ़ंक्शन के विशिष्ट पहलुओं की व्याख्या करूँगा, और संभावित एक्सटेंशन पर प्रकाश डालूँगा।

फाइलों में कूदना

dired-goto-fileरिटर्न nilअगर फ़ाइल वर्तमान में मौजूद बफ़र में मौजूद नहीं है, तो बिना पूर्व जाँच के कॉल करना सुरक्षित है। हालांकि, dired-goto-fileएक पूर्ण फ़ाइल नाम की आवश्यकता है (यह सापेक्ष नामों पर त्रुटियां हैं), इसलिए expand-file-name

फ़ाइलों के लिए खोज

फ़ाइलों के लिए खोज करने के लिए एक सीधे-सीधे एपीआई प्रदान नहीं करता है। आम तौर पर, आप सभी फ़ाइलों पर उसी तरह से पुनरावृति कर सकते हैं, जैसे आप बफर में सभी लाइनों पर पुनरावृति करेंगे:

(let (files)
  (goto-char (point-min))
  (while (not (eobp))
    (let ((filename (dired-get-filename nil 'no-error)))
      (when filename
        (push filename files)))
    (forward-line 1))
  ;; Now `files' is a list of files, which you can search for patterns
  ;; …
  )

हालांकि, अंकन कार्यों का उपयोग करना अधिक सुविधाजनक है। एक "असामान्य" मार्कर वर्णों का उपयोग करने के लिए ध्यान रखें, मौजूदा इंटरेक्टिव अंक को ढीला न करने के लिए:

(unwind-protect
    (when (dired-mark-files-regexp (rx ".tex" string-end) ?t)
      (dired-goto-file (expand-file-name "master.tex")))
  (dired-unmark-all-files ?t))

स्थान मोड सहेजें

यदि आपने इसे सक्षम किया है, तो आपको सेव प्लेस मोड के संबंध में भी सावधान रहना होगा। डेयर किए गए बफ़र्स में, सेव प्लेस मोड अन्य मोड की तरह पॉइंट वैल्यू को याद नहीं करता है, बल्कि अंतिम फ़ाइल नाम बिंदु पर था। यह इस फ़ाइल नाम को ठीक उसी तरह पुनर्स्थापित करता है जैसे हम करते हैं: यह हुक करता है dired-initial-position-hookऔर कॉल करता है dired-goto-file(वास्तव में, यहीं पर मैंने उस कोड को :) से चुराया था)।

अगर हमारा हुक सेव जगह से पहले आता है, तो सेव प्लेस मोड हमारी स्थिति को बिना शर्त लिख देगा। हालाँकि, यदि यह हमारे हुक से पहले आता है (जैसा कि जब आप इस हुक को सेटअप करने के बाद सेव प्लेस इनेबल होता है तो) हमारा फंक्शन वास्तव में सेव प्लेस को अधिलेखित कर देगा जो वांछनीय नहीं है। हालाँकि, किसी भी बफ़र की तरह, सेव प्लेस लोकल वैरिएबल save-placeको नॉन-नील वैल्यू पर सेट करता है , इसलिए हम बस इसे चेक कर सकते हैं और केवल इसे सेव कर सकते हैं। सेव प्लेस ने फाइल नेम को रिस्टोर नहीं किया।

यदि आप इसके बजाय सहेजें प्लेस "ढीला" है चाहते हैं, तो के लिए चेक निकालने के save-placeलिए, और यकीन है कि हमारे हुक चलाया जाता है बनाने के बाद , सहेजें प्लेस सहेजें प्लेस मोड को सक्षम करने से पहले , और फिर बुला add-hookइसके लिए एक गैर-शून्य मान के साथ APPENDतर्क।


बहुत बढ़िया जवाब। आप परिभाषित करना चाह सकते हैं bound-and-true-p। :-)
मालाबार

@ मालाबार bound-and-true-pएक बिल्ट-इन मैक्रो है bindings.el
चंद्रग्रहण

प्रिय भगवान, मैं वह नहीं करता जो मुझे बुरा लगता है, तथ्य यह है कि मुझे पता नहीं था या तथ्य यह है कि मैंने जांच भी नहीं की थी।
मालाबार

@ मलबारबा ने कोई बात नहीं, इस समारोह के अस्तित्व की खोज में मुझे एक साल (सचमुच) लग गया।
चंद्रग्रहण

हाँ, यह एक अद्भुत कार्य है जिसके बारे में मैंने अब तक कभी नहीं सुना था!
पवित्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.