emacs मिनी बफर में वर्तमान फ़ाइल के पूर्ण पथ को दिखाने के लिए फ़ंक्शन




elisp clipboard (9)

मुझे उस फ़ाइल का पूरा पथ प्राप्त करने की आवश्यकता है जिसे मैं emacs के साथ संपादित कर रहा हूं।

  • क्या इसके लिए कोई काम है?
  • यदि नहीं, तो उसे पाने के लिए elisp समारोह क्या होगा?
  • मैं परिणाम (पथ नाम) को क्लिपबोर्ड पर कैसे कॉपी कर सकता हूं ताकि मैं इसका पुन: उपयोग कर सकूं?

मैं मैक ओएस एक्स और अकामाक्स का उपयोग कर रहा हूं।

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

जोड़ा

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name))
  (kill-new (file-truename buffer-file-name))
)
(global-set-key "\C-cz" 'show-file-name)

मुझे मिले दो उत्तरों का मिश्रण, मैं जो चाहता हूं उसे प्राप्त कर सकता था। उत्तर के लिए धन्यवाद। और कुछ और सवाल।

  • के लिए क्या है (फ़ाइल-truename)?
  • क्या मैं पथ नाम को सिस्टम (ओएस) के क्लिपबोर्ड पर कॉपी कर सकता हूं, न कि हत्या की अंगूठी, ताकि मैं अन्य ऐप्स के साथ जानकारी का उपयोग कर सकूं?

अतिरिक्त समारोह की आवश्यकता नहीं है, बस

M-! pwd

[0] से copy-buffer-file-name-as-kill ठीक है जो आपको चाहिए। इसमें केवल निर्देशिका नाम, या सिर्फ फ़ाइल नाम कॉपी करने का विकल्प होता है।

[0] http://www.emacswiki.org/emacs/download/buffer-extension.el


Cx Cd , Mx list-directory माध्यम से भी कॉल करने योग्य, आपको अपनी वर्तमान फ़ाइल के लिए निर्देशिका दिखाएगा, और आपको मिनीबफर को साफ़ करने के लिए केवल "एंटर" कुंजी को हिट करने की आवश्यकता होगी। अतिरिक्त विवरण यहां उपलब्ध here


क्या मैं पथ नाम को सिस्टम (ओएस) के क्लिपबोर्ड पर कॉपी कर सकता हूं, न कि हत्या की अंगूठी, ताकि मैं अन्य ऐप्स के साथ जानकारी का उपयोग कर सकूं?

यदि आप xclip (Linux), pbcopy (Mac), putclip (Cygwin) जैसे किसी चीज़ को खोल सकते हैं।

मैं व्यक्तिगत रूप से प्रतिलिपि और पेस्ट के लिए रैपर स्क्रिप्ट c और p उपयोग करता हूं, मानक इनपुट से पहला पठन, बाद में मानक आउटपुट के लिए लेखन। इस तरह, यह मेरे सभी विकास प्लेटफॉर्म पर काम करता है:

(shell-command (format "echo '%s' | c" buffer-file-name))

मुझे Emacs क्लिपबोर्ड समर्थन का उपयोग करने से अधिक विश्वसनीय और कॉन्फ़िगर करने योग्य लगता है। उदाहरण के लिए, मेरा c कमांड लिनक्स (प्राथमिक, माध्यमिक, क्लिपबोर्ड) पर सभी 3 क्लिपबोर्ड पर इनपुट की प्रतिलिपि बनाता है, इसलिए मैं या तो Ctrl-V या मध्यम क्लिक के साथ पेस्ट कर सकता हूं।


मेरी चाल एक Cx Cf को एक फाइल खोलने की तरह है, यह मौजूदा फाइल पथ के साथ मिनीबफ को प्रीफिल करेगा, Cg छोड़ने के लिए। M-: buffer-file-name से M-: buffer-file-name लेकिन किसी भी अन्य तरीकों से कहीं ज्यादा उग्र है।


आप जो चाहते हैं उसका प्रत्यक्ष कार्यान्वयन है:

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

उस ने कहा, मुझे मिनीबफर में क्या है, इसका पूरा मार्ग प्राप्त करने में सक्षम होने के लिए यह अविश्वसनीय रूप से उपयोगी लगता है, और यही वह है जो मैं उपयोग करता हूं:

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

और फिर अगर मैं इसे क्लिपबोर्ड में चाहता हूं, तो मैं बस लाइन ( सीए सीके ) को मार डालता हूं। लेकिन हम उपरोक्त आदेश में आसानी से truename को क्लिपबोर्ड पर कॉपी कर सकते हैं, बस अंतिम पंक्ति को बदलने के लिए:

(insert (kill-new (concat file-true-dir file-name)))))

नया हिस्सा 'kill-new जो हत्या की अंगूठी में स्ट्रिंग रखता है।


जेरोम रैडिक्स के उत्तर से उधार लेने के लिए, यदि आप बस वर्तमान बफर के फ़ाइल पथ को तुरंत देखना चाहते हैं, तो आप M-: buffer-file-name कर सकते हैं।


मेरे पास लंबे समय से पहले से ही निम्नलिखित कोड उपयोग में है। जब मैं मोड-लाइन में बफर नाम पर मध्य माउस बटन दबाता हूं तो यह हत्या की अंगूठी के लिए पूर्ण फ़ाइल पथ की प्रतिलिपि बनाता है। जब मैं मोड-लाइन में बफर-नाम पर Shift-mouse-2 दबाता हूं तो यह केवल बफर नाम को मार-रिंग पर प्रतिलिपि बनाता है।

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))

Cx Cb लागू होने पर प्रत्येक बफर के लिए बफर और फ़ाइल पथ की एक सूची दिखाता है।