ইমাসের মধ্যে থেকেই ইম্যাকগুলি পুনরায় চালু করুন


44

আমি আমার ইম্যাক্স অনেকটা আবার চালু করি। আমি যা করতে চাই তা হ'ল একটি ফাংশন তৈরি করা যা বর্তমান ইম্যাক্সকে মেরে ফেলে, কেবল এটির স্থানে একটি নতুন স্প্যান তৈরি করতে। আদর্শভাবে, এটি একটি টিটিওয়াইতেও কাজ করবে।


8
কৌতূহলের বাইরে, আপনি কেন এতক্ষণ ঘন ঘন হত্যা এবং তত্ক্ষণাত পুনরায় আরম্ভ করবেন?
ড্যান

2
আমি খুব সক্রিয়ভাবে আমার বিকাশ করি .emacs.d, যার অর্থ আমি আমার পরিবেশে যে কয়লা আবর্জনা ফেলেছি তা মুছে ফেলার জন্য ইমাস পুনরায় চালু করি আরও কয়েকটি ব্যবহারের ঘটনা রয়েছে যেখানে আমি এটি করি তবে এটি সবচেয়ে বড়।
পাইথননট

1
@ পাইথননট, আমার মনে হয় আপনার নিজের প্রশ্নটি কিছুটা নতুন করে প্রকাশ করা দরকার। আপনি কি bashসমাপ্তির পরে পুনরায় চালু করতে বলতে পারেন? নাকি vi? বা অন্য কোনও প্রক্রিয়া, একটি নিয়ম হিসাবে? না, কারণ এটি তাদের উদ্বেগের ক্ষেত্রের বাইরে এবং সঠিকভাবে বাহ্যিকভাবে পরিচালনা করা হয়। যাই হোক, আপনি কি সত্যিই চান একটি উপায় reinitialize Emacs, তার VM- র বাইরে ক্লিয়ারিং এবং আপনার Init কোড পুনরায় চলমান দ্বারা ( ছাড়া তার প্রক্রিয়া হত্যা)। এটি ইমাসের জন্য দরকারী এবং যথাযথ হবে। যদিও এটি বিদ্যমান কিনা তা আমি জানি না :)
harpo

4
@ হার্পো হ্যাঁ, আমি bashআবার চালু করতে পারি exec bash। ভিম সম্পর্কে আমার ধারণা নেই।
পাইথননট

11
এফডাব্লুআইডাব্লু, আমি কনফিগার পরিবর্তনগুলি পরীক্ষা করার জন্য ইমাক্সের একটি নতুন উদাহরণ শুরু করার চেয়ে বেশি ঝোঁক , তারপরে বাইরে বেরিয়ে এসে পুনরায় আরম্ভ করার চেষ্টা করব। কেন? কারণ আমার কোডটিতে যদি ত্রুটি থাকে তবে ইমাকগুলি আবার চালু করার সময় আমার কনফিগারেশনটি লোড করতে সক্ষম না হতে পারে এবং সেই সময়ে আমি আমার স্বাভাবিক সেটিংসের সাথে প্রকৃতপক্ষে কোনও চলমান উদাহরণ পেতে পারি না, তাই আমাকে কম-পরিচিত পরিচিতিটি ব্যবহার করতে হবে বাগ ঠিক করতে পরিবেশ। এটি প্রায়শই ঘটে না, তবে এটি যখন হয় তখন বিরক্ত হয়। আমি emacs -qঅবশ্যই সমস্যাটি চালাতে পারি এবং ঠিক করতে পারি তবে আমি নিরাপদ থাকার জন্য আমার কনফিগারেশনটি হ্যাক করার সময় 'ভাল' উদাহরণটি সর্বদা চলতে পছন্দ করি।
ফিল্ডস

উত্তর:


25

দ্রষ্টব্য: আমি এখানেrestart-emacs উপলভ্য প্যাকেজে নিম্নলিখিতগুলি আবদ্ধ করেছি ।


খাঁটি এলিস্প ব্যবহার করে আপনি কী চান তা অর্জন করার জন্য এখানে বিকল্প উপায় রয়েছে (বাস্তবে আপনি শেলের উপর নির্ভর করছেন না)। কৌতুকটি হ'ল বর্তমান ইম্যাক্স মারা যাওয়ার ঠিক আগেই অন্য একটি ইম্যাকস প্রক্রিয়া বন্ধ করে দেওয়া।

(defun launch-separate-emacs-in-terminal ()
  (suspend-emacs "fg ; emacs -nw"))

(defun launch-separate-emacs-under-x ()
  (call-process "sh" nil nil nil "-c" "emacs &"))

