बिंदु पर फ़ाइल का पूर्वावलोकन करने के लिए "त्वरित-दृश्य" कुंजी


19

मैं एक ऐसा फंक्शन बनाना चाहूंगा जो किसी फाइल का "क्विक व्यू" हो, बिंदुवार है।

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

क्या Emacs में यह कार्यक्षमता बनाने का कोई तरीका है? यह संभव है अगर मैं फंक्शन को कीपर / डिप्रेस से बाँध सकता हूँ।


1
आप अवसाद की घटनाओं को दबाने के लिए बाध्य नहीं कर सकते हैं, लेकिन यह कार्यक्षमता निश्चित रूप से एक कस्टम मानचित्र और एक टाइमर के उपयोग के साथ हैक की जा सकती है।
जॉर्डन बियोनडो सेप

क्या आप पूर्वावलोकन के साथ पॉपिंग करने वाली एक नई विंडो के बारे में बात कर रहे हैं? या कुंजी दबाए जाने के दौरान बफ़र की सामग्री को वायर्ड विंडो में प्रदर्शित किया जाएगा?
nispio

1
क्या हमें घटनाओं को बांधने की अनुमति देने के प्रयास हैं? मुझे यह सुविधा चाहिए।
wdkrnls

जवाबों:


9

यहाँ टाइमर का लाभ उठाकर महत्वपूर्ण डाउन / अप इवेंट बाइंडिंग का अनुकरण करने के लिए मेरा सुपर हैकी तरीका है।

कुल मिलाकर मैं सिग्मा के जवाब से जाने का सुझाव दूंगा, लेकिन आपने जाने के लिए पूर्वावलोकन बंद करने का तरीका पूछा ताकि मैं कोशिश करने के लिए बाध्य हो जाऊं।

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

तो आपके उपयोग के मामले के लिए आपका "कीडाउन" फ़ंक्शन फ़ाइल की सामग्री के साथ एक पूर्वावलोकन बफ़र को खोल देगा और उस पूर्वावलोकन बफ़र में उसी कुंजी कॉम्बो को कमांड की तरह कुछ noop पर बाँध दें। आप "कीडाउन" फ़ंक्शन एक निष्क्रिय टाइमर भी शुरू करेंगे जो आपके पूर्वावलोकन बफर को हटा देगा और आपको वापस वहीं बहाल करेगा जहां आप थे।

लंबी कहानी यहाँ कोड है:

बाइंड एक महत्वपूर्ण कॉम्बो (मैं प्रयोग किया जाता करने के लिए इस समारोह C-M-v), जब आप इसे एक फ़ाइल नाम यह एक नया बफर बिंदु पर फ़ाइल की सामग्री को प्रदर्शित करने खुलेगी को दबाएं, जब आप आप चलते हैं मूल करने के लिए वापस कर दिया जाएगा बफ़र।

(setq lexical-binding t)

(defun quick-view-file-at-point ()
  "Preview the file at point then jump back after some idle time.

In order for this to work you need to bind this function to a key combo, 
you cannot call it from the minibuffer and let it work.

The reason it works is that by holding the key combo down, you inhibit
idle timers from running so as long as you hold the key combo, the 
buffer preview will still display."
  (interactive)
  (let* ((buffer (current-buffer))
         (file (thing-at-point 'filename t))
         (file-buffer-name (format "*preview of %s*" file)))
    (if (and file (file-exists-p file))
        (let ((contents))
          (if (get-buffer file)
              (setq contents (save-excursion
                               (with-current-buffer (get-buffer file)
                                 (font-lock-fontify-buffer)
                                 (buffer-substring (point-min) (point-max)))))
            (let ((new-buffer (find-file-noselect file)))
              (with-current-buffer new-buffer
                (font-lock-mode t)
                (font-lock-fontify-buffer)
                (setq contents (buffer-substring (point-min) (point-max))))
              (kill-buffer new-buffer)))
          (switch-to-buffer (get-buffer-create file-buffer-name))
          (setq-local header-line-format "%60b")
          (delete-region (point-min) (point-max))
          (save-excursion (insert contents))
          (local-set-key (kbd "C-M-v") (lambda () (interactive) (sit-for .2)))
          (run-with-idle-timer
           .7 
           nil
           (lambda ()
             (switch-to-buffer buffer)
             (kill-buffer file-buffer-name))))
      (message "no file to preview at point!"))))

यहाँ भी कार्रवाई में इसका एक gif है, जो मैं करता हूं:

  • मेरे कर्सर को फ़ाइल पर रखें
  • मेरी कीबाइंडिंग को दबाकर रखें
  • पूर्वावलोकन प्रदर्शित किया गया है
  • जब मैं जाने देता हूं, तो पूर्वावलोकन मारा जाता है और आप जहां थे वहीं वापस आ जाते हैं।

यहाँ छवि विवरण दर्ज करें

ध्यान देने के लिए एक महत्वपूर्ण बात यह है कि निष्क्रिय टाइमर की सेकंड्स, मेरे कोड में मैंने उपयोग किया है .7लेकिन यह एक मैजिक नंबर की तरह है, आप इसे वास्तव में छोटा रखना चाहते हैं, लेकिन यदि आप दो बार चमकता हुआ पूर्वावलोकन देखते हैं तो इसे हर बार 1/10 सेकंड बढ़ाने की कोशिश करें जब तक आपकी मशीन के लिए सही जगह नहीं मिल जाती।

* यह भी ध्यान दें कि फ़ंक्शन में मैं पूर्वावलोकन बफर के कुछ फॉन्टिफिकेशन करने की कोशिश करता हूं, लेकिन मैं इसे काम करने के लिए नहीं कर सका, यह इसे और अधिक उपयोगी बनाने में अगला कदम होगा। **


अच्छा! इस तरह की बात हमें यहां देखने की जरूरत है।
मालाबार

मैं Error running timer: (void-variable buffer)इस के साथ मिलता है , ऐसा लगता है कि buffervar अंदर उपलब्ध नहीं है run-with-idle-timer?
ली एच।

सुनिश्चित करें कि लेक्सिकल-बाइंडिंग टी है
जोर्डन बायोनडो

आप इस उत्तर को वहाँ पर दोहराना चाह सकते हैं ।
मलाबारबा

8

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

इसके बजाय एक कुंजी को दोहराने के बारे में क्या ? निम्नलिखित की तरह कुछ एक कार्यात्मक समकक्ष का मूल कंकाल हो सकता है:

(defun my-dired-view-file ()
  (interactive)
  (dired-view-file)
  (local-set-key (kbd "<f5>") 'View-quit))

(define-key dired-mode-map (kbd "<f5>") 'my-dired-view-file)

वैसे भी, मैं इस बिंदु पर आपके प्रश्न का उत्तर देने की तुलना में आपके उपयोग-मामले को अधिक चुनौती दे रहा हूं, क्योंकि इसका कीपर / डिप्रेशन बाइंडिंग से कोई लेना-देना नहीं है :)


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

आप जो सुझाव देते हैं वह आधी रात के कमांडर (एफ 3) में कार्यक्षमता के साथ तुलनीय है
एरिक ब्राउन

1
@ सिग्मा द्वारा प्रस्तुत जवाब दिलचस्प है। लेकिन जब डाइरेक्ट का उपयोग करके डायरेक्टरी ब्राउज़ करते हैं, तो आप पहले से ही फाइल को देखने के लिए v दबा सकते हैं, और उस फाइल को देखने के बाद, q को छोड़ने के लिए और डायरेक्टरी पर लौटने के लिए q दबाएं। मुझे लगता है, देखने और छोड़ने के लिए एक ही कुंजी दबाने से आसान है।
नौसकमी _

@LeMeteore मुझे याद दिलाने के लिए धन्यवाद dired-view-file! मैंने इसका लाभ उठाने के लिए अपना कोड संपादित किया है। हां, मुझे लगता है कि इस तरह के परिदृश्य में, एक अलग कुंजी में स्थानांतरित नहीं होना महत्वपूर्ण है।
सिग्मा

4

फ़ाइल को दिखाने के बजाय जब एक कुंजी दबाया जाता है, जिसे लागू करना बहुत मुश्किल होगा, तो मैं सुझाव देता हूं कि अगली कुंजी दबाए जाने तक फ़ाइल दिखाएं।

(defun dired-find-file-until-key ()
  (interactive)
  (let ((filename (dired-file-name-at-point))
    (buffer-count (length (buffer-list))))
    (dired-find-file)
    (message "Showing %s temporarily..." filename)
    (isearch-unread-key-sequence (list (read-event)))
    (if (= (length (buffer-list)) buffer-count)
    (bury-buffer)
      (kill-buffer))))

यहां एक संस्करण है जो फ़ाइल को किसी अन्य विंडो में दिखाता है, जो मुझे लगता है कि एक अधिक सुविधाजनक उपयोगकर्ता इंटरफ़ेस है।

(defun dired-find-file-other-window-until-key ()
  (interactive)
  (let ((buffer-count (length (buffer-list))))
    (dired-find-file-other-window)
    (isearch-unread-key-sequence (list (read-event)))
    (if (= (length (buffer-list)) buffer-count)
    (delete-window)
      (kill-buffer-and-window))))

आप बफर में स्क्रॉल करने में सक्षम नहीं होंगे। यह "क्विक व्यू" मोड को लागू करने के लिए अधिक समझदार हो सकता है, जहां स्क्रॉलिंग कमांड स्वीकार किए जाते हैं, लेकिन अन्य इनपुट इवेंट्स क्विक व्यू मोड से बाहर निकलने का कारण बनते हैं और पिछले मोड के अनुसार व्याख्या की जाती हैं, जैसे कि आइसरॉक।

के साथ v( dired-view-file), आपको कुछ मध्यवर्ती मिलता है: बफर दृश्य मोड में संपादित किया जाता है , जहां आप चारों ओर स्क्रॉल कर सकते हैं, खोज कर सकते हैं, लेकिन बफर को बंद करना सरल कीस्ट्रोक है q


2

एक अन्य संभावना है, यदि आप माउस का उपयोग करते हैं, तो आप टूलटिप में मनचाहा पूर्वावलोकन डाल सकते हैं । फिर, जब आप माउस को फ़ाइल नाम (संपत्ति के साथ help-echo) पर स्थानांतरित करते हैं, तो पूर्वावलोकन पॉप अप होगा।

मैं इस तकनीक का उपयोग Dired + में करता हूं , उदाहरण के लिए, (वैकल्पिक रूप से) छवि फ़ाइलों के साथ जुड़ी छवियों के पूर्वावलोकन दिखाते हैं, जब आप फ़ाइल नामों को माउसओवर करते हैं।

आप लोडिंग के बाद ऐसा करके इसका प्रभाव देख सकते हैं dired+.el:

  • सुनिश्चित करें कि tooltip-modeचालू है (tooltip-mode 1):।

  • सुनिश्चित करें कि विकल्प diredp-image-preview-in-tooltipमें एक गैर- nilमूल्य है (या तो थंबनेल आकार या fullपूर्ण आकार की छवि के लिए)।

  • Dired में एक छवि-फ़ाइल नाम पर माउस पॉइंटर रखें।

आप diredp-mouseover-helpजो चाहते हैं उसे करने के लिए प्रेरणा के रूप में फ़ंक्शन के कोड का उपयोग कर सकते हैं (माउसओवर पर अपना "त्वरित दृश्य" प्रदर्शित करें)। इसका उपयोग करने के लिए उस फ़ंक्शन के कॉल देखें। यहाँ एक ऐसी कॉल है:

 (add-text-properties (line-beginning-position) (line-end-position)
                      '(mouse-face highlight help-echo diredp-mouseover-help))

आपने मुझे खो दिया "यदि आप एक माउस का उपयोग करते हैं।" ;-) यह मेरे लिए काम नहीं कर रहा है। image-diredठीक काम करता है, लेकिन जब मैं माउस खत्म करता हूं, तो सभी देखते हैंmouse-1: visit this file/dir in another window
nispio

आप यह नहीं देखेंगे कि मैंने क्या कहा अगर आप लोड नहीं करते हैं dired+.elऔर मेरे द्वारा दिए गए अन्य निर्देशों का पालन करते हैं। यह एक वेनिला Emacs सुविधा नहीं है। मैं यह वर्णन करने की कोशिश कर रहा था कि आप जो चाहते हैं, उसे करने के लिए अपने स्वयं के कोड को रोल करने के बारे में कैसे जा सकते हैं। dired+.elकोड बहुत करीब, मुझे लगता है, आप क्या कहते हैं आप चाहते हैं के लिए है। लेकिन हां, माउसओवर टूलटिप्स के लिए आवश्यक है कि आप माउस का उपयोग करें। यदि आप नहीं करते हैं, तो टूलटिप का उपयोग करने का सुझाव ज्यादा मदद नहीं करेगा। ;-)
ड्रू

मैं समझता हूं कि पैकेजों को कैसे लोड करना है और निर्देशों का पालन करना है, लेकिन यह मेरे लिए काम नहीं कर रहा है। मुझे यकीन नहीं है कि चैट में इस बातचीत को फिर से कैसे शुरू किया जाए, लेकिन शायद हमें ऐसा करना चाहिए।
nispio


1

एक बिंदीदार बफ़र से, vकेवल-व्यू मोड में एक फ़ाइल का दौरा करेगा, और qव्यू मोड को छोड़ देगा और आपको डेयर किए गए बफ़र पर वापस ले जाएगा। यह एक फ़ाइल का पूर्वावलोकन करने का एक त्वरित तरीका है, और यह स्क्रॉल करने और यहां तक ​​कि बफर को खोजने की संभावना देता है।

मुझे नहीं लगता कि एमएसीएस में किसी भी निम्न-स्तरीय कीपर संदेशों को पास करने की क्षमता है जो इसे ऑपरेटिंग सिस्टम से प्राप्त होता है। यह आंशिक रूप से ऐतिहासिक कारणों से हो सकता है। उस समय हैकर्स के लिए उपलब्ध टर्मिनलों ("प्रोग्रामर" पढ़ें) को 1970 के दशक -1980 के दशक में वापस विकसित किया जा रहा था, यह वास्तविक समय की अप / डाउन घटनाओं के साथ काम नहीं करता था, बल्कि पात्रों और भागने के दृश्यों का एक सरल इनपुट था। इस दिन तक एमएसीएस अभी भी केवल साधारण एएससीआईआई पात्रों और एस्केप सीक्वेंस का उपयोग करके एक साधारण टर्मिनल या एसएसएच सत्र के संगमों में प्रभावशाली ढंग से संचालित कर सकते हैं।

यह कहना नहीं है कि मेन्यू, मल्टीपल फ्रेम मैनेजमेंट, और माउस इंटरेक्शन जैसे फीचर्स को शामिल करने के लिए कार्यक्षमता पिछले कुछ वर्षों में नहीं बढ़ी है। कोई कारण नहीं है (कि मुझे पता है) कि एक्सटेंशन में निम्न स्तर के प्रमुख संदेश उपलब्ध कराने के लिए emacs को (इसके मूल में) बदला नहीं जा सकता है, लेकिन मैं आपकी सांस नहीं रोक पाऊंगा।

( डिस्क्लेमर: इस पोस्ट को कठोर तथ्य के बजाय राय और अटकल के रूप में लिया जाना चाहिए।)


1

मैंने अपना समाधान इस SO प्रश्न में दिया था /programming/26409768/how-to-show-buffer-content-in-real-time-in-other-window-when-focus-is-in-in बफर

और मेरा उत्तर नेविगेशन कुंजियों के व्यवहार को बदलने nऔर pफ़ाइल को किसी अन्य विंडो में इंगित करने के लिए है। ध्यान केंद्रित बफ़र में रहता है और जब हम ब्राउज़िंग करते हैं तो हम विज़िट किए गए बफ़र को मार देते हैं।

मैंने इस सुविधा को आसानी से सक्षम / निष्क्रिय करने के लिए एक मामूली-मोड बनाया। ध्यान दें कि हमारे पास अभी भी «सामान्य» नेविगेशन के लिए तीर कुंजी है। कॉल करें M-x dired-show-mode(या ranger-modeचूंकि यह एक ऐसा फीचर है जिसे मैंने रेंजर फाइल मैनेजर में खोजा है )।

कोड: (किसी भी समीक्षा और बग रिपोर्ट की सराहना की!) Https://gitlab.com/emacs-stuff/my-elisp/blob/master/dired-show.el

(defgroup dired-show nil
  "See the file at point when browsing in a Dired buffer."
  :group 'dired
  )

(setq show-next-current-buffer nil)

(defun show-next ()
     (interactive)
     (next-line 1)
     (dired-find-file-other-window)
     (if show-next-current-buffer (kill-buffer show-next-current-buffer))
     (setq show-next-current-buffer (current-buffer))
     (other-window 1)
     )

(defun show-previous ()
     (interactive)
     (previous-line 1)
     (dired-find-file-other-window)
     (if show-next-current-buffer (kill-buffer show-next-current-buffer))
     (setq show-next-current-buffer (current-buffer))
     (other-window 1)
     )


(define-minor-mode dired-show-mode
  "Toggle preview of files when browsing in a Dired buffer."
  :global t
  :group 'dired-show
  (if dired-show-mode
      (progn
        (define-key dired-mode-map "n" 'show-next)
        (define-key dired-mode-map "p" 'show-previous)
        )
  (define-key dired-mode-map "n" 'diredp-next-line)
  (define-key dired-mode-map "p" 'diredp-previous-line)
  ))

(defalias 'ranger-mode 'dired-show-mode)

(provide 'dired-show)
;;; dired-show ends here

0

आपको इवेंट कतार को किसी भिन्न ईवेंट, या कोई भी नहीं, तक पढ़ने की आवश्यकता होगी। सीपीयू लोड ध्यान देने योग्य है, हालांकि काफी कम है।

(defun dired-preview-command ()
  (interactive)
  (let* ((file (or (dired-get-filename nil t)
                   (error "No file here")))
         (visited-p (get-file-buffer file))
         (buffer (or visited-p (find-file-noselect file)))
         (window
          (display-buffer buffer '(nil . ((inhibit-same-window . t)))))
         (event (read-event)))
    (while (and event (eq last-command-event event))
      (setq event (read-event nil nil 0.1)))
    (when event
      (setq unread-command-events
            (list event)))
    (quit-window (not visited-p) window)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.