मिनीबफ़र में वर्तमान फ़ाइल नाम रखें


12

मैं सक्रिय फ़ाइल बफ़र के फ़ाइल नाम को कमांड में कैसे सम्मिलित कर सकता हूं?

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

मैं एक काल्पनिक की तलाश कर रहा हूं C-xजो कि मैं मिनीबार में कमांड लाइन बनाने के दौरान टाइप कर सकता हूं।

इसलिए, यदि वर्तमान बफर नाम की एक फ़ाइल है Lorem Ipsum.txt, तो मैं इसे टाइप करता हूं:

M-x grep RET 'foo' SPC C-x … RET

M-xgrepRETप्रस्तुत करता है एक minibuffer के लिए उत्साह grepआदेश। जवाब में, मैंने रेगेक्स पैटर्न तर्क टाइप किया है ( 'foo') और फ़ाइल नाम तर्क ( C-x) डाला । उस मिनीबफ़र के रूप में समाप्त हो जाएगा:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

मौजूदा कमांड को वर्तमान फ़ाइल बफर फाइल का नाम इस तरह मिलता है? इसकी डिफ़ॉल्ट कुंजी बाध्यकारी क्या है?


3
मुझे आश्चर्य है कि किसी का उल्लेख नहीं है M-n। यह हर जगह काम नहीं करता है, लेकिन बहुत सारी जगहों पर काम करता है। इसके अलावा, जब से आप grepping कर रहे हैं, आप lgrep और rgrep को पसंद कर सकते हैं, जो थोड़ा और इंटरएक्टिव हैं, मुझे लगता है।
मालाबार

जवाबों:


18

मौजूदा कमांड को वर्तमान फ़ाइल बफर फाइल का नाम इस तरह मिलता है?

दुर्भाग्य से इसके लिए कोई तैयार कमांड नहीं है, लेकिन हम निम्नानुसार एक बना सकते हैं:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

जादू मिनीबफ़र-चयनित-विंडो फ़ंक्शन में है; यह मिनीबर्फर सक्रिय होने से पहले अंतिम बफर उठाकर सही काम करता है। अन्यथा केवल बफर-फ़ाइल-नाम का उपयोग करने से हमें फ़ाइल नाम मिनीबफ़र में नहीं मिलेगा। दिलचस्प है, एक ही फ़ंक्शन का उपयोग नियमित बफर या मिनीबफ़र में फ़ाइल नाम डालने के लिए किया जा सकता है। किसी विशेष उपचार की आवश्यकता नहीं है।

इसकी डिफ़ॉल्ट कुंजी बाध्यकारी क्या है?

कोई भी नहीं है, लेकिन आप एक सुविधाजनक चुन सकते हैं और इसे निम्नानुसार असाइन कर सकते हैं:

(global-set-key (kbd "C-c f") 'name-of-the-file)

अपनी init.el फ़ाइल में उपरोक्त लिस्प कोड लाइनें डालें।

यह सबसे तुच्छ मामलों में काम करता है, लेकिन यह अनुमान लगाने में कठिन है कि इस फ़ंक्शन को लागू करते समय आपके पास जो भी मोड सक्रिय हैं, उनके साथ क्या संघर्ष हो सकता है।

क्या होगा अगर बफर वैध फ़ाइल नाम पर नहीं जा रहा है, जैसे कि स्क्रैच बफर? तब इस त्रुटि को प्रतिध्वनि क्षेत्र में दिखाया गया है:

name-of-the-file: Wrong type argument: char-or-string-p, nil

शॉर्टकट लागू करने से पहले एक उचित फ़ाइल नाम के साथ एक वैध बफर लेने से इस तरह की त्रुटियों से बचा जा सकेगा।

उपरोक्त जैसे कई अन्य समाधान हैं, लेकिन वे मुख्य रूप से भिन्न हैं कि वे अपवादों को कैसे संभालते हैं या किसी भी संघर्ष के लिए ओवरराइड करते हैं। उदाहरण के लिए, कुछ फ़ंक्शन इस हुक को केवल कुछ मोड में उपलब्ध कराने के लिए मोड-हुक नियोजित करते हैं।


इस काम के लिए मुझे लगता है कि एक काम करना होगा enable-recursive-minibuffers
डाइटर। विल्हेम

यदि कमांड को केवल मिनीबफ़र में उपयोग किया जाना है, तो निम्नलिखित बाइंडिंग का उपयोग (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function नाम-ऑफ-द-बफर के बजाय किया जा सकता है, जिसे मैं C-c bवर्तमान बफर नाम सम्मिलित करता हूं ।
डोवर ग्रोबगल्ड

2

dired-xकीबोर्ड शॉर्टकट C-x C-jका उपयोग करते समय यह बाध्य है dired-jump। तो आपके फ़ाइल बफ़र से आप दाईं ओर की पंक्ति में समाप्त होते हैं और इसके फ़ाइल नाम के साथ कॉपी कर सकते हैं w। और फिर आप इसे मिनी बफर में पेस्ट करने में सक्षम हैं।

फ़ाइल नाम के टाइपिंग की एक और संभावना मानक Emacs मिनी बफर फ़ाइल पूर्णता है। बस अपने फ़ाइल नाम के पहले अक्षर टाइप करें और फिर TAB।


1
आप केवल w(कमांड dired-copy-filename-as-kill) का उपयोग करके वर्तमान डेड लाइन पर फ़ाइल का नाम कॉपी कर सकते हैं ।
ड्रू

-1

प्रश्न ऐसा करने के लिए मौजूदा Emacs कमांड के लिए कहता है।

जैसा कि पहले कहा गया है:

दुर्भाग्य से इसके लिए कोई तैयार कमांड नहीं है

जो इस प्रश्न का उत्तर देता है।


आपके उपयोग के मामले को कम करने के तरीके हैं और अन्य लोगों ने सुझाव दिया है कि बीस्पोक कोडिंग समाधान है, इसलिए मुझे लगता है कि आपका बयान सही नहीं है। आपने विशेष रूप से एक आउट-ऑफ-द-बॉक्स Emacs के लिए रास्ता नहीं पूछा !
डायटर। विल्हेम

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