Отправить буфер emacs произвольному процессу Python - PullRequest
4 голосов
/ 27 января 2011

Мне нравится команда 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 плохо работает с не-Lisp языками

Короче говоря:

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

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

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

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

1 голос
/ 27 января 2011

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

...