рецепт для создания режима оболочки Emacs вокруг программы командной строки? - PullRequest
8 голосов
/ 25 декабря 2011

Я хочу поиграть и поэкспериментировать с рядом программных инструментов, каждый из которых будет иметь интерфейс командной строки. Некоторые из этих инструментов включают hbase, pig, erlang и prolog. Я хочу использовать emacs в качестве пользовательского интерфейса для этих инструментов так же, как я могу запустить оболочку python с M-x run-python или интерпретатор Lisp с режимом ielm.

Есть ли рецепт, которым я могу следовать, чтобы обернуть один из этих инструментов командной строки в режиме emacs? Я ищу что-то, что отобразит подсказку инструмента, позвольте мне искать в истории с помощью C-c C-n / C-p, передать текущий ввод в процесс инструмента, который я нажал Enter, и отобразить вывод инструмента.

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

1 Ответ

7 голосов
/ 25 декабря 2011

Недавно я создал «низший режим госу» для языка госу. На самом деле все оказалось довольно просто: я только что расширил comint - режим, на котором основаны и shell, и ielm. Вот важный фрагмент кода:

(require 'comint)
(defun inferior-gosu-mode ()
  (interactive)
  (comint-mode)
  (setq comint-prompt-regex inferior-gosu-prompt)
  (setq major-mode 'inferior-gosu-mode)
  (setq mode-name "Inferior Gosu")
  (setq mode-line-process '(":%s"))
  (use-local-map 'inferior-gosu-mode-map))

Бит use-local-map - это место, где вы определяете специальные привязки клавиш; У меня есть только копия привязки коминта:

(defvar inferior-gosu-mode-map nil)
(unless inferior-gosu-mode-map
  (setq inferior-gosu-mode-map (copy-keymap comint-mode-map)))

После этого у меня был простой код, который определял команду для запуска процесса, который открывал бы буфер *inferior-gosu*, если он существовал. Я также добавил немного кода в обычный режим gosu для открытия оболочки подчиненного gosu.

Вкратце: используйте comint.

Вот ссылка на весь код, но в этом нет ничего большего: https://github.com/TikhonJelvis/Gosu-Mode/blob/master/inferior-gosu-mode.el

Естественно, не стесняйтесь использовать этот код так, как вы хотите; Возможно, вы захотите взглянуть на обычный режим gosu, чтобы увидеть, как вы можете интегрировать свой erlang и пролог в соответствующие режимы редактирования языков.

...