(defun restart-emacs ()
  (interactive)
  ;; We need the new emacs to be spawned after all kill-emacs-hooks
  ;; have been processed and there is nothing interesting left
  (let ((kill-emacs-hook (append kill-emacs-hook (list (if (display-graphic-p)
                                                           #'launch-separate-emacs-under-x
                                                         #'launch-separate-emacs-in-terminal)))))
    (save-buffers-kill-emacs)))

ইমাসের একটি জিইউআই সংস্করণ শুরু করার কোডটি সোজা is টার্মিনালে ইমাস শুরু করার কোডটি কিছুটা জটিল। এটি এই সত্যটি ব্যবহার করে যে আপনি কোনও স্ট্রিং পাস করতে পারেন suspend-emacsযা প্যারেন্ট প্রসেসের (শেল) টার্মিনাল ইনপুট হিসাবে পাস হবে। ডকুমেন্টেশন থেকে

(স্থগিত-ইম্যাকস এবং alচ্ছিক স্টুফস্ট্রিং)

ইমাকগুলি বন্ধ করুন এবং উচ্চতর প্রক্রিয়াতে ফিরে যান। আপনি পরে আবার শুরু করতে পারেন। যদি 'স্থগিত করা যায় না' শূন্য থাকে, বা যদি সিস্টেমটি কাজের নিয়ন্ত্রণকে সমর্থন করে না, তবে পরিবর্তে সাবসেল চালান।

যদি alচ্ছিক আরগ স্টুফস্ট্রিং অ-শূন্য হয় তবে এর অক্ষরগুলি স্থগিতের পরে ইমাসের পিতামাতার দ্বারা টার্মিনাল ইনপুট হিসাবে পড়তে হবে।

সুতরাং আমরা মূলত ইমাসগুলি স্থগিত করার আগেই স্থগিত করে প্যারেন্ট শেলকে বর্তমানে স্থগিত ইম্যাকগুলি (যা শিগগিরই প্রস্থান হতে চলেছে) আবার শুরু করতে বলুন এবং তারপরে অন্য একটি ইম্যাকস প্রক্রিয়া চালু করুন। নোট করুন যে এটি এমন প্ল্যাটফর্মগুলিতে কাজ করে না যার উপর টার্মিনাল ইমাসগুলি স্থগিত করতে পারে না / তবে একটি সাবশেল শুরু করে, উদাহরণস্বরূপ উইন্ডোতে।


এটি আমার পক্ষে কাজ করে না: আমি যখন sh -c "emacs &"শেলটি থেকে চালিতাম তখন এটি " emacs: standard input is not a tty" দিয়ে থামে । (যখন আমি M-x restart-emacsএটির ত্রুটি বার্তাটিও দেখতে পাই না, ইমাকগুলি কেবল সমাপ্ত হয়))
কনস্টান্টাইন

এক্স এর অধীনে আমার জন্য কাজ করে a টার্মিনালে কাজ করবেন না কারণ এটি স্টিন এবং স্টাডাউটকে / dev / নাল; সাব-প্রসেসে পিতামাতার টিটিটি পাস করা সম্ভবত করণীয় তবে জটিল।
বেনি চেরনিয়াভস্কি-পাসকিন

1
এটি নিখুঁতভাবে কাজ করে এবং এটি আমাকে কিছুটা ভয় দেয়। কেন পৃথিবীতে ইমাক্সকে তার ধারণকৃত শেলটিতে আদেশ পাঠাতে দেওয়া হচ্ছে?
র‌্যাডন রোসবারো

আপনি কি কী-বাইন্ডিং ব্যবহার করেন?
slk500

32

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

উদাহরণস্বরূপ, এই শেল স্ক্রিপ্টটি ইমাসকে পুনরায় শুরু করে যদি এটি 123 কোড দিয়ে বেরিয়ে আসে।

#!/bin/sh
while emacs -nw "$@"; [ $? = 123 ]; do :; done

এরপরে, আমরা সংজ্ঞায়িত করি kill-emacs-and-restartযে স্ক্রিপ্ট দ্বারা স্বীকৃত যাদু সংখ্যার সমান প্রস্থান কোডটি দিয়ে ইমাসকে সমাপ্ত করে তোলে:

(defun kill-emacs-and-restart ()
  (interactive)
  (kill-emacs 123))

এখন আপনি যদি এই স্ক্রিপ্টের মাধ্যমে ইমাস চালান তবে আপনি পুনরায় শুরু করতে পারেন M-x kill-emacs-and-restart(বা এটি কোনও মূল অনুক্রমের সাথে আবদ্ধ)।


সমস্যাটি ঘিরে স্কার্টিংয়ের দুর্দান্ত উপায়! আপনি যদি আমাকে বলতে পারেন তবে আমি এটি গ্রহণ করব you cannot tell Emacs to re-start after terminating। এটি কি প্রযুক্তিগত সীমাবদ্ধতা?
পাইথননট

3
@ পাইথননট: যতদূর আমি জানি যে প্রক্রিয়াটি পুনরায় শুরু করার একমাত্র উপায় হ'ল exec...পরিবার থেকে কোনও কাজ (পসিক্স সিস্টেমে, যাইহোক) ব্যবহার করা। ইমাস লিস্প প্রক্রিয়া নিয়ন্ত্রণ ফাংশনগুলি এই জাতীয় নিম্ন স্তরের কলগুলি প্রকাশ করে না। যদিও আমি কোনও বিশেষজ্ঞ নই, তাই আশা করি আরও জ্ঞানবান কেউ
কনস্টান্টাইন

2

Blatantly থেকে চুরি https://unix.stackexchange.com/questions/114238/is-it-possibe-to-change-parent-shells-working-directory-programmatically

ধরে নেওয়া "স্ট্রিং এ এম্বেড করার জন্য আমার সিনট্যাক্সটি ঠিক আছে, এটি করা উচিত।

(defun restart-emacs ()
  (call-process "sh" nil nil nil "-c" "gdb -p $(ps h -o ppid -p $$) -ex 'call execl(\"/bin/sh\", \"/bin/sh\", \"-c\", \"exec emacs\")'"))

11
দয়া করে না। এটি ইমাসের সমস্ত অভ্যন্তরীণ পরিচ্ছন্নতাকে বাইপাস করে এবং বর্তমানের সমস্ত রাজ্য (যেমন পরিবর্তিত বাফারগুলি) নিশ্চিত না করেই বাতিল করে দেয় ।
লুনারিওর

Lunaryorn সতর্কতা সঠিক।
জোশুয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.