2012-06-27 7 views
6

मैं बाहरी अनुप्रयोगों का उपयोग करने के लिए emacs को कॉन्फ़िगर करना चाहता हूं जब मैं थके हुए मोड से छवि फ़ाइलों को खोलता हूं।emacs dired और openwith

दूसरी तरफ, मैं इमैक बफर में इनलाइन छवियों का भी उपयोग करना चाहता हूं।

बाहरी अनुप्रयोगों में फ़ाइलों को खोलने के लिए openwith.el पैकेज का उपयोग मैं http://www.emacswiki.org/emacs/OpenWith

openwith नाबालिग मोड के साथ समस्या यह है कि यह वैश्विक है और है, जब यह एक dired मोड हुक से सक्षम है

(add-hook 'dired-mode-hook 
      (lambda() 
      (setq truncate-lines t) 
      (openwith-mode t) 
      )) 

यह हर जगह कार्य करता है और emacs buffers में सभी इनलाइन छवियों को बाहरी अनुप्रयोगों में खोला जाता है।

मैं openwith.el में

:global t 

बदलने के लिए

:global nil 

करने की कोशिश की है, लेकिन यह किसी भी तरह पूरी तरह से मोड openwith अक्षम करता है।

तो, मेरा सवाल यह है कि: खुले हुए नाबालिग मोड का उपयोग करने के लिए emacs को केवल डायर बफर के साथ और कहीं और नहीं कहने के लिए कैसे कहें?

धन्यवाद।

उत्तर

0

एक तरीका है emacsclient को फ़ाइल प्रकारों के लिए पसंदीदा प्रोग्राम के रूप में सेट करने के लिए openwith-associations में openwith.el में और emacsclient का उपयोग करना शुरू कर सकता है।

आप हर बार नए emacs सत्र शुरू कर सकते हैं लेकिन यह पिछले सुझाव की तुलना में उलझन में लगता है।

4

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

इसे बहुत आसानी से हासिल नहीं किया जा सकता है, लेकिन यहां एक तरीका है।

ओपन-मोड, openwith.el की अपनी स्रोत फ़ाइल खोलें। फिर जब तक आप वास्तविक मामूली मोड की परिभाषा तक नहीं पहुंच जाते, तब तक नीचे तक स्क्रॉल करें। तब टिप्पणी बाहर प्रत्येक पंक्ति के आरंभ में एक अर्धविराम रखकर उस परिभाषा:

