#shell #emacs #terminate
#оболочка #emacs #завершить
Вопрос:
Я много работаю в оболочке внутри emacs (на Mac). Раньше, когда я вводил control-Q control-C, это приводило к остановке процесса, запущенного в оболочке. Однако около года назад это перестало работать по какой-то причине; теперь это не имеет никакого эффекта. Кто-нибудь знает, почему, или другой способ сделать это?
Комментарии:
1. смотрите comint-mode-map (
C-h m
из оболочки), есть несколько команд для отправки сигналов, ноC-c C-c
(comint-interrupt-subjob
) обычно должна работать? Если процесс не реагирует на обычное прерывание, elisp функционируетkill-process
иinterrupt-process
менее снисходителен2. Спасибо за ваш ответ. К сожалению, C-c C-c не работает (это control-c дважды, верно?) Когда я набираю его, я просто вижу «C-c C-c», появляющийся на экране. Что касается «kill-process», я не знаю, как выполнить эту команду. «M-x kill-process» не работает. Спасибо за вашу помощь!
3. kill-process не является интерактивной функцией. Если C-c C-c не работает, вы можете завершить процесс из M-x process-list, за которым следует d для конкретного процесса
M-x proced
, а затем маркировка процессов дает вам больше контроля над отправкой определенных сигналов в подпроцессы4. Я думаю, вы имеете в виду
M-x list-processes
? (M-x process-list
похоже, не существует.) Это не показывает мой процесс. (Мой процесс — это всего лишь 3-строчный perl-скрипт с бесконечным циклом.) Также ps не показывает мой процесс. Если я делаю ps -e, я вижу это, а затем я могу его убить. Это заставляет меня думать, что процесс связан с другим пользователем (пользователь указан как ??) но я не знаю, как это изменить. Еще раз спасибо, эта помощь очень ценится!5. как упоминалось ранее,
proced
будет список подпроцессов.
Ответ №1:
У меня была такая же проблема с использованием term-mode
.
Я привязал term-interrupt-subjob
к своему выбору привязку клавиш с:
(add-hook 'term-mode-hook (lambda ()
(define-key term-raw-map (kbd "C-'") 'term-interrupt-subjob)
Я не уверен, какой режим вы используете для взаимодействия с оболочкой из Emacs (низшая оболочка, оболочка Emacs или эмулятор терминала). Поэтому вам, возможно, придется немного изменить это, заменив term-interrupt-subjob
, например, comint-interrupt-subjob
на и изменив хук режима.
Чтобы ответить на ваши вопросы в комментариях:
-
Вы добавляете функцию в свой файл .emacs. Чтобы он вступил в силу, вам необходимо оценить его: вы можете выбрать его и запустить
M-x eval-region
или перезапустить Emacs. -
Если вы работаете
M-x shell
, вы используетеshell-mode
.
Обратите внимание, что, чтобы узнать, какой основной режим вы используете, вы можете запустить describe-mode . -
Поскольку вы используете
shell-mode
, вы хотите использоватьadd-hook 'shell-mode-hook
вместоadd-hook 'term-mode-hook
иshell-mode-map
вместоterm-raw-map
.
Однако в shell-mode
, C-c C-c по умолчанию выполняет команду comint-interrupt-subjob
. Так что это должно работать из коробки, как сказал Роршах. Я не уверен, почему это не работает для вас.
Вы можете попробовать:
(add-hook 'shell-mode-hook (lambda ()
(define-key shell-mode-map (kbd "C-c C-c") 'comint-interrupt-subjob)
чтобы посмотреть, поможет ли это. Но это уже должно быть установлено, поскольку оно используется по умолчанию, поэтому действительно неясно, решит ли это вашу проблему.
Комментарии:
1. Большое вам спасибо за вашу помощь. Я не уверен, куда поместить
add-hook...
команду — в .emacs или .bash_profile? (Кажется, ни один из них не работает.) Чтобы ответить на ваш второй вопрос, я тоже не уверен, какой «режим» я использую. Я просто открываю окно терминала на Mac и набираю «emacs», а затем выполняюM-x shell
. Еще раз спасибо!2. Я нашел решение: использовать M-x eshell вместо M-x shell. Спасибо за вашу помощь!