Как автоматически запустить подчиненный процесс при первой загрузке основного режима?


9

Допустим, мы работаем с Python (или Matlab) с компанией. Без низкоуровневых сообщений компании, которые

Completion needs an inferior Python process running

Тем не менее, очевидное решение для автоматического запуска низшего процесса

 (add-hook 'python-mode 'run-python)

будет запускать новый процесс Python каждый раз, когда я открываю .py файл (это становится дороже с Matlab)

Есть ли ловушка, которая запускается только при первом запуске основного режима? Или есть способ определить, запущен ли процесс на языке Python / Matlab? Или есть другой способ решить эту проблему - автоматически запустить подчиненный процесс в основном режиме, но только один раз?

Ответы:


14

К вашему сведению, некоторые режимы открывают только один низший процесс. Например, run-pythonоткроет подчиненный процесс, только если еще не запущен подчиненный процесс. То, что вы предложили, на run-pythonсамом деле делает то, что вы хотите.

Для других режимов (Matlab?) Вы можете использовать функцию, которая отсоединяет себя, например так:

(defun run-python-once ()
  (remove-hook 'python-mode-hook 'run-python-once)
  (run-python))

(add-hook 'python-mode-hook 'run-python-once)

Обратите внимание, что в Emacs 24.5 (и старше?) run-pythonПринимает обязательный CMDаргумент, поэтому решение будет:

(defun run-python-once ()
  (remove-hook 'python-mode-hook 'run-python-once)
  (run-python (python-shell-parse-command)))

(add-hook 'python-mode-hook 'run-python-once)

Похоже , что run-pythonфункция принимает требуемую ARG: (run-python CMD &optional DEDICATED SHOW). Он отлично работает в интерактивном режиме, но когда этот хук выполняется, я получаю сообщение Wrong number of argumentsоб ошибке.
gsingh2011

1
Спасибо, аргумент необязателен в Emacs 25, но не в 24.5. Я обновил ответ с исправленным решением для Emacs 24.5
bmag
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.