2016-07-03 3 views
0

У меня есть elisp, который запускает внешнюю команду «npm».В emacs, какой лучший способ запустить внешнюю программу в другом окне, которая может быть закрыта одной ключевой командой после завершения выполнения программы?

(defun npm-mode-npm-run() 
    "Run the 'npm run' command on a project script." 
    (interactive) 
    (let ((command 
      (completing-read 
      "Run command: " (npm-mode--get-project-scripts)))) 
    (message "Running npm script: %s" command) 
    (switch-to-buffer npm-mode--buffer-name command) 
    (erase-buffer) 
    (ansi-term (getenv "SHELL") "npm-mode-npm-run") 
    (comint-send-string "*npm-mode-npm-run*" (format "npm run-script %s\n" command)))) 

В то время как он делает работу, по окончанию выполнения пользователя остается в буфере, который должен быть убит, и что требует дополнительного подтверждения, чтобы убить процесс.

Что бы я хотел - когда программа выйдет, я могу нажать клавишу «q», чтобы сделать все это, оставив пользователя в исходном буфере.

Является ли это хорошим примером того, как сделать это лучше всего для современных emacs, на которые я могу ссылаться, или любых других конкретных документов, которые могут быть полезны?

Большое спасибо заранее!

+0

Я не знаком с npm, но в целом, я бы попробовал 'compile', возможно, производную версию. Для довольно простого примера производного режима компиляции см. Https://github.com/PyCQA/pylint/blob/master/elisp/pylint.el. Кроме того, см. Http://stackoverflow.com/a/11059012/245173 для автоматического захоронения (или уничтожения) буфера компиляции, который был успешным. – jpkotta

ответ

0

Как сказал @jpkotta, компиляция является хорошим вариантом. Вы можете легко зарыть буфер, отправить сигнал TERM в базовый процесс и т. Д. Кроме того, вы получаете бесплатный анализ ошибок (синтаксическая раскраска + возможность перехода на оскорбительную строку) для многих языков.

Вот пример того, как я использую его (в этом случае, чтобы сделать быстрый запуск любого сценария я издаю):

(defun juanleon/execute-buffer() 
    (interactive) 
    (let ((compile-command nil)) 
    (compile buffer-file-name))) 

Легко изменить, чтобы адаптироваться к коду. let предназначен для того, чтобы не добавлять информацию к истории compile (так как я использую компиляцию для регулярной компиляции, и история полезна).

 Смежные вопросы

  • Нет связанных вопросов^_^