Emacs lisp: возможно ли (с помощью lisp) запустить команду в eshell, работающем в другом буфере? - PullRequest
3 голосов
/ 23 ноября 2010

У меня запущен экземпляр eshell в одном буфере, и я пишу исходный код c ++ в другом. Я связал compile с <F5>, и мне интересно, можно ли запустить выходной файл (компиляции) в экземпляре eshell, запущенном в другом буфере?

Если нет, то, возможно, есть способ открыть eshell в новом фрейме и автоматически запустить в нем вывод компиляции?

Заранее большое спасибо.

Ответы [ 2 ]

5 голосов
/ 23 ноября 2010

Обычно, если вы хотите запустить что-то после завершения компиляции, вы добавляете это в команду компиляции.Например, вместо

M-x compile RET make RET

вы можете набрать

M-x compile RET make && ./test RET

или добавить программу к какой-то подходящей цели в вашем make-файле, чтобы вы могли сделать

M-x compile RET make test RET

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


Однако, если вы настаиваете на использовании eshell, вы можете использоватьcompilation-finish-functions:

Функции для вызова после завершения процесса компиляции.Каждая функция вызывается с двумя аргументами: буфером компиляции и строкой, описывающей, как завершился процесс.

Это не так хорошо задокументировано, но строка равна "finished\n", если процесс завершенуспешно.Таким образом, вы можете сделать что-то вроде этого:

(defun run-compilation-output-in-eshell (buf msg)
  "If compilation finished successfully, switch to eshell and execute a command."
  (when (string= msg "finished\n")
    (eshell)
    (goto-char (point-max))
    (eshell-kill-input)
    (insert "echo command goes here")
    (eshell-send-input)))

(add-hook 'compilation-finish-functions #'run-compilation-output-in-eshell)

Это выглядит довольно грубо, хотя: если вам случается вводить в буфер eshell по окончании компиляции, то это удаляет ваш ввод.Как я сказал выше, немного больше контекста может быть полезным.

2 голосов
/ 23 ноября 2010

Поскольку это Emacs, это возможно, но потребует некоторого взлома Elisp.

Тем временем я бы предложил пойти по простому маршруту, связав с F5 макрос, который будет выполнять следующее;при условии, что вы нажали F5 в буфере c ++:

  1. переключитесь в буфер eshell
  2. запустите команду компиляции для вашей программы
  3. переключитесь обратно в буфер c ++
...