emacs, написание пользовательских команд, использующих term-mode

emacs, написание пользовательских команд, использующих term-mode

Я использую Emacs и M-xtermдля терминала. Так как мой типичный рабочий процесс выглядит так:

  • отредактируйте код
  • C-x oв буфер терминала (или C-x bterm[Enter]что-то еще)
  • нажмите Upклавишу, чтобы использовать последнюю команду
  • нажмите Enter, чтобы запустить его
  • C-x oвернуться назад

Я хочу связать все это (кроме первого шага... может быть) с одной командой. Я считаю, что Emacs достаточно хорош для этого :-)

Итак, команда должна:

  • перейти в буфер с терминалом (возможно, он вообще не должен менять окна, возможно, он должен разделить окно по вертикали (если оно еще не разделено) и использовать правую сторону)
  • выполнить последнюю команду, что было выполнено там
  • вернуться к последнему буферу/части экрана

Спасибо! Я не очень привык к системе скриптов Emacs, и я надеюсь, что кто-то мне поможет, а кто-то другой сможет использовать ответ для улучшения своего рабочего процесса, так как я считаю, что это довольно распространенная проблема.


Примеры команд:

python manage.py test
python manage.py test stats
python solve.py # for project-euler puzzles :-)

первый и второй иногда запускаются через ssh (в терминале) (мне нравится разрабатывать с помощью vagrant)

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

решение1

Быстро и грязно — определение макроса:

F3
C-x b term RET
UP RET
C-x b RET
F4

Теперь F4повторное нажатие повторит действия, которые вы сделали между последней парой F3/ F4. Вы можете сделать гораздо больше с макросами, включая наличие более одного макроса, редактирование макросов, сохранение макросов в .emacsи т. д. Для получения дополнительной информации см.EmacsWikiиРуководство по Emacs.

решение2

Не M-x compileпозволяет сделать что-то подобное? Позволяет ввести пользовательскую команду и запустить ее, а затем повторить это в следующий раз...

Ну, вероятно, возникнут проблемы с интерактивными командами (вот почему вы хотели бы использовать термин), а также, возможно, с постоянным многоразовым ssh-соединением (но TRAMP мог бы здесь помочь: cd REMOTELOCATION; your_cmdмог бы работать).

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

Связанный контент