मैं एक मिनीबफ़र का जवाब कैसे दे सकता हूँ?


10

मैं कभी-कभी किसी फ़ंक्शन के अंदर इंटरैक्टिव फ़ंक्शंस का उपयोग करके खुद को ढूंढता हूं जो मैं अपने उपयोग के लिए लिख रहा हूं। यदि कोई फ़ंक्शन कुछ जानकारी मांगता है (उदाहरण के लिए "आउटपुट फ़ाइल: ~ /") तो मिनीबफ़र में टेक्स्ट जोड़ने के लिए एक सामान्य तरीका है और फिर एंटर दबाएं ताकि उपयोगकर्ता को ऐसा न करना पड़े?

एक उदाहरण के रूप में, मान लीजिए कि मैं org-latex-export-to-pdfकिसी फ़ंक्शन के अंदर चलना चाहता हूं लेकिन मैं नहीं चाहता कि उपयोगकर्ता को फ़ाइल नाम निर्दिष्ट करना पड़े। रनिंग (org-latex-export-to-pdf)प्वाइंट को मिनीबार में ले जाएगा, लेकिन (insert "filename.tex")अगली लाइन पर कुछ डालने से काम नहीं लगता।


3
आमतौर पर, एक इंटरेक्टिव फ़ंक्शन को इस तरह की जानकारी के लिए अपने interactiveखंड में संकेत देना चाहिए । जब आपको एलीस्प से बुलाया जाता है, तो आपकी जानकारी को फ़ंक्शन तर्क के रूप में पास करने में सक्षम होना चाहिए। बेशक, यह आपकी मदद नहीं करता है, यदि आप जिस फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं वह इस डिज़ाइन का पालन नहीं करता है।
लिंडिडेन्सर

हाँ, मैंने पाया है कि इस मामले में आमतौर पर (दुर्भाग्य से फिलहाल नहीं), जो हो सकता है कि इसका जवाब खोजने के लिए इतना कठिन हो। क्या आप जानते हैं कि वास्तव में उपयोगकर्ता को मिनीबफ़र से संकेतों के जवाब टाइप करने के लिए कोई डिज़ाइन कारण है ?
सेठ रोथ्सचाइल्ड

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

मैं नहीं चाहता कि उपयोगकर्ता (मुझे) ने समझा। मैं प्रश्न को स्पष्ट कर सकता हूं। कुछ साल पहले आपसे एक ईमेल थ्रेड का हिस्सा पढ़ने के बाद, मिनीबफ़र के लिए yanking के बारे में, मुझे लगता है कि मुझे पता है कि यह कैसे करना है। अगर मुझे यह काम आता है तो मैं इसे लिखूंगा।
सेठ रोथ्सचाइल्ड

1
कृपया एक इंटरेक्टिव फ़ंक्शन का एक विशिष्ट उदाहरण पोस्ट करें जिसे आप अपना फ़ंक्शन लिखते समय उपयोग करना चाहते हैं, ताकि एक अन्य फ़ोरम प्रतिभागी यह प्रदर्शित कर सके कि फ़ंक्शन के लिए एक तर्क कैसे पास किया जाए और मिनीबफ़र को पूरी तरह से बायपास किया जाए।
कानून सूची

जवाबों:


3

दिलचस्प समस्या है। ऐसा लगता है कि संपादक post-command-hookहर बार नए कमांड-लूप में प्रवेश करता है, यानी ए recursive-edit। लेकिन हम इसके साथ शुरू कर सकते हैं minibuffer-setup-hook, जो मिनीबफ़र में प्रवेश करने के बाद एक फ़ंक्शन को निष्पादित करता है। हालांकि यह इनपुट डालने की अनुमति देता है, यह मिनीबफ़र से बाहर निकलने के लिए बहुत जल्द है, क्योंकि पकड़ अभी तक सेटअप नहीं की गई है।

