Menghidupkan M-! ke M- & (a'ka emacs equiv ke bash Ctrl-Z)

14

Dari waktu ke waktu saya kebetulan M-! some_commandhanya menemukan bahwa perintah berjalan lebih lama dari yang saya harapkan dan membuat emacs saya beku selama beberapa detik. Jadi saya membuat glasi pada emac saya yang beku dan menendang diri saya karena tidak menggunakan M-& some_commanddan berjanji pada diri sendiri untuk menggunakan M-&waktu berikutnya. Tapi M-!ada dalam ingatan otot saya selama beberapa dekade ... Dan tentu saja ada Ctrl-G, tetapi ada kasus ketika melanggar perintah dan menjalankannya kembali tidak disukai (mungkin itu dapat merusak sth, mungkin mungkin akan mahal untuk menjalankan kembali ...).

Kesalahan serupa di shell konsole sepele untuk dikoreksi Ctrl-Z,, bgdan pekerjaan berjalan di latar belakang.

Apakah ada beberapa trik serupa di emacs - cara untuk mengubah perintah foreground (sinkron) yang sedang berjalan menjadi yang terstandar (asinkron)?

Catatan: seandainya tidak mungkin untuk default M-! , saya terbuka untuk saran tentang bagaimana untuk mengubah M-!menjadi sesuatu yang lain (apa yang secara fungsional setara terlepas dari trik ini).

Mekk
sumber
2
Anda mungkin tertarik untuk mengetahui bahwa hanya menambahkan sebuah &ke akhir regular shell-command( M-!) akan menjadikannya tidak sinkron. Tentu saja, Anda harus melakukan ini sebelum menjalankan perintah, tetapi setidaknya Anda dapat menggunakan pengikat kunci yang sama.
pengasuh
4
Anda selalu bisa memetakan M-!ke async-shell-command. :-) Sepertinya satu-satunya hal yang Anda kehilangan adalah mendapatkan output di area gema ketika cukup pendek.
glucas
1
@nanny, sebenarnya, itu async-shell-commandsaja. Itu menambahkan sebuah &ke akhir COMMANDstring dan mengeksekusi shell-command.
Matius Piziak

Jawaban:

2

Apakah ada beberapa trik serupa di emacs - cara untuk mengubah perintah foreground (sinkron) yang sedang berjalan menjadi yang terstandar (asinkron)?

Saya curiga tidak ada trik seperti itu. Masalahnya adalah bahwa perintah shell sinkron (yang sebenarnya call-process-region) memblokir loop peristiwa emacs. Satu-satunya cara untuk memutusnya adalah dengan mematikan proses dengan sinyal USR1 atau USR2 atau lakukan C-g. (Mungkin ada cara lain, tapi itulah yang saya lakukan).

Ini berarti tidak ada yang dapat Anda lakukan karena Anda tidak memiliki cara untuk menjalankan trik, karena Emacs tidak memproses input saat loop acara terhenti.


Satu hal yang dapat Anda lakukan hanyalah menukar kunci:

(global-set-key (kbd "M-!") #'async-shell-command)
(global-set-key (kbd "M-&") #'shell-command)
PythonNut
sumber
Rebinding M-! untuk async-shell-command masuk akal sebagian, tetapi: (1) Saya tidak yakin tentang M-1 M-! perilaku (perintah output ke buffer) - kasus cepat sederhana bekerja tetapi bagaimana jika perintahnya lebih lambat dan saya mengetik sth? (2) dalam banyak kasus saya suka pembekuan sampai perintah selesai perilaku karena memberikan indikasi selesai jelas (beberapa perintah tidak memiliki output ...), oleh karena itu keystroke eksplisit "diletakkan ke latar belakang" akan lebih baik (3) async meninggalkan buffer Async yang harus dituai
Mekk
Saya berpikir apakah beberapa wrapper di sekitar async-shell-command akan dimungkinkan untuk ditulis (sebuah fungsi yang akan menelurkan async-shell-command, kemudian menunggu selesai, bereaksi terhadap Ctrl-G dengan membatalkan perintah dan keystroke lain dengan meninggalkan itu berjalan tetapi tidak menunggu lagi, dan menuai buffer Async sekali dilakukan jika output kosong atau pendek). Saya tidak yakin bagaimana melakukan bagian tunggu itu ...
Mekk