सक्रिय एम-! M- & (a'ka emacs बराबर bash Ctrl-Z)


14

समय-समय पर मैं M-! some_commandसिर्फ यह पता लगाने के लिए होता हूं कि कमान मेरी अपेक्षा से अधिक समय तक चलती है और लंबे समय तक मेरे ईमेक को जमी रहती है। तो मैं अपने जमे हुए emacs पर शीशा लगाना और उपयोग नहीं करने के लिए खुद को लात मारता हूं M-& some_commandऔर M-&अगली बार उपयोग करने का वादा करता हूं । लेकिन M-!दशकों के लिए मेरी मांसपेशियों की स्मृति में है ... और निश्चित रूप से वहाँ है Ctrl-G, लेकिन ऐसे मामले हैं जब कमांड को तोड़ना और फिर से चलाना बेहतर नहीं होता है (इसे खोलना sth को तोड़ सकता है, रेंगना महंगा हो सकता है ...)।

शेल कोनोला में समान गलती सही करने के लिए तुच्छ है Ctrl-Z, bgऔर पृष्ठभूमि में नौकरी चल रही है।

क्या emacs में कुछ समान चाल मौजूद है - वर्तमान में चल रहे अग्रभूमि (सिंक्रोनस) कमांड को पृष्ठभूमि वाले (अतुल्यकालिक) में बदलने का एक तरीका?

नोट: यदि यह डिफ़ॉल्ट रूप से असंभव है M-!, तो मैं सुझाव दूंगा कि किस तरह से M-!किसी और चीज में सुधार किया जाए (इस ट्रिक के अलावा कार्यात्मक रूप से समकक्ष क्या होगा)।


2
आपको यह जानने में दिलचस्पी हो सकती है कि बस &एक नियमित shell-command( M-!) के अंत में जोड़ने से यह अतुल्यकालिक हो जाएगा। बेशक, आपको कमांड चलाने से पहले ऐसा करना चाहिए, लेकिन कम से कम आप एक ही कीबाइंडिंग का उपयोग कर सकते हैं।
नानी

4
आप हमेशा के लिए केवल रीमैप M-!कर सकते हैं async-shell-command। :-) ऐसा लगता है कि आपके द्वारा खोई जाने वाली एकमात्र चीज़ इको क्षेत्र में आउटपुट प्राप्त कर रही है जब यह काफी कम है।
ग्लूकोज

1
@ ज्ञान, वास्तव में, यह सब async-shell-commandकरता है। यह स्ट्रिंग &के अंत में एक जोड़ता है COMMANDऔर निष्पादित करता है shell-command
मैथ्यू Piziak

जवाबों:


2

क्या emacs में कुछ समान चाल मौजूद है - वर्तमान में चल रहे अग्रभूमि (सिंक्रोनस) कमांड को पृष्ठभूमि वाले (अतुल्यकालिक) में बदलने का एक तरीका?

मुझे लगता है कि ऐसी कोई चाल मौजूद नहीं है। समस्या यह है कि सिंक्रोनस शेल कमांड (जो वास्तव में है call-process-region) ईमैक ईवेंट लूप को ब्लॉक करता है। इसे तोड़ने का एकमात्र तरीका यूएसआर 1 या यूएसआर 2 सिग्नल या डू के साथ प्रक्रिया को मारना है C-g। (अन्य तरीके भी हो सकते हैं, लेकिन यही मैं करता हूं)।

इसका मतलब यह है कि आप कुछ भी नहीं कर सकते हैं क्योंकि आपके पास चाल को लागू करने का कोई तरीका नहीं है, क्योंकि ईमैक्स इनपुट को प्रोसेस नहीं करता है जबकि इवेंट लूप ठप है।


एक चीज जो आप कर सकते हैं, वह है बस चाबियाँ स्वैप करना:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)

रिबाइंडिंग M-! async- शेल-कमांड आंशिक समझ में आता है, लेकिन: (1) मुझे एम -1 एम के बारे में निश्चित नहीं है-! व्यवहार (बफर में कमांड आउटपुट) - सरल फास्ट केस काम करते हैं लेकिन क्या होगा यदि कमांड धीमी है और मैं sth टाइप करता हूं? (2) कई मामलों में मुझे फ्रीज पसंद है जब तक कि कमांड का व्यवहार समाप्त नहीं हो जाता है क्योंकि यह स्पष्ट फिनिश संकेत देता है (कुछ कमांड का कोई आउटपुट नहीं है ...), इसलिए स्पष्ट कीस्ट्रोके to पृष्ठभूमि में रखा गया है "अच्छा होगा (3) एसिंक्स उन एसेंशियल बफ़र्स को छोड़ देता है जो कि होना चाहिए फिर से होना
मेक जूल

मैं सोच रहा हूं कि क्या async-shell-command के आसपास कुछ आवरण लिखना संभव होगा (एक फ़ंक्शन जो async-shell-कमांड को स्पॉन करेगा, फिर उसके समाप्त होने की प्रतीक्षा करें, कमांड को रद्द करके Ctrl-G पर प्रतिक्रिया करें और छोड़ने के बाद कुछ अन्य कीस्ट्रोक पर जाएं यह चल रहा है लेकिन अब और इंतजार नहीं कर रहा है, और यदि उत्पादन खाली है या छोटा है तो एक बार Async बफर को रीप करें । मुझे यकीन नहीं है कि उस प्रतीक्षा वाले हिस्से को कैसे किया जाए ...
मेक जूल 28'15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.