Отправить буфер emacs в произвольный процесс Python

Мне нравится команда python-send-buffer, однако я очень часто использую Python, встроенный в приложения, или запускаю Python через пользовательскую систему управления пакетами (для запуска Python с определенными зависимостями). Другими словами, я не могу просто запустить «python» и получить полезный экземпляр Python (что-то, от чего зависит python-send-buffer)

Чего я хотел бы добиться, так это:

  • в любом интерпретаторе Python (или приложении, позволяющем оценивать код Python) импортируйте модуль magic_emacs_python_server.py (при необходимости добавляя к sys.path)
  • В emacs запустите magic-emacs-python-send-buffer

Это позволит оценить буфер в удаленном экземпляре Python.

Кажется, это должно быть довольно просто — модуль Python слушает сокет в потоке. Он оценивается в основном потоке и возвращает repr() результата (или, возможно, захватывает stdout/stderr, а может быть и то, и другое). Модуль emacs просто отправляет текст в сокет, ждет строку в ответ и отображает ее в буфере.

Звучит так просто, что-то вроде этого уже должно существовать... IPython имеет ipy_vimserver, но это не так. Существует также swank, хотя он кажется очень специфичным для Lisp, но есть бэкэнд Javascript, который выглядит очень нравится то, что я хочу... но поиск почти ничего не находит, кроме некоторых расплывчатых (возможно, истинных) заявлений о том, что SLIME плохо работает с языками, отличными от Лиспа

Короче:

  • Существует ли проект для отправки кода из буфера emacs в существующий процесс Python?
  • Если нет, то как бы вы порекомендовали мне написать такую ​​вещь (не очень хорошо знакомую с elisp) - SWANK? Код сервера IPython? Простой TCP-сервер с нуля?

person dbr    schedule 27.01.2011    source источник


Ответы (2)


comint предоставляет большую часть инфраструктуры для подобных вещей. Есть множество хороших примеров, таких как это или это

Он позволяет запускать команды, предоставляет вещи comint-send-string для простой реализации команд типа send-region.

dbr/remoterepl на Github — это грубое доказательство концепции того, что я описал в вопрос.

Ему не хватает какой-либо полировки, но в основном он работает — вы импортируете модуль replify.py в целевой интерпретатор, затем оцениваете emacs-remote-repl.el после исправления глупого жестко заданного пути к client.py.

person dbr    schedule 03.04.2012

Разве shell-command не дает вам то, что вы ищете? Вы можете написать сценарий-оболочку или соответствующим образом настроить #! и sys.path.

person matt harrison    schedule 27.01.2011
comment
Итак, используйте shell-command, чтобы получить содержимое буфера в скрипт? Это звучит как хорошая отправная точка, спасибо! - person dbr; 31.01.2011