ডিমন মোড: প্রারম্ভকালে ইন্টারেক্টিভ প্রম্পটগুলি স্থগিত করুন?


16

(দ্রষ্টব্য, বিপরীতে শিরোনাম, এই প্রশ্নটি ডিমন মোডে কীভাবে শুরু করতে হবে এবং ইন্টারেক্টিভ কথোপকথনগুলি দমন করতে পারে তার সমান নয় ? কারণ এই প্রশ্নটি একটি নির্দিষ্ট প্রম্পট উপস্থিত হওয়ার কারণ হিসাবে দাখিলকারী দ্বারা "উত্তর" দিয়েছিল।)

আমি যদি একটি হয় জানতে চাই সাধারণ উপায় রাখার emacs --daemonচিরকাল ঝুলন্ত একটি প্রম্পট একটি minibuffer যা এখনও বিদ্যমান নয় প্রদর্শিত একটি উত্তরের জন্য অপেক্ষা করেন।

এই অনুরোধগুলির উত্তর দেওয়ার জন্য কোনও ইমালস্কিলিয়েন্টের সাথে সংযোগ স্থাপন করা অসম্ভব, কারণ ইমাকস স্টার্টআপ ক্রমটি শেষ না করা পর্যন্ত সার্ভারটি শুরু হয় না। (এর অর্থ, আপনি যদি ALTERNATE_EDITOR খালি স্ট্রিংয়ে সেট করেন তবে emacsclientএটি সার্ভারকে একটি নতুন ডেমন শুরু করতে পারে না, আপনি সমস্ত আটকে থাকা এবং অপেক্ষা করে একাধিক ইম্যাক ডিমন দিয়ে শেষ করতে পারেন)) আমাকে killall emacsসমস্যাটি সমাধান করতে হবে এবং চালিয়ে যাওয়ার আগে।

আমি যখন শনাক্ত করি তখন প্রতিটি জিনিস প্রারম্ভের সময় প্রম্পট সৃষ্টি করে তাড়াহুড়ো-এ-তিল খেলতে পারি (নন-ডেমন মোডে ইমাস শুরু করে এবং এটি কী জিজ্ঞাসা করছে তা দেখে) তবে এটি কোনও সমাধান নয় কারণ এটি পরবর্তী ডিমন থামাতে পারে না নতুন কারণে স্টার্টআপে ঝুলন্ত থেকে

উদাহরণস্বরূপ: একটি সাধারণ কারণ এটি হ্যাং হয়ে যাওয়ার কারণ হ'ল সিস্টেম রিবুট বা ইমাস্যাক ক্র্যাশ হওয়ার পরে, যখন প্রথম পুনরায় বুট করা ইমাকরা জানতে চান যে অচল ইম্যাকগুলি থেকে লকফিলগুলি চুরি করা ঠিক আছে কিনা। আমি সেই প্রম্পটটি তৈরি করার পরামর্শ তৈরি করে তা ঠিক করতে পারলাম সবসময় মিথস্ক্রিয়া ছাড়াই "হ্যাঁ" উত্তর দিন। তবে তারপরে, পূর্ববর্তী সেশনটি সেভ করার সময় যে ফাইলগুলি খোলা ছিল তার মধ্যে একটি ট্রাম্প ফাইল ছিল যা একটি সুডো বা এসএসএইচ পাসওয়ার্ডের প্রয়োজন, তাই ডেমন আটকে একটি পাসওয়ার্ড প্রম্পটে অপেক্ষা করে। তাই আমি আপত্তিজনক ফাইলগুলি সরিয়ে ফেলার জন্য ম্যানুয়ালি সেশন ফাইলটি ( viবা এর সাথে emacs -q) সম্পাদনা করে ঠিক করেছি — তবে পরের বার এটি হতে আটকাবে না।

সুতরাং, আমি প্রারম্ভকালে আমার সেশনটি স্বয়ংক্রিয়ভাবে লোড করা বন্ধ করতে এবং এটিকে একটি কমান্ডে পরিবর্তন করতে হবে আমাকে নিজের প্রথম ইমামস্ক্লিয়েন্ট থেকে ম্যানুয়ালি কার্যকর করতে হবে। তবে যদি এটি আমার সেশনটি পটভূমিতে লোড না করে তাই এটি ব্যবহারের জন্য প্রস্তুত হওয়ার সাথে সাথে এটি প্রস্তুত হয়ে যায়, ডেমনটির পুরো উদ্দেশ্যটি হারিয়ে যায়!

