เปิดใช้งาน M-! เป็น M- & (a'ka emacs equiv เพื่อ bash Ctrl-Z)


14

บางครั้งฉันM-! some_commandก็พบว่าคำสั่งทำงานนานกว่าที่ฉันคาดไว้และทำให้ emacs ของฉันหยุดนิ่งเป็นเวลานาน ดังนั้นฉันจึงเคลือบที่ emacs ที่แช่แข็งของฉันและเตะตัวเองเพื่อไม่ใช้M-& some_commandและสัญญากับตัวเองว่าจะใช้M-&ในครั้งต่อไป แต่M-!อยู่ในความทรงจำของกล้ามเนื้อมานานหลายสิบปี…และแน่นอนมีCtrl-Gแต่มีบางกรณีที่การสั่งการและสั่งการซ้ำอีกครั้งมันไม่ได้ดีกว่า (อาจเป็นไปได้ที่จะทำลายฏ

ความผิดพลาดที่คล้ายกันในเปลือก konsole เป็นเล็กน้อยเพื่อแก้ไขCtrl-Z, bgและงานที่จะทำงานในพื้นหลัง

มีเคล็ดลับที่คล้ายกันใน emacs หรือไม่ - วิธีเปลี่ยนคำสั่งเบื้องหน้า (ซิงโครนัส) ที่ทำงานอยู่ในขณะนี้ให้เป็นแบ็คกราวน์ (แบบอะซิงโครนัส) หรือไม่?

หมายเหตุ: ในกรณีที่เป็นไปไม่ได้สำหรับการเริ่มต้น M-!ฉันเปิดให้คำแนะนำวิธีการ rebind M-!เป็นอย่างอื่น (สิ่งที่จะเป็นหน้าที่เทียบเท่านอกเหนือจากเคล็ดลับนี้)


2
คุณอาจสนใจที่จะรู้ว่าการเพิ่ม&ส่วนท้ายไปยังส่วนท้ายshell-command( M-!) แบบปกติจะทำให้มันไม่ตรงกัน แน่นอนคุณต้องทำสิ่งนี้ก่อนที่จะเรียกใช้คำสั่ง แต่อย่างน้อยคุณสามารถใช้การเชื่อมโยงคีย์เดียวกันได้
พี่เลี้ยง

4
คุณสามารถเสมอเพียงแมปไปM-! async-shell-command:-) ดูเหมือนว่าสิ่งเดียวที่คุณสูญเสียคือการได้รับผลลัพธ์ในพื้นที่เสียงก้องเมื่อมันสั้นพอ
ลูกัส

1
@ พี่เลี้ยงอันที่จริงนั่นคือทั้งหมดที่async-shell-commandทำ มันเพิ่ม&ไปยังจุดสิ้นสุดของสตริงและดำเนินการCOMMAND shell-command
Matthew Piziak

คำตอบ:


2

มีเคล็ดลับที่คล้ายกันใน emacs หรือไม่ - วิธีเปลี่ยนคำสั่งเบื้องหน้า (ซิงโครนัส) ที่ทำงานอยู่ในขณะนี้ให้เป็นแบ็คกราวน์ (แบบอะซิงโครนัส) หรือไม่?

ฉันสงสัยว่าไม่มีกลอุบายดังกล่าวอยู่ ปัญหาคือคำสั่งเชลล์แบบซิงโครนัส (ซึ่งจริงๆแล้วcall-process-region) บล็อกลูปเหตุการณ์ emacs วิธีเดียวที่จะทำลายมันคือการฆ่ากระบวนการที่มีสัญญาณ USR1 หรือ USR2 C-gหรือทำ (อาจมีวิธีอื่น แต่นั่นคือสิ่งที่ฉันทำ)

ซึ่งหมายความว่าไม่มีอะไรที่คุณสามารถทำได้เพราะคุณไม่มีวิธีที่จะเรียกใช้กลอุบายเนื่องจาก Emac ไม่ได้ประมวลผลอินพุตขณะที่ลูปเหตุการณ์หยุดทำงาน


สิ่งหนึ่งที่คุณสามารถทำได้คือเพียงสลับกุญแจ:

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

การปฏิเสธ M-! เป็น async-shell-command ทำให้รู้สึกบางส่วน แต่: (1) ฉันไม่แน่ใจเกี่ยวกับ M-1 M-! behavior (เอาต์พุตคำสั่งเป็นบัฟเฟอร์) - กรณีรวดเร็วง่าย ๆ ใช้งานได้ แต่ถ้าคำสั่งช้าลงและฉันพิมพ์ sth? (2) ในหลาย ๆ กรณีฉันชอบการหยุดจนกว่าคำสั่งจะเสร็จสิ้นพฤติกรรมเนื่องจากมีการบ่งชี้การเสร็จสิ้นที่ชัดเจน (บางคำสั่งไม่มีเอาต์พุต…) ดังนั้นการกดแป้นพิมพ์ที่ชัดเจน“ วางไว้ที่พื้นหลัง” จะดีกว่า (3) async ออกจากบัฟเฟอร์Asyncได้รับการเก็บเกี่ยว
Mekk

ฉันคิดว่าผู้ห่อหุ้มรอบ ๆ async-shell-command จะเป็นไปได้ที่จะเขียน (ฟังก์ชั่นที่จะวางไข่ async-shell-command แล้วรอให้มันเสร็จแล้วตอบสนองต่อ Ctrl-G โดยยกเลิกคำสั่งและกดแป้นพิมพ์อื่น ๆ โดยออกจาก มันกำลังทำงาน แต่ไม่ต้องรออีกต่อไปและทำการซิงค์บัฟเฟอร์Asyncอีกครั้งหากเอาต์พุตว่างเปล่าหรือสั้น) ฉันไม่แน่ใจว่าจะทำเช่นนั้นได้อย่างไรส่วนที่รอ ...
Mekk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.