(defmacro with-minibuffer-input (form &rest inputs)
  (declare (indent 1))
  `(minibuffer-with-setup-hook
       (lambda ()
         (minibuffer-input-provider ',inputs))
     ,form))

हमें अपने 'कमांड लूप' में 'तर्कों' को लपेटने की जरूरत थी, जो हर बार दाखिल होने पर निष्पादित हो जाते हैं recursive-edit, जिस समय यह एक तर्क को पॉप करता है और एक स्तर ऊपर, थ्रू फेंकता है exit-minibuffer

;; -*- lexical-binding: t -*-
(defun minibuffer-input-provider (inputs)
  (let ((hook (make-symbol "hook")))
    (fset hook (lambda ()
                 (remove-hook 'post-command-hook hook)
                 (when inputs
                   (when (= 0 (minibuffer-depth))
                     (error "Too many inputs"))
                   (when (cdr inputs)
                     (add-hook 'post-command-hook hook))
                   (insert (pop inputs))
                   (exit-minibuffer))))
    (add-hook 'post-command-hook hook)))


(with-minibuffer-input (call-interactively 'find-file)
  "/")

(with-minibuffer-input (call-interactively 'occur)
  "\\(foo\\)\\(bar\\)" "\\1");;C-u C-x C-e

;;foobar

(with-minibuffer-input (call-interactively 'replace-string)
  "foo" "bar")

;; foo

3

मैंने इस बुलाया के लिए एक मैक्रो लिखा है with-simulated-input, जिसे आप यहां प्राप्त कर सकते हैं । यह आपको उपयोगकर्ता आदान-प्रदान का अनुकरण करने के लिए मनमाना इनपुट प्रदान करने के साथ-साथ मनमानी लिस्प रूपों को निष्पादित करने की अनुमति देता है।

उदाहरण के लिए:

(with-simulated-input '("hello SPC" (insert "world") "RET")
  (read-string "Enter greeting: "))

"hello world"पहले स्ट्रिंग द्वारा डाले गए "हैलो" के साथ लौटना होगा , "दुनिया" को लिस्प कोड के माध्यम से डाला जाएगा, और अंत में इनपुट खत्म करने के लिए "आरईटी"।

यह एक परीक्षण सूट के साथ आता है जिसे आप अधिक उपयोग उदाहरणों के लिए देख सकते हैं।


0

ऐसा लगता है कि इसके run-with-timerसाथ insertकाम करने से काम हो जाएगा।

(run-with-timer .2 nil 'insert "filename.tex")
(run-with-timer .3 nil 'execute-kbd-macro (kbd "RET"))
(org-latex-export-to-pdf)

insertजब बाद में रखा गया आदेश बहुत जल्दी आ रहा है। यह स्ट्रिंग डालने की कोशिश करता है इससे पहले कि इसे डालने के लिए एक जगह हो।


मैं आपके प्रश्न को संशोधित करने की सलाह दूंगा कि प्रोग्राम org-export-output-file-nameका उपयोग करते समय प्रोग्रामेटिक रूप से सहायता org-latex-export-to-pdfप्राप्त करने के लिए ताकि उपयोगकर्ता को फ़ाइल नाम के लिए संकेत न दिया जाए। आप अपने प्रयासों को प्रश्न में रख सकते हैं - जैसे, run-with-timerआदि - हालांकि, यह एक अच्छा समाधान नहीं है (मेरी राय में)। बेहतर समाधान यह है कि प्रोग्राम नाम को ठीक से दर्ज किया जाए ताकि मिनीबफ़र कभी भी पहले स्थान पर न खुले। मैं इस उत्तर को हटाने की सिफारिश करूंगा ताकि आप अधिक elispअनुभव वाले किसी व्यक्ति द्वारा बेहतर समाधान प्राप्त कर सकें ।
कानून की सूची

@ एक फ़ाइल का नाम कैसे पास किया जाए, इस प्रश्न पर विचार करें कि क्या org-latex-export-to-pdfमुझे इसमें कोई दिलचस्पी नहीं है। यह एक उदाहरण है क्योंकि आप मुझे जोड़ने के इरादे से लग रहे थे। जो प्रश्न मैंने पूछा, वह वही है जिसका मेरा मतलब है: क्या एक तरीका है कि आप न्यूनतम रूप से मिनीबफ़र प्रॉम्प्ट का सटीक उत्तर दे सकें। केस सॉल्यूशन का एक मामला बहुत ज्यादा नहीं है जो मैं देख रहा हूं। आपकी टिप्पणी से, मैं अनुमान लगा सकता हूं कि यह अनुशंसित नहीं है।
सेठ रोथ्सचाइल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.