启用中的M-!进入M-&(相当于eash相当于bash Ctrl-Z)


14

有时我偶然会M-! some_command发现该命令的运行时间超出了我的预期,并使我的emacs冻结了很长时间。因此,我凝视着冰冻的emacs,踢自己不使用的东西,M-& some_command并保证自己M-&下次使用。但是M-!几十年来我一直在记忆中……当然还有Ctrl-G,但是在某些情况下,中断命令并重新运行它不是可取的(也许它可能会破坏某件事,也许重新运行会很昂贵……)。

Shell Konsole中的类似错误很容易纠正Ctrl-Zbg并且作业在后台运行。

emacs中是否存在类似的技巧-一种将当前正在运行的前台(同步)命令转换为后台(异步)命令的方法?

注意:如果无法使用default M-!,我可以提出有关如何重新绑定M-!到其他内容的建议(除此技巧外,在功能上是等效的)。


2
您可能想知道,只需&在常规shell-commandM-!)的末尾添加an 将使其异步。当然,您必须在运行命令之前执行此操作,但是至少可以使用相同的键绑定。
保姆

4
您总是可以重新映射M-!async-shell-command。:-)似乎您唯一失去的就是在回音区域足够短时获得输出。
glucas 2015年

1
@nanny,事实上,就是async-shell-command这样。它&COMMAND字符串的末尾添加一个并执行shell-command
Matthew Piziak

Answers:


2

emacs中是否存在类似的技巧-一种将当前正在运行的前台(同步)命令转换为后台(异步)命令的方法?

我怀疑没有这样的把戏。问题在于,同步shell命令(实际上是call-process-region)阻止了emacs事件循环。打破它的唯一方法是使用USR1或USR2信号或do终止进程C-g。(可能还有其他方法,但这就是我要做的)。

这意味着您无能为力,因为您没有办法调用该技巧,因为在事件循环停止期间Emacs不会处理输入。


可以做的一件事就是简单地交换密钥:

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

重新绑定M-!对async-shell-command的使用具有部分意义,但是:(1)我不确定M-1 M-!行为(命令输出到缓冲区)–简单快速的情况就可以了,但是如果命令比较慢并且我键入了sth怎么办?(2)在很多情况下,我喜欢冻结,直到命令完成的行为,因为它给出明确的完成指示(一些命令没有输出......),因此明确按键“把背景”会更好(3)异步叶的异步缓冲区必须被
收割

我在考虑是否可以编写一些围绕async-shell-command的包装器(一个会生成async-shell-command的函数,然后等待其完成,通过中止命令对Ctrl-G做出反应,并通过离开对其他按键进行响应它正在运行,但不再等待,然后收割 如果输出为空或短路,则在完成后 Async缓冲区)。我不确定该如何做……
Mekk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.