2011-06-16 4 views
5

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

\main_folder 
    \project1 
    \project2 
    \project3 
...etc 

मैं जोड़ी कार्य/फ़ाइल पर हुक खुला और कहा कि untabify बचाने के लिए और पूरे बफर मैं पर काम tabify है।

;; My Functions 
(defun untabify-buffer() 
      "Untabify current buffer" 
     (interactive) 
     (untabify (point-min) (point-max))) 

(defun tabify-buffer() 
     "Tabify current buffer" 
     (interactive) 
     (tabify (point-min) (point-max))) 

;; HOOKS 
; untabify buffer on open 
(add-hook 'find-file-hook 'untabify-buffer) 
; tabify on save 
(add-hook 'before-save-hook 'tabify-buffer) 

तो मैं .emacs में रख फ़ाइल यह मैं खुले जो नहीं है मैं क्या चाहते हैं हर .py फ़ाइल पर चलाया जाता है। मुझे क्या लगता है कि इन हुकों को केवल संबंधित उपफोल्डर के साथ एक विशेष फ़ोल्डर में उपयोग किया जाए। कोशिश की .dir_locals लेकिन यह केवल गुणों के लिए काम करता है हुक नहीं। मैं विशिष्ट मोड (यानी पायथन-मोड) में हुक का उपयोग नहीं कर सकता क्योंकि लगभग सभी परियोजनाएं पाइथन में लिखी जाती हैं। ईमानदार होने के लिए मैंने elisp सशर्त सहेजने की कोशिश की लेकिन असफल रहा।

उत्तर

2

एक बहुत ही आसान समाधान केवल कॉन्फ़िगरेशन चर जोड़ने के लिए है जिसे हुक को अक्षम करने के लिए उपयोग किया जा सकता है। उदाहरण के लिए:

(defvar tweak-tabs t) 
(add-hook 'find-file-hook 
      (lambda() (when tweak-tabs (untabify (point-min) (point-max))))) 
(add-hook 'before-save-hook 
      (lambda() (when tweak-tabs (tabify (point-min) (point-max))))) 

अब आप एक .dir-locals.el फ़ाइल प्रासंगिक निर्देशिकाओं में nil करने के लिए tweak-tabs की स्थापना, वहाँ इस सुविधा को अक्षम जोड़ सकते हैं।

करने के लिए, (लेकिन एक और समस्या यह है कि यह एक बहुत बुरा रास्ता टैब से निपटने के लिए है। उदाहरण के लिए, यदि आप एक फ़ाइल को सहेजने के बाद आप उस में टैब देखते हैं ।)

+0

धन्यवाद।। यह वास्तव में मेरे प्रश्न का उत्तर है लेकिन आपने एक अच्छा मुद्दा उठाया है। सहेजने के बाद मेरे पास सभी बफर पर टैब होंगे। मैंने कुछ जांच की क्योंकि मैंने सोचा-बफर या मारने के लिए कार्यों को हुक करने के लिए सोचा था लेकिन दुर्भाग्यवश वे फ़ाइल पहले से ही सहेजी जाने के बाद चल रहे हैं। यदि वास्तव में यह जांचना संभव हो सकता है कि बफर पर 'सेव' को किसने बुलाया है और केवल तभी काम करता है जब यह हत्या-बफर या मार-इमैक था। क्या आपके पास ऐसे मामले में कोई अन्य सुझाव या अनुभव है? –

+0

मैं शायद 'लिखने-फ़ाइल-फ़ंक्शंस' से शुरू करूंगा, और शायद इसे बफर की एक प्रति बनाउंगा, उसे सत्यापित करें, सहेजें, और 't' वापस करें। यह भी देखें [यह पृष्ठ] (http://www.emacswiki.org/emacs/UntabifyUponSave), हालांकि वे ऐसा नहीं करते हैं क्योंकि वे बफर को * अन * टैबिफाइड रखना चाहते हैं। –

0

बस रिकार्ड के लिए शीर्षक में शाब्दिक प्रश्न का उत्तर दें (जैसा कि मैं एक वेब खोज के माध्यम से इस प्रश्न पर पहुंचा): फ़ाइल स्थान पर निर्भर एक हुक जोड़ने का एक तरीका यह है कि इसे buffer-file-name के लिए जांचें। (this answer से आइडिया।)

उदाहरण के लिए, एक ही समस्या के लिए (केवल एक विशेष निर्देशिका में टैब चालू करें, और टैब को कहीं और बंद कर दें), मैं वर्तमान में कुछ ऐसा कर रहा हूं (पैकेज smart-tabs-mode स्थापित करने के बाद M-x package-install के साथ):

(smart-tabs-insinuate 'python) ; This screws up all Python files (inserts tabs) 
(add-hook 'python-mode-hook ; So we need to un-screw most of them 
      (lambda() 
      (unless (and (stringp buffer-file-name) 
         (string-match "specialproject" buffer-file-name)) 
       (setq smart-tabs-mode nil))) 
      t)     ; Add this hook to end of the list 

(यह smart-tabs-insinuate रूप में खुद को python-mode-hook को संशोधित करता है और फिर हम इसे वापस संशोधित कर रहे हैं, थोड़ा उलटा है, लेकिन यह एक उदाहरण के रूप में क्या करना चाहिए)