;;;###autoload 
; (define-minor-mode openwith-mode 
; "Automatically open files with external programs." 
; :lighter "" 
; :global t 
; (if openwith-mode 
;  (progn 
;   ;; register `openwith-file-handler' for all files 
;   (put 'openwith-file-handler 'safe-magic t) 
;   (put 'openwith-file-handler 'operations '(insert-file-contents)) 
;   (add-to-list 'file-name-handler-alist '("" . openwith-file-handler))) 
;  (setq file-name-handler-alist 
;   (delete '("" . openwith-file-handler) file-name-handler-alist)))) 

फिर इस कोड के नीचे (लेकिन (provide 'openwith) से पहले), निम्नलिखित कोड डालें:

(defvar openwith-mode nil) 

(mapc (lambda (function) 
     (ad-add-advice function 
         '(dired-openwith nil t (advice . (lambda() (let ((openwith-mode t)) ad-do-it)))) 
         'around 0)) 
     '(dired-find-alternate-file 
     dired-find-file 
     dired-find-file-other-window 
     dired-mouse-find-file-other-window 
     dired-view-file)) 

(put 'openwith-file-handler 'safe-magic t) 
(put 'openwith-file-handler 'operations '(insert-file-contents)) 
(add-to-list 'file-name-handler-alist '("" . openwith-file-handler)) 

इस कोड को करता है कुछ बातें।

सबसे पहले, यह ओपन-मोड नामक चर को परिभाषित करता है। यह चर का उपयोग ओपन-मोड के कार्यों में से एक के अंदर किया जाता है जो यह तय करता है कि बाहरी एप्लिकेशन का उपयोग करना है या नहीं। आम तौर पर, जब आप एक नाबालिग मोड को परिभाषित करते हैं तो उस तरह का एक चर स्वचालित रूप से Emacs द्वारा प्रदान किया जाता है - हालांकि हमने उपरोक्त वास्तविक मामूली मोड की परिभाषा पर अभी टिप्पणी की है, इसलिए हम स्पष्ट रूप से यहां इस चर को फिर से पेश करते हैं।

चर का उद्देश्य एक प्रकार के स्विच के रूप में काम करना है जिसके माध्यम से हम नियंत्रित कर सकते हैं कि कोई छवि फ़ाइल इनलाइन या बाहरी दर्शक को पास की जानी चाहिए या नहीं।

अगला हमारे पास (mapc ...) अभिव्यक्ति है। क्या हम यहाँ कर पाँच कार्यों की एक सूची से अधिक पुनरावृति है:

  • dired खोज-वैकल्पिक फ़ाइल
  • dired खोज-फ़ाइल
  • dired-खोजने के-फ़ाइल-अन्य-खिड़की
  • dired -mouse-खोजने के-फ़ाइल-अन्य-खिड़की
  • dired-दृश्य-फ़ाइल

जो कार्यों dired एक फ़ाइल को खोलने के लिए प्रदान करता है। इन कार्यों में से प्रत्येक के लिए हम advising नामक तकनीक में कोड की एक छोटी राशि जोड़ते हैं: (ad-add-advice...) वैरिएबल openwith-modet पर सेट करता है जब भी इन पांच कार्यों में से एक कहा जाता है। फ़ंक्शन कॉल के बाहर, चर स्थिर रहता है nil पर।

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

(एनबी: दुर्भाग्य से हम सिर्फ वर्तमान प्रमुख मोड एक स्विच के रूप में उपयोग नहीं कर सकते क्योंकि यह एक नया बफर कि पहले से ही खोलने के लिए फ़ाइल के लिए बनाया गया है जाएगा के प्रमुख मोड हो जाएगा यह हमेशा fundamental-mode है।।)

आखिरकार, आखिरी तीन पंक्तियां केवल & छोटी-छोटी परिभाषा परिभाषा से चिपक जाती हैं जिसे हमने पहले टिप्पणी की थी। वे कहते हैं कि जिस समारोह में मैं पहले से ही बहुत उल्लेख कर रहा हूं और यह बाहरी अनुप्रयोगों को कॉल करने के लिए ज़िम्मेदार है - जिसे open-with-filehandler कहा जाता है - एक तथाकथित फ़ाइल-हैंडलर है। यह वास्तव में फ़ाइल तक वास्तविक पहुंच के लिए कुछ भी विशेष नहीं करता है, इसलिए हम पर उस फ़ंक्शन के लिए safe-magic सेट कर रहे हैं। साथ ही, हम घोषणा करते हैं कि ऑपरेशन insert-file-contents हमारे फ़ंक्शन द्वारा गैर-तुच्छ तरीके से संभाला जाता है। (इन गुणों के बारे में अधिक जानकारी के लिए here देखें।)

और आखिर में, हम वास्तव में फ़ाइल हैंडलर इंस्टॉल करते हैं।


महत्वपूर्ण: openwith मोड documenation अनुशंसा करता है कि आपके .emacs फ़ाइल में निम्न दो पंक्तियों डाल:

(require 'openwith) 
(openwith-mode t) 
अब

कोई मामूली-मोड openwith-mode किसी भी अधिक (के बाद यह है कि हमने इसकी परिभाषा पर टिप्पणी की), कृपया सुनिश्चित करें कि आप दूसरी पंक्ति को हटा दें, उदाहरण के लिएभी इसे बाहर टिप्पणी करके:

;; (openwith-mode t) 

के बाद फिर से शुरू करने Emacs, यदि आप dired के साथ एक छवि फ़ाइल को खोलने के लिए, यह एक बाहरी अनुप्रयोग में खोलने चाहिए, यदि आप सी-एक्स सी-एफ के माध्यम से इसे खोलते हैं तो इसे एक बफर में रेखांकित किया जाएगा।

+0

upvoted में परिभाषित का उपयोग करें, लेकिन आप नहीं बताया तुम क्यों मोड परिभाषा बाहर टिप्पणी करने के लिए (या सीधे बिल्कुल पुस्तकालय को संशोधित की जरूरत - 'eval के बाद load' होगा उस अतिरिक्त कोड को जोड़ने के लिए एक और सामान्य दृष्टिकोण)। – phils

+0

@phils अच्छा बिंदु - मैंने केवल इसके बारे में एक छोटी टिप्पणी की है, लेकिन यह बहुत स्पष्ट नहीं था: जिस तरह से ओपनविड्थ-मोड डिज़ाइन किया गया है, यह या तो वैश्विक स्तर पर * या तो होना चाहिए: यह एक वैश्विक फ़ाइल-हैंडलर जोड़ता है और जब मोड चालू होता है, तो वह फ़ाइल-हैंडलर बाहरी अनुप्रयोगों के लिए जांच करता है, अगर यह बंद है, तो यह कुछ भी नहीं करता है। – Thomas

+0

लेकिन क्या आप 'eval-after-load' को लपेटने के लिए 'eval-after-load'' (fmakunbound 'openwith-mode)' और अपने शेष कोड का उपयोग करके एक ही परिणाम प्राप्त नहीं करेंगे, और वास्तव में मूल लाइब्रेरी को स्पर्श नहीं करेंगे? – phils