इमैक सोर्स कोड को मदद से ब्राउज़ करते समय व्यू-ओनली मोड कैसे दर्ज करें?


10

जब मैं एमएसीएस को कार्यों के लिए ब्राउज़ करता C-h fहूं, तो मैं अक्सर एलिस्प / सी कार्यान्वयन में झांकना चाहता हूं। view-modeअनावश्यक संशोधन से बचने के लिए जब मैं स्रोत कोड का उपयोग करता हूं तो मैं स्वचालित रूप से प्रवेश करना चाहता हूं । क्या कोई हुक या कार्य है जो मैं इसे पूरा करने के लिए सलाह दे सकता हूं?


2
यहाँ मैं अपनी किसी भी फाइल के आकस्मिक संशोधन को रोकने के लिए उपयोग करता हूं, जो मैं खोलता emacs-lisp-modeहूं और C-x C-qअगर मैं स्रोत कोड को संपादित करना चाहता हूं तो मैं बस करता हूं। (defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
कानून

जवाबों:


2

अद्यतन (रात की नींद के बाद): इस उत्तर में एक प्रमुख दोष है: यह सक्षम करता है view-modeजब किसी भी कार्य के लिए नेविगेट करना , न कि केवल एमएसीएस स्रोत। यह तय किया जा सकता है, लेकिन आप @ जवाब से उत्तर का उपयोग करके बेहतर हैं ।

ऐसा करने से C-h f describe-function RETऔर फिर describe-functionमैंने स्रोत कोड पढ़कर पाया कि यह फ़ंक्शन परिभाषाओं के लिंक के लिए एक विशेष प्रकार का "बटन" बनाता है help-function-def:।

zrgrepइस तार के साथ दौड़ना (" help-function-def") ने मुझे इशारा किया help-mode.el.gz

इस सब के बाद हम अपने आस-पास इस प्रकार के बटन को बदल सकते हैं (कोड में टिप्पणी पर ध्यान दें):

(define-button-type 'help-function-def
  :supertype 'help-xref
  'help-function (lambda (fun file)
               (require 'find-func)
               (when (eq file 'C-source)
                 (setq file
                       (help-C-file-name (indirect-function fun) 'fun)))
               ;; Don't use find-function-noselect because it follows
               ;; aliases (which fails for built-in functions).
               (let ((location
                      (find-function-search-for-symbol fun nil file)))
                 (pop-to-buffer (car location))
                 (if (cdr location)
                     (goto-char (cdr location))
                   (message "Unable to find location in file")))
                   (view-mode t)) ; <= new line: enable view-mode
  'help-echo (purecopy "mouse-2, RET: find function's definition"))

जहाँ तक मैं बता सकता हूँ कि सलाह देने का कोई कार्य नहीं है: Emacs lambdaयहाँ उपयोग करता है। दूसरी ओर (जैसा कि @rationalrevolt द्वारा बताया गया है ) एक बटन प्रकार की help-functionसंपत्ति को बदल सकता है help-function-def:

(require 'help-mode)
(let ((help-func (button-type-get 'help-function-def 'help-function)))
  (button-type-put 'help-function-def 'help-function
                   `(lambda (func file)
                      (funcall ,help-func func file) (view-mode t))))

1
मुझे लगता है कि मैं लैम्ब्डा को अपने स्वयं के साथ प्रयोग करने button-type-getऔर button-type-putबदलने की कोशिश कर सकता हूं जो मौजूदा लैम्ब्डा के लिए आगे है।
राशनरेवोल्ट

@rationalrevolt: अच्छा विचार है! (थोड़ा नाजुक लगता है, लेकिन मुझे लगता है कि यह भी नाजुक है।)
कांस्टेंटाइन

@rationalrevolt: कृपया अद्यतन किया गया उत्तर देखें। (टिप्पणियों में नई कड़ियाँ नहीं हो सकतीं, ऐसा लगता है ...)
कांस्टेंटाइन

धन्यवाद! मैं कुछ इसी तरह की कोशिश कर रहा था, लेकिन एक नौसिखिया होने के नाते मैं गतिशील बंधन से काट रहा था और काम करने के लिए मेरा पास नहीं मिला :)
rationalrevolt

16

आप Emacs की स्रोत फ़ाइलों को केवल डिफ़ॉल्ट रूप से पढ़ने के लिए निर्देशिका-स्थानीय चर का उपयोग कर सकते हैं । (यह भी देखें C-hig (emacs) Directory Variables RET)।

.dir-locals.elनिम्नलिखित सामग्री के साथ आप जिस निर्देशिका वृक्ष की रक्षा करना चाहते हैं, उसके मूल में एक फ़ाइल बनाएँ :

((nil . ((eval . (view-mode 1)))))

संपादित करें: मिचेल पोलित्स्की टिप्पणियों में बताते हैं कि view-modeइस तरह से सक्षम करना समस्याग्रस्त है, क्योंकि जब आप qइसके साथ बफर को खारिज करते हैं, तो यह भी मोड को निष्क्रिय कर देता है, जिसका अर्थ है कि अगली बार जब आप उस बफर view-modeको सक्षम नहीं करेंगे।

संपादित 2: कॉन्स्टेंटाइन ने नीचे दी गई टिप्पणियों में उस समस्या का समाधान प्रदान किया है:

((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))

यह उपयोगी रूप से यह सुनिश्चित करने के लिए एक परीक्षण जोड़ता है कि बफर पहले से ही एक फ़ाइल का दौरा कर रहा है, लेकिन महत्वपूर्ण परिवर्तन view-mode-enterइसके बजाय का उपयोग है view-mode, क्योंकि पूर्व एक EXIT-ACTIONतर्क लेता है जो निर्धारित करता है कि qटाइप करने के लिए क्या करना है। इस मामले में बाहर निकलने की कार्रवाई बफर को मारने के लिए है, यह सुनिश्चित करते हुए कि अगली बार जब फ़ाइल का दौरा किया जाता है तो यह फिर से समाप्त हो जाएगा view-mode

संपादित करें 3: उस रास्ते का अनुसरण करते हुए, हम यह भी देख सकते हैं कि निर्दिष्ट EXIT-ACTIONअंत में view-mode-exitफ़ंक्शन को पारित कर दिया गया है, और इसका डॉकस्ट्रिंग हमें एक वैकल्पिक विकल्प प्रदान करता है:

view-no-disable-on-exit is a variable defined in `view.el'.
Its value is nil

Documentation:
If non-nil, View mode "exit" commands don't actually disable View mode.
Instead, these commands just switch buffers or windows.
This is set in certain buffers by specialized features such as help commands
that use View mode automatically.

इसलिए हम निम्नलिखित का उपयोग कर सकते हैं:

((nil . ((eval . (when buffer-file-name
                   (setq-local view-no-disable-on-exit t)
                   (view-mode-enter))))))

मैं वैकल्पिक दृष्टिकोण का उपयोग करता हूं जिसे आप अपनी इनिट फ़ाइल में पूरी तरह से निर्दिष्ट कर सकते हैं (जैसा कि .dir-locals.elफ़ाइल बनाने के विपरीत ), और मैं केवल फ़ाइलों का उपयोग करने के बजाय केवल पढ़ने के लिए करता हूं view-mode। मेरा विन्यास इस तरह दिखता है:

;; Emacs
(dir-locals-set-class-variables
 'emacs
 '((nil . ((buffer-read-only . t)
           (show-trailing-whitespace . nil)
           (tab-width . 8)
           (eval . (whitespace-mode -1))))))

(dir-locals-set-directory-class "/usr/local/src/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/local/share/emacs" 'emacs)
(dir-locals-set-directory-class "/usr/share/emacs" 'emacs)

जाहिर है आप अपने elpa निर्देशिका के लिए एक ही काम कर सकते हैं, और किसी भी अन्य निर्देशिका जिसमें तृतीय-पक्ष स्रोत कोड होता है।


महान! यह स्पष्ट रूप से बेहतर है कि मैं क्या लेकर आया था। (मैं किस बारे में सोच रहा था? मैं अपने बारे में जानता .dir-locals.elहूं और खुद का इस्तेमाल करता हूं ...)
कॉन्स्टेंटाइन

मैं एक find-file-hookऔर एक read-only-dirsसूची के आधार पर समान पंक्तियों के साथ कुछ रहा हूं, लेकिन मुझे यह दृष्टिकोण पसंद है।
ग्लूकोज

यह बहुत साफ दृष्टिकोण की तरह दिखता है। हालांकि मुझे एक छोटी सी समस्या है। साथ ((nil . ((eval . (view-mode 1)))))क्या सबसे आसान तरीका है बनाने के लिए है View-quitबफ़र्स मदद के माध्यम से सुलभ मारने? अन्यथा दबाने से स्रोत दृश्य से बाहर निकलने के बाद q, बफर पीछे रहता है और जब बाद में उसी फ़ाइल से स्रोतों को फिर से मदद से देखने-मोड शुरू नहीं किया जाता है।
मिशाल पोलित्स्की

मिशेल Politowski: सही आप कर रहे हैं। मैंने उस तथ्य को शामिल करने के लिए उत्तर को अपडेट कर दिया है, लेकिन मेरे पास वर्कअराउंड नहीं है। कॉन्स्टेंटाइन का (संपादित) उत्तर उपयोग करने के लिए सबसे अच्छा समाधान हो सकता है view-mode
फिल्स

1
आज मुझे पता चला कि मुझे @ MichałPolitowski --- द्वारा इंगित किए गए मुद्दे के लिए वर्कअराउंड की आवश्यकता है --- और मैंने पाया कि एक: उपयोग ((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))( (view-mode-enter ...)इसके बजाय नोट (view-mode 1))। इस तरह से दबाने qपर बफर की मौत हो जाती है और अगली बार जब मैं उसी फाइल पर जाता हूं तो सक्षम हो view-mode जाता है
कांस्टेंटाइन

0

मुझे लगता है कि आपको हुक जोड़ने की ज़रूरत है :

(add-hook 'find-function-after-hook 'view-mode)

यह मेरी संकीर्णता से बेहतर है, लेकिन फिर भी यह वास्तव में सवाल से मेल नहीं खाता है: यह केवल एमएसीएस स्रोतों से नहीं, बल्कि किसी भी फ़ंक्शन का उपयोग करते view-modeसमय नेविगेट करता है। C-h f
कॉन्सटेंटाइन

प्रयोगात्मक रूप से, सहायता लिंक वास्तव में इस हुक को नहीं चलाते हैं। ऐसा लगता है कि केवल इंटरएक्टिव find-THINGकमांड इस हुक का उपयोग करते हैं, और सहायता बटन इसे बायपास करते हैं।
फिल्स

0

यह आपके विशिष्ट मामले को संबोधित नहीं करता है, लेकिन view-modeजब भी आप किसी मदद बफर से स्रोत फ़ाइल पर जाते हैं तो स्विच करने का अधिक सामान्य मामला है । मैं इसे @ कॉन्स्टेंटाइन के उत्तर के विकल्प के रूप में पेश कर रहा हूं, क्योंकि यह टिप्पणी के रूप में पढ़ने योग्य नहीं था।

मुझे लगता है कि मैं मूल रूप से इस EmacsWiki से मिला है ।

(defadvice find-function-search-for-symbol (after view-function-source last (symbol type library) activate)
  "When visiting function source via Help, switch to view-mode"
  (with-current-buffer (car ad-return-value)
    (view-mode 1)))

(defadvice find-variable-noselect (after view-var-source last (variable &optional file) activate)
  "When visiting variable source via Help, switch to view-mode"
  (with-current-buffer (car ad-return-value)
    (view-mode 1)))

0

यहाँ एक समाधान है जो बिल्ट-इन डॉक्यूमेंटेशन के लिए काम करता है और एक उदाहरण है जो यह बताता है कि इसे ELPA तक कैसे बढ़ाया जाए। यह कुछ रेगेक्स के खिलाफ वर्तमान फ़ाइल के लिए पथ से read-only-modeमेल खाता है और उनमें से किसी से मेल खाने पर आवेदन करता है ।

ध्यान दें कि बफ़र केवल पढ़ने के लिए है, यदि आप इसे diredसहायता के माध्यम से नहीं, बल्कि उसके माध्यम से देखें।

मैंने एक हुक जोड़ा जो emacs-lisp-modeउस चेक में प्रवेश करने के बाद चलता है यदि फ़ाइल से मेल खाता है /\.el\.gz$/, और यदि ऐसा होता है तो केवल-पढ़ने के लिए मोड लागू करता है।

(defun readonly-if-el-gz ()
  (cond
   ((string-match "\\.el\\.gz\\'" (or (buffer-file-name) ""))
    (read-only-mode +1))))

(add-hook 'emacs-lisp-mode-hook 'readonly-if-el-gz)

यहाँ एक उदाहरण है जो ELPA को भी जाँचता है, उस अनुमान का उपयोग करते हुए कि कोई भी पथ .emacs.d/elpaवास्तव में ELPA कोड है।

(defun readonly-if-internal ()
  (let
      ((name (or (buffer-file-name) "")))
    (cond
     ((string-match "\\.el\\.gz\\'" name) (read-only-mode +1))
     ((string-match "\\.emacs\\.d/elpa" name) (read-only-mode +1)))))

(add-hook 'emacs-lisp-mode-hook 'readonly-if-internal)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.