সুতরাং আমি যা চাই তা হ'ল:

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

এই দুটি লক্ষ্য অর্জনের কি কোনও উপায় আছে?


প্রোগ্রামটিমে এই ধরণের সমস্যাগুলি পুনরুত্পরণের কোনও উপায় আছে যাতে সম্প্রদায়টি সমস্যার সমাধান করতে পারে?
মেলিওরাটাস

1
ঠিক আছে, আমি প্রথম লাইনে যেমন লিখেছি, একটি নির্দিষ্ট উদাহরণ ঠিক করা খুব সহজ ... "ডাক্তার, আমি যখন এটি করি তখন ব্যথা হয় ..." "তখন এটি করবেন না।" বিষয়টি সাধারণ ঘটনা the কিন্তু দ্বিতীয় বিষয়টি তৈরি করতে একটি সহজ উপায় প্রারম্ভে মাধ্যমে ডেস্কটপ পুনঃস্থাপন থাকতে হয় (read-desktop), তারপর, চালানোর আগে emacs --daemon, মধ্যে একটি পূর্ণসংখ্যা নির্বাণ দ্বারা একটি বাজে লক ফাইল তৈরি .emacs.desktop.lock (যেখানে থেকে করা যে ফাইল, দুর্ভাগ্যবশত, আপনার কনফিগারেশনের উপর নির্ভর করে , তবে সম্ভবত আপনার হোমডির বা ~ / .emacs.d /
ট্রে

1
এটি এখানে প্রায়শই উল্লিখিত কেস, উদাহরণস্বরূপ: emacs.stackexchange.com/questions/8147/… বা emacs.stackexchange.com/questions/31621/… প্রসঙ্গ সরবরাহ করতে পারে।
ট্রে

এই ত্রুটিটি সম্পর্কিত বলে মনে হচ্ছে: বাগ # 13697 - ইমাকগুলি ব্যবহারকারীর সাথে যোগাযোগ করতে পারে কিনা তা জানানোর একটি উপায় , তবে আমি যতদূর জানি, কেউ এতে কাজ করেনি।
npostavs

@ এনপোস্টাভস লিঙ্কটির জন্য ধন্যবাদ — আমি বাগটি টিকিয়ে রেখেছি, যদিও এটির একটি ভ্রান্ত সূচনা হয়েছিল যেটি আমি এখানে প্রকাশ করার আগে এখানে (মুছে ফেলা) বলে মন্তব্য করেছি!
ট্রে

উত্তর:


2

আমাদের আলোচনা সাফ করেছে যে আপনার কোনও এক্স-সার্ভারটি চালাচ্ছে না এটি আমার জন্য প্রথম সমাধানটি আপনার অকেজো রেন্ডার করে ।

নিম্নলিখিতটিতে আমি একটি দ্বিতীয় সমাধান উপস্থাপন করছি যা টেক্সট টার্মিনাল ফ্রেমের সাথে কাজ করে।

আপনার প্রারম্ভিককরণের জন্য যখন avoid-initial-terminalইমপ্যাক্সের সাথে পরামর্শ দেওয়া ফাংশনগুলির একটির মাধ্যমে ব্যবহারকারী ইনপুট দরকার হয় আপনি কোনও টেক্সট টার্মিনাল ফ্রেম খোল না হওয়া পর্যন্ত অপেক্ষা করে its প্রম্পটটি সেই ফ্রেমের মিনিফারটিতে উপস্থিত হয় এবং আপনি আপনার ইন্টারেক্টিভ প্রতিক্রিয়া দিতে পারেন।

কোড সম্পর্কিত ইনফোগুলি কোডটিতে মন্তব্য হিসাবে দেওয়া হয়। TODOবর্ণনার সাথে এমন মার্কার রয়েছে যা আপনাকে দেখায় যে আপনার নিজের কনফিগারেশনটি কোথায় sertোকানো হবে। বর্তমানে সেখানে পরীক্ষার ফর্ম রয়েছে যা কোডটি বৈধ করে।

;; TODO: Do here configure the server if needed.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Startup the server:
;; Analysis of read_from_minibuffer in src/minibuf.c and daemon_type in src/emacs.c
;; shows that daemon-initialized must have run before read-passwd / read-string
;; works on frames. Before it only works on stdin & stdout.
(server-start) ;;< early start
(let ((after-init-time before-init-time))
  (daemon-initialized)) ;; Finalize the daemon, 

(advice-add 'daemon-initialized :override #'ignore)
;;< Ignore `daemon-initialized' after initialization. It may only run once!
;; Now the background emacs is no longer marked as daemon. It just runs the server.

(defun prevent-server-start (&rest _ignore)
  "Prevent starting a server one time after `server-start' has been advised with this."
  (advice-remove 'server-start #'prevent-server-start))

