আমি কীভাবে এলিসপ থেকে একটি মিনিফার প্রম্পটের উত্তর দিতে পারি?


10

আমি মাঝে মাঝে নিজেকে নিজের ব্যবহারের জন্য লিখছি এমন একটি ক্রিয়াকলাপের অভ্যন্তরীণ ইন্টারেক্টিভ ফাংশনগুলি ব্যবহার করে দেখতে পাই। যদি কোনও ফাংশন কিছু তথ্যের জন্য জিজ্ঞাসা করে (যেমন "আউটপুট ফাইল: ~ /") মিনিপুফায়ারে পাঠ্য যুক্ত করার জন্য সাধারণ এলিস্প উপায় আছে এবং তারপরে এন্টার টিপুন যাতে ব্যবহারকারীর তা করতে না হয়?

উদাহরণ হিসাবে, ধরুন যে আমি org-latex-export-to-pdfকোনও ফাংশনের অভ্যন্তরে চালাতে চাই তবে আমি চাই না যে ব্যবহারকারী কোনও ফাইলের নাম নির্দিষ্ট করে দেবে। দৌড়াতে (org-latex-export-to-pdf)পয়েন্টটি মিনিবুফারে চলে যাবে, তবে (insert "filename.tex")পরের লাইনে এমন কিছু দেওয়া কাজ করবে বলে মনে হচ্ছে না।


3
সাধারণত, একটি ইন্টারেক্টিভ ফাংশনকে তার interactiveধারাটিতে এই জাতীয় তথ্যের জন্য অনুরোধ করা উচিত । যখন এলিসপ থেকে কল করা হবে তখন আপনার ফাংশন আর্গুমেন্ট হিসাবে তথ্যটি পাস করতে সক্ষম হওয়া উচিত। অবশ্যই, এটি আপনাকে সাহায্য করবে না, যদি আপনি যে ফাংশনটিতে কল করার চেষ্টা করছেন সেটি এই নকশাটি অনুসরণ করে না case
লিন্ডাইড্যান্সার

হ্যাঁ, আমি খুঁজে পেয়েছি যে বিষয়টিও সাধারণত হয় (দুর্ভাগ্যক্রমে এই মুহুর্তে নয়) যার কারণ হতে পারে এর উত্তর খুঁজে পাওয়া এতটা কঠিন। তুমি কি জানো সেখানে একটি নকশা কারণ যদি সত্যিই minibuffer থেকে অনুরোধ জানানো উত্তর আউট টাইপ করতে ব্যবহারকারী অনুপস্থিত?
শেঠ রথসচাইল্ড

আপনার মন্তব্য আমার কাছে অস্পষ্ট। আপনি কি ব্যবহারকারীকে জিজ্ঞাসা করা এবং প্রতিক্রিয়া জানাতে চান না? যদি না হয় তবে প্রোগ্রামটিমেটিক্যালি আর্গুমেন্টের মানগুলি (আউটপুট ফাইলের নাম) আপনি চান / প্রয়োজন এবং এগুলি ফাংশনে পাস করুন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি কিছু কোড দেখান বা অন্য কোনও উপায়ে আপনার সমস্যা এবং প্রশ্ন কী তা সুনির্দিষ্ট এবং পরিষ্কার করুন বা প্রশ্নটি ঝুঁকিপূর্ণ হিসাবে বন্ধ হয়ে যাওয়ার বিষয়টি স্পষ্ট করে দিন।
ড্র হয়েছে

আমি ব্যবহারকারী (আমাকে) জিজ্ঞাসা করতে চাই না। আমি প্রশ্নটি পরিষ্কার করতে পারি। মিনিবফারটিতে ইয়াঙ্কিং সম্পর্কে কয়েক বছর আগে আপনাকে জড়িত ইমেল থ্রেডের কিছু অংশ পড়ার পরে, আমি মনে করি এটি কীভাবে করতে হয় তা আমি জানি। আমি যদি এটি কাজ করে তবে আমি এটি লিখে রাখব।
শেঠ রথচাইল্ড

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""হ্যালো" প্রথম স্ট্রিং, "বিশ্ব" পাতার মর্মর কোড মাধ্যমে সন্নিবেশিত দ্বারা সন্নিবেশ করানো হয়েছে, এবং পরিশেষে "RET" ইনপুট শেষ করতে সঙ্গে।

এটি এমন পরীক্ষার স্যুট সহ আসে যা আপনি আরও ব্যবহারের উদাহরণের জন্য দেখতে পারেন।


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খুব দ্রুত উঠে আসবে। এটি sertোকানোর কোনও জায়গা থাকার আগে এটি স্ট্রিংটি sertোকানোর চেষ্টা করে।


আমি আপনার প্রশ্নটি সংশোধন করার পরামর্শ দিচ্ছি যাতে org-export-output-file-nameব্যবহারের সময় প্রোগ্রামের মতো কোনও ফাইলের নামটি পাস করার জন্য সহায়তা org-latex-export-to-pdfচাওয়া হয় যাতে ব্যবহারকারীকে ফাইল নামের জন্য অনুরোধ করা হয় না। আপনি প্রশ্নটিতে আপনার প্রচেষ্টা রাখতে পারেন - যেমন run-with-timer, ইত্যাদি however তবে এটি কোনও ভাল সমাধান নয় (আমার মতে)। আরও ভাল সমাধান হ'ল প্রোগ্রামের মতো কোনও ফাইলের নামটি সঠিকভাবে পাস করা যাতে মিনিবাসটি প্রথম স্থানে না খোল। আমি এই উত্তরটি মুছতে সুপারিশ করব যাতে আপনি আরও elispঅভিজ্ঞতার সাথে আরও ভাল সমাধান পান ।
আইনজীবি

@ ফাইলের নাম কীভাবে পাস করতে হবে সে প্রশ্নটি আমার তালিকাভুক্ত org-latex-export-to-pdfকরা নয়, এটি আমার আগ্রহী নয় It এটি উদাহরণ হিসাবে আপনি আমার একটি যুক্ত করার ইচ্ছা পোষণ করেছেন বলে মনে হয়। আমি যে প্রশ্নটি জিজ্ঞাসা করেছি তা হ'ল আমি বোঝাতে চাইছি: এলিস্পের মাধ্যমে মিনিপুফার প্রম্পটের নির্ভরযোগ্য উত্তর দেওয়ার কোনও উপায় আছে কি? কেস সলিউশন দ্বারা কেস খুব বেশি যা আমি সন্ধান করছি তা নয়। আপনার মন্তব্য থেকে, আমি অনুমান করতে পারি যে এটি প্রস্তাবিত নয়।
শেঠ রথসচাইল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.