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


98

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

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

मैं Mac OS X और Aqumacs का उपयोग कर रहा हूं।

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

जोड़ा

(डिफॉन शो-फाइल-नाम)
  "मिनीबार में पूर्ण पथ फ़ाइल नाम दिखाएं।"
  (सहभागी)
  (संदेश (बफर-फ़ाइल-नाम))
  (किल-न्यू (फ़ाइल-ट्रूनाम बफर-फ़ाइल-नाम))
)
(वैश्विक-सेट-कुंजी "\ C-cz" 'शो-फ़ाइल-नाम)

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

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

जवाबों:


92

यह बिल्ट-इन फ़ंक्शन buffer-file-nameहै जो आपको आपकी फ़ाइल का पूर्ण पथ देता है।

सबसे अच्छी बात यह है कि आपकी इमैक विंडो हमेशा आपके सिस्टम-नाम और उस बफर के पूर्ण पथ को दिखाने के लिए है जिसे आप वर्तमान में संपादित कर रहे हैं:

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

आप भी कुछ ऐसा कर सकते हैं:

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

8
Emacs में 24 buffer-file-nameएक चर है
barracel

6
... लेकिन यह भी अभी भी एक समारोह
फिल्स

17
यदि यह एक फ़ंक्शन है तो यह क्यों नहीं दिखाई देता है M-x?
5

9
asmeurer - क्योंकि यह इंटरैक्टिव नहीं है
बेन फिजराल्ड़

2
@Talespin_Kit हां, बिल्कुल। Elisp एक "lisp-2" है, जो कि "lisp-1" के विपरीत है, जिसका अर्थ है कि दो स्वतंत्र नाम-स्थान (चर और कार्य) हैं। इसलिए प्रत्येक प्रतीक में "फ़ंक्शन स्लॉट" और "मान स्लॉट" होता है, और जो स्लॉट एक्सेस किया जाता है वह संदर्भ पर निर्भर करता है। व्यवहार में कई उदाहरण हैं (जैसे कोई भी मामूली मोड नाम एक फ़ंक्शन और एक चर दोनों होगा)। यह इसलिए भी है कि आपको funcallकिसी फ़ंक्शन को कॉल करने के लिए उपयोग करने की आवश्यकता होती है जो एक चर के मूल्य के रूप में संग्रहीत होता है foo, क्योंकि यदि आपने उपयोग किया है तो आप मूल्य स्लॉट (foo)के fooबजाय फ़ंक्शन स्लॉट का उपयोग करेंगे ।
फिल्स

74

Jérôme Radix के उत्तर से उधार लेने के लिए, यदि आप जल्दी से वर्तमान बफर के फ़ाइल पथ को देखना चाहते हैं, तो आप कर सकते हैं M-: buffer-file-name

वैकल्पिक रूप से, (buffer-file-name)कहीं बफर में टाइप करें और C-x C-eसमापन कोष्ठक पर चलाएं (यह किसी भी मोड में काम करेगा, न कि केवल लिस्प-मोड)।


3
धन्यवाद, मैंने सोचा था कि buffer-file-nameएक समारोह के रूप है, लेकिन यह में प्रकट नहीं होता M-xहै, लेकिन में प्रकट होता है M-:के रूप में emacs evalअपने जवाब के लिए :), वहाँ मैं कमांड चला सकते हैं, धन्यवाद
PeterZD

6
हाँ, M-xकेवल इंटरेक्टिव फ़ंक्शन चलाता है, जबकि M-:कोई भी संभावित फ़ंक्शन चलाता है।
asmeurer

41

मेरी तरकीब यह है कि किसी C-x C-fफाइल को खोलना पसंद है, यह मिनीबफ को चालू फाइल पथ के साथ प्रीफिल करता है, C-gछोड़ने के लिए। M-: buffer-file-nameकिसी भी अन्य तरीकों की तुलना में तेजी से लेकिन अब तक बदसूरत।


मैं भी यही करता हूं। यह कट्टर emacs- y के रूप में नहीं है, लेकिन अगर मुझे परवाह है कि वर्तमान फ़ाइल के लिए पथ है, तो यह काम करता है।
-runix

यदि आप एक फ़ाइल खोलते हैं, तो A कहें, और फिर किसी अन्य फ़ाइल पर जाएं, B कहें, जैसे किसी प्लगइन की कार्यक्षमता की परिभाषा के लिए कुछ जंप का उपयोग करना, यह विधि A का मार्ग दिखाती है, B का नहीं! इस प्रकार, यह उत्तर हमेशा यह नहीं बताता है कि ओपी क्या मांग रहा है।
अभिषेक आनंद

4
Cx Cv आपको न केवल वर्तमान पथ बल्कि वर्तमान फ़ाइल का नाम भी
दिखाएगा

@kuzzooroo गैर-आईडीओ-मोड उपयोगकर्ताओं के लिए सही है (नाम Cx Cf में आपके द्वारा ido-mode का उपयोग करने पर प्रदर्शित किया जाता है)।
जूलियन पालार्ड

16

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

(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))))

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

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

नया हिस्सा वह कॉल है 'kill-newजो स्ट्रिंग को रिंग में मारता है।


क्या आप इस सेटिंग का उपयोग करने के बारे में विस्तार से बता सकते हैं? और "\ Cr" का क्या अर्थ है?
modeller

कोई बात नहीं। मैं यह समझ गया। मुझे लगता है कि यह उपयोगी है जब मैं आईडी मोड में होता हूं और किसी फ़ाइल की ओर इशारा करता हूं, तो मैं उस फाइल का पूरा पथ प्राप्त करने के लिए सीआर दबाता हूं। वास्तव में उपयोगी है। हालाँकि मैं अभी भी नहीं जानता कि क्यों सी के बजाय \ C का उपयोग करें
modeller

11

अतिरिक्त समारोह के लिए कोई ज़रूरत नहीं है, बस

M-! pwd

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

3

मेरे पास निम्न कोड पहले से ही लंबे समय से उपयोग में है। जब मैं मोड-लाइन में बफर नाम पर मध्य माउस बटन दबाता हूं, तो यह मारने की अंगूठी के लिए पूर्ण फ़ाइल पथ को कॉपी करता है। जब मैं मोड-लाइन में बफर-नाम पर शिफ्ट-माउस -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)))

3

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


मेरा पसंदीदा जवाब, सरल, त्वरित और आसान!
टिकटॉक

2

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


2

C-u C-x C-b वर्तमान में फ़ाइलों पर जाने वाले बफ़र्स को सूचीबद्ध करता है।


1

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

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

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

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

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


यह काम करना चाहिए, लेकिन यह मेरे लिए नहीं है। (उबंटू 14.04.1। ) यदि शेल में टाइप किया गया है , तो दोनों , date | xclipऔर xclip fileदोनों विज्ञापन के रूप में काम करते हैं (यदि फ़ाइल की सामग्री या प्राथमिक को संग्रहीत करना)। लेकिन अगर मैं M- के बाद इनमें से कोई भी कमांड टाइप करता हूँ! emacs में (और हिट रिटर्न) कुछ नहीं होता है; कर्सर मिनीबफ़र में रहता है जैसे कि अधिक इनपुट की अपेक्षा करना; और अगर मैं नियंत्रण हासिल करने के लिए बाधित करता हूं, तो प्राथमिक तौर पर कुछ भी संग्रहीत नहीं किया गया है।
सिल्वियो लेवी

ठीक है, आपका विचार एक्लिप्स के बजाय xsel के साथ ठीक काम करता है: (shell-command (format "echo '%s' | xsel -i" buffer-file-name))- और जब एक इंटरेक्टिव कमांड में बनाया गया (जैसा कि ऊपर @JeromeRadix द्वारा सबसे उत्कीर्ण उत्तर में सुझाया गया है), यह एक बड़ी जीत है! धन्यवाद!
सिल्वियो लेवी

0

सबसे सरल तरीका और होगा

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

ट्रे जैक्सन से उधार लेकर मैं इसके साथ आया:

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

आप साइट पर अधिक जानकारी पा सकते हैं


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.