Как завершить процесс внутри оболочки в emacs?

#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. Спасибо за вашу помощь!