(advice-add 'server-start :override #'prevent-server-start)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Prepare waiting for a real terminal frame when user input is required:

(defun avoid-initial-terminal (fun &rest args)
  "Wait until we are no longer on \"intial-terminal\".
Afterwards run `fun' with frame on the other terminal selected."
  (message "Avoiding initial terminal. Terminal: %S" (get-device-terminal nil))
  (while (string-equal
      (terminal-name (get-device-terminal nil))
      "initial_terminal")
    (sleep-for 1))
  ;; (message "Selected frame: %S; Running %S with %S." (selected-frame) fun args)
  (apply fun args))

(advice-add 'read-string :around #'avoid-initial-terminal)

(advice-add 'read-passwd :around #'avoid-initial-terminal)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TODO: Your initialization that is not daemon related
;; and may require user input:

;; Currently this is just a test.
(read-passwd "Passwd: ")

(read-string "String: ")

(y-or-n-p "y-or-n query")

পরীক্ষা: ইমাসস-সংস্করণ: 26.1

1 ম) emacs --daemonএকটি কনসোল চালান ।

২ য়) emacsclient --ttyঅন্য কনসোলে চালান । আপনাকে সেখানে একটি পাসওয়ার্ড এবং স্ট্রিংয়ের জন্য জিজ্ঞাসা করা হয়েছে। এরপরে আপনাকে y-or-np প্রশ্নের উত্তরও দিতে হবে।


3

আপনি যা চাইছেন ঠিক তা নয় তবে সম্ভবত আপনার মূল সমস্যার সমাধান:

আমি জানতে চাই যে Emacs রাখার কোনও সাধারণ উপায় আছে - ডেমোন চিরকাল ঝুলন্ত থেকে ঝুলানো থেকে এখনও অবধি নেই এমন একটি মিনিফায়ারে প্রদর্শিত প্রম্পটের উত্তরের জন্য অপেক্ষা করে waiting

ডেমোন যদি আপনাকে তার প্রারম্ভিক পর্যায়ে উত্থাপিত প্রশ্নের উত্তর দেওয়ার জন্য একটি গ্রাফিকাল ফ্রেম দেয় তবে আপনি আর আটকে যাবেন না।

নীচের কোডটি একটি সাধারণ পরামর্শ সংজ্ঞায়িত my-with-initial-frameকরে যা প্রথম উপলব্ধ ডিসপ্লেতে (যেমন, :0.0) কোনও ফ্রেম খোলে ।

যে পরামর্শ মত অনুসন্ধান কমান্ড সহজে যোগ করা যেতে পারে y-or-n-pবা read-passwdএটি নীচের হিসাবে প্রদর্শিত হয়।

কেবল একটি ফ্রেম খোলাই আপনাকে ব্যবহারকারীর ইন্টারফেসে প্রশ্নের উত্তর দেওয়ার তুলনায় মোটামুটি সম্ভাবনা দেয়। কেউ এর জন্য একটি ডায়ালগ বক্সও ব্যবহার করতে পারে y-or-n-pতবে এর জন্য নির্দিষ্ট জিজ্ঞাসা কমান্ডগুলির জন্য বিশেষ সমাধান প্রয়োজন। আমি তা এড়াতে চেয়েছিলাম।

যদি আপনি নিজের থিম ফাইলটিতে কোডটি চেষ্টা করে থাকেন তবে নিশ্চিত করুন যে এটি সেখানে প্রথম জিনিস।

(when (daemonp)

  (defun my-with-initial-frame (&rest _)
    "Ensure a frame on display :0.0 and ignore args."
    (let* ((display-list (x-display-list))
           (display-re (and display-list (regexp-opt display-list)))
           (term (and display-re (cl-some (lambda (term) (and (string-match display-re (terminal-name term)) term)) (terminal-list))))
           (frame (and term (cl-some (lambda (frame) (and (frame-live-p frame) frame)) (frames-on-display-list term)))))
      (select-frame (or frame (make-frame-on-display (getenv "DISPLAY"))))))

  (message "Advising querying functions with `my-with-initial-frame'.")
  (advice-add 'y-or-n-p :before #'my-with-initial-frame)
  (advice-add 'read-passwd :before #'my-with-initial-frame))

টেস্ট:

অনুমিতি:

একটি চলমান এক্সসারভার রয়েছে যা প্রোগ্রামগুলি DISPLAYপরিবেশের ভেরিয়েবলের মাধ্যমে সংযোগ করতে পারে ।

এক্সটার্মে ইনপুট:

emacs --daemon

emacsclient --eval '(y-or-n-p "A")'

y-or-n-pক্যোয়ারী প্রম্পট সহ একটি ফ্রেম খোলে A (y or n)। সেই প্রশ্নের উত্তর দিন এবং আবার চেষ্টা করুন:

emacsclient --eval '(y-or-n-p "B")'

B (y or n)একই ফ্রেমে প্রম্পট সহ নতুন ক্যোয়ারী । উদাহরণস্বরূপ, সেই ফ্রেমটি বন্ধ C-x 5 0করুন এবং আবার চেষ্টা করুন:

emacsclient --eval '(y-or-n-p "C")'

ক্যোয়ারী প্রম্পট সহ একটি নতুন ফ্রেম খোলে C (y or n)

পাসওয়ার্ড ইনপুট জন্য একই কাজ করে।


@ ট্রে আমার কোডটি নিয়ে আসলে কিছু সমস্যা ছিল (আসলে পরীক্ষার ক্ষেত্রে)। এক্স-সার্ভারটি শুরু করার সময় প্রথম কাজ হয়নি। আমি ডেমনটি পুনরায় শুরু না করার পরে আমি প্রাথমিকভাবে লক্ষ্য করিনি। আমি এখন সংশোধন। আবার পরীক্ষা করুন। ধন্যবাদ।
টোবিয়াস

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

টোবিয়াস, উপরোক্ত ব্রাসেক লাগলে আমি ক্ষমা চাইছি - আমি আমার ফোনে জবাব দিয়েছি এবং নিজেকে সংক্ষিপ্ত করে তুলতে পেরেছি, সুতরাং আমাকে আরও বিস্তারিত জানাতে চেষ্টা করুন: আপনি ডেমনটি ব্যবহার না করার এবং server-startস্টার্টআপের শেষে দৌড়ানোর বিষয়ে আপনি যা বর্ণনা করেছেন তার একমাত্র সুবিধা আমি দেখতে পাচ্ছি পরিবর্তে এটি হ'ল, যদি আপনি একটি পরিষ্কার শুরু করেন, আপনাকে অপেক্ষা করতে হবে না। তবে ... আপনাকে অপেক্ষা করতে হবে, কারণ যতক্ষণ না আমি ভুল বুঝেছি ততক্ষণ আপনি জিএমআই উপলব্ধ না হওয়ায় আপনার সিস্টেমে লগইন স্ক্রিপ্টে ইমাস ডেমন শুরু করার কাজটি আপনি স্থাপন করতে পারবেন না। (এবং আমার মতো কোনও ক্ষেত্রে এটি পরে আর কখনও হবে না))
ট্রে

@ ট্রে আপনি কি চ্যাটে যোগ দিতে পারবেন ?
টোবিয়াস

1

আমি মনে করি মুলতবি অনুরোধ জানানো ing সাধারণভাবে কঠিন হতে যাচ্ছে, কিন্তু এটা মোটামুটি সহজ হওয়া উচিত এ গিয়ে Emacs পরিবর্তন করতে যাতে এই ধরনের অনুরোধ জানানো অবিলম্বে একটি ত্রুটি সংকেত দেন।

শুধু তা-ই নয়, তবে আপনি যদি প্রচুর জিমন্যাস্টিকস ব্যতীত এই অনুরোধগুলির উত্তর দিতে না পারেন, তবে আমি মনে করি এটি একটি বাগ হিসাবে যোগ্য হয়, সুতরাং আমি আপনাকে এটির জন্য একটি বাগ রিপোর্ট জমা দেওয়ার পরামর্শ দিই।


আমার মনে হয় আমার আরও কিছুটা বিশদ দরকার। ডেস্কটপ সেভ-ফাইল লকটি বিবেচনা করুন আমি উপরের অনুগ্রহের মন্তব্যে উল্লেখ করেছি। কোনওভাবে "ডেস্কটপ" কে নির্দিষ্টভাবে উল্লেখ নাWarning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n) করে একজন প্রম্পটকে কীভাবে একটি ত্রুটিতে রূপান্তরিত করতে পারে (কারণ সেই উপায়টি, ননজেনারাল হয়ে মিথ্যা তায়াল-এ-মোল)?
ট্রে

স্টিফান, এছাড়াও এমন একটি সমস্যা রয়েছে যা আমাকে বিরক্ত করে না কারণ আমি এমাক্স ডেমনটি এইভাবে চালিত করি না, তবে একটি সাধারণভাবে কার্যকর উত্তর দেওয়ার জন্য সম্বোধনের প্রয়োজন হতে পারে: মারাত্মকভাবে ভুল করার ফলে ইম্যাক্স সিস্টেমড বা অন্যান্য প্রহরীদাগগুলির মাধ্যমে পুনরায় চালু হওয়ার কারণ হবে will একটি লুপে তবে ত্রুটিগুলি উপেক্ষা করা এবং কেবলমাত্র লগইন করা *Messages*সম্ভবত প্রথম ক্লায়েন্টের সাথে অপ্রতুল হেড-আপ হ'ল কোনও বিষয় গুরুতরভাবে উদ্বেগজনক হতে পারে এবং ব্যবহারকারীর কোনও রাষ্ট্রীয় ক্রিয়াকলাপ চেষ্টা করার আগে তাত্ক্ষণিক দৃষ্টি আকর্ষণ করা প্রয়োজন।
ট্রে

(যারা ডিমন ব্যবহার করেন না তাদের জন্য স্পষ্ট করে বলার জন্য - যদি আপনি নিজে নিজেই এটি শুরু করেন, হয় পরিবেশের ভেরিয়েবলটি খালি স্ট্রিংয়ের সাথে সেট emacs --daemonকরে বা শুরু emacsclientকরার মাধ্যমে ALTERNATE_EDITOR, আপনি আউটপুটটি দেখতে পাবেন যা সাধারণত *Messages*ডিমন পর্যন্ত টার্মিনালে প্রতিধ্বনিত হয়) ইনিশিয়ালেশন সম্পূর্ণ করে এবং ইমাকস প্রস্তুত But তবে অনেকেরই সিস্টেম প্রারম্ভকালে বা লগইন করার সময় ইমাকগুলি ডেমন শুরু করে এবং আউটপুটটি হয় লগ হয় বা ফেলে দেওয়া হয়
ট্রাই

1
@Trey: ERROR সিগন্যালিং মধ্যে করা উচিত হবে না desktopকিন্তু y-or-n-pফাংশনটি (বা এখনো কম)। প্রারম্ভকালে ঘটে যাওয়া ত্রুটিগুলি প্রদর্শনে বিলম্ব করার জন্য আমাদের কিছু ব্যবস্থা আছে, তাই প্রথম ইমাস্ক্লিওটটি ডেমনটির সাথে সংযোগ স্থাপন করার সময় আমরা সেগুলি প্রদর্শন করতে এটি ব্যবহার করতে পারি।
স্টেফান

উভয় ক্ষেত্রেই, যদিও বেশিরভাগ ব্যবহারকারীর মনে হয় না *Messages*- এবং সতর্কতা উত্পন্ন হওয়ার সময় যদি একটি সক্রিয় ফ্রেম উপস্থিত থাকে তবে স্বল্প-ব্যবহৃত *Warnings*সিস্টেমটি বাফারে একটি উইন্ডো পপ আপ করে দেয় , এই ক্ষেত্রে কোনও ফ্রেম উপস্থিত নেই এবং এটি ব্যবহার করে না সতর্কতার ইস্যুটি অনুসরণ না করে প্রথম ইমামস্ক্লিয়েন্ট হওয়া পর্যন্ত পপ-আপকে পিছনে ফেলা সহজ মনে হয় না। যদি এটি করা যায় তবে yes-or-no-pপরিবর্তে প্রাক ক্লায়েন্টকে সতর্ক করার পরামর্শটি আপনার পক্ষে যথেষ্ট আদর্শ। (আমি সন্দেহ করি ব্যবহারকারীরা *Messages*শুরুতে ঝুঁটি !)
ট্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.