जिस तरह से ओपनविड्थ-मोड काम करता है वह थोड़ा अजीब है: यह वास्तव में मानता है कि आप इसे वैश्विक रूप से या बिल्कुल नहीं उपयोग करते हैं। हालांकि, आप यहां क्या चाहते हैं, स्थानीय स्तर पर इसका उपयोग करना है, अर्थात् केवल एक थके हुए बफर के भीतर से।
इसे बहुत आसानी से हासिल नहीं किया जा सकता है, लेकिन यहां एक तरीका है।
ओपन-मोड, 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-mode
t
पर सेट करता है जब भी इन पांच कार्यों में से एक कहा जाता है। फ़ंक्शन कॉल के बाहर, चर स्थिर रहता है 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 के साथ एक छवि फ़ाइल को खोलने के लिए, यह एक बाहरी अनुप्रयोग में खोलने चाहिए, यदि आप सी-एक्स सी-एफ के माध्यम से इसे खोलते हैं तो इसे एक बफर में रेखांकित किया जाएगा।
upvoted में परिभाषित का उपयोग करें, लेकिन आप नहीं बताया तुम क्यों मोड परिभाषा बाहर टिप्पणी करने के लिए (या सीधे बिल्कुल पुस्तकालय को संशोधित की जरूरत - 'eval के बाद load' होगा उस अतिरिक्त कोड को जोड़ने के लिए एक और सामान्य दृष्टिकोण)। – phils
@phils अच्छा बिंदु - मैंने केवल इसके बारे में एक छोटी टिप्पणी की है, लेकिन यह बहुत स्पष्ट नहीं था: जिस तरह से ओपनविड्थ-मोड डिज़ाइन किया गया है, यह या तो वैश्विक स्तर पर * या तो होना चाहिए: यह एक वैश्विक फ़ाइल-हैंडलर जोड़ता है और जब मोड चालू होता है, तो वह फ़ाइल-हैंडलर बाहरी अनुप्रयोगों के लिए जांच करता है, अगर यह बंद है, तो यह कुछ भी नहीं करता है। – Thomas
लेकिन क्या आप 'eval-after-load' को लपेटने के लिए 'eval-after-load'' (fmakunbound 'openwith-mode)' और अपने शेष कोड का उपयोग करके एक ही परिणाम प्राप्त नहीं करेंगे, और वास्तव में मूल लाइब्रेरी को स्पर्श नहीं करेंगे? – phils