활성화 M-! M- &로 (Ctrl-Z를 강타하는 emacs)


14

때때로 나는 M-! some_command명령이 예상보다 오래 실행되고 emacs를 오랫동안 잠깐 동안 유지한다는 것을 알게되었습니다. 그래서 나는 얼어 붙은 이맥을 빙글 빙글 사용 M-& some_command하고 사용하지 않기 위해 스스로를 차고 M-&다음 에 사용할 것을 약속 합니다. 그러나 M-!수십 년 동안 내 근육 기억 속에있다… 물론 물론 Ctrl-G, 그러나 명령을 깨고 다시 실행하는 것이 바람직하지 않은 경우가있다 (아마도 sth를 깨뜨릴 수도 있고, 아마도 다시 실행하는 데 비용이 많이 든다).

쉘 konsole 바로 비슷한 실수를 해결하려면 사소한, Ctrl-Z, bg및 작업은 백그라운드에서 실행됩니다.

emacs에는 현재 실행중인 포 그라운드 (동기식) 명령을 백그라운드 화 된 (비동기식) 명령으로 바꾸는 방법이 있습니까?

참고 : 기본값으로 불가능한 경우 다른 M-!것으로 리 바인드하는 방법에 대한 제안에 개방적 M-!입니다 (이 트릭과 기능적으로 동등한 것).


2
&일반 shell-command( M-!) 끝에 단순히를 추가하면 비동기식이 된다는 것을 알고 싶을 것입니다. 물론 명령을 실행하기 전에이 작업을 수행해야하지만 최소한 동일한 키 바인딩을 사용할 수 있습니다.
nanny

4
언제든지에 다시 매핑 M-!할 수 async-shell-command있습니다. :-) 당신이 잃는 유일한 것은 에코 영역이 충분히 짧을 때 출력을 얻는 것입니다.
glucas

1
@nanny, 사실, 그게 다야 async-shell-command. 문자열 &끝에를 추가 COMMAND하고 실행 shell-command합니다.
Matthew Piziak

답변:


2

emacs에는 현재 실행중인 포 그라운드 (동기식) 명령을 백그라운드 화 된 (비동기식) 명령으로 바꾸는 방법이 있습니까?

나는 그러한 트릭이 존재하지 않는다고 생각합니다. 문제는 동기 쉘 명령 (실제로 call-process-region)이 emacs 이벤트 루프를 차단한다는 것입니다. 그것을 깨는 유일한 방법은 USR1 또는 USR2 신호로 프로세스를 종료하거나하는 것 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를 입력하면 어떻게됩니까? I 등 많은 경우에 (2) 명령이 완료 된 때까지 동결 동작은 좋네요 (3) 잎 비동기하는 것 "배경에 넣어"명확한 마무리 표시 (일부 명령은 ... 더 출력이 없습니다), 따라서 명시 적으로 키 제공으로 비동기 하는 필수 버퍼 거두어 라
Mekk

async-shell-command 주위의 일부 래퍼를 작성할 수 있는지 생각하고 있습니다 (async-shell-command를 생성 한 다음 종료 될 때까지 기다렸다가 명령을 중단하여 Ctrl-G에 반응하고 명령을 종료하여 다른 키 입력에 영향을 줄 수 있음) 실행 중이지만 더 이상 기다리지 않고 출력이 비어 있거나 짧은 경우 비동기 버퍼를 한 번 거두십시오 ). 그 대기 부분을 수행하는 방법을 잘 모르겠습니다…
Mekk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.