Отправить буфер emacs произвольному процессу Python
-
25-10-2019 - |
Вопрос
Мне нравится 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()
результата (или, может быть, фиксирует стандартный вывод / stderr, а может быть, и то, и другое).Модуль emacs просто отправляет текст в сокет, ожидает строку в ответ и отображает ее в буфере.
Звучит так просто, что нечто подобное уже должно существовать...IPython имеет ipy_vimserver
, но это неправильный путь.Существует также swank
, хотя это кажется очень специфичным для Lisp, есть серверная часть Javascript что очень похоже на то, чего я хочу...но поиск почти ничего не находит, кроме некоторых расплывчатых (возможно, правдивых) утверждений о том, что SLIME плохо работает с языками, отличными от Lisp
Короче говоря:
- Существует ли проект для отправки кода из буфера emacs в существующий процесс Python?
- Если нет, то как бы вы порекомендовали мне написать такую вещь (не будучи очень знакомым с elisp) - SWANK?Серверный код IPython?Простой TCP-сервер с нуля?
Решение
входящий предоставляет большую часть инфраструктуры для подобных вещей.Есть куча хороших примеров, таких как это или это
Это позволяет вам запустить команду, предоставляет следующие возможности comint-send-string
чтобы легко реализовать send-region
вводите команды.
dbr/remoterepl на Github это грубое доказательство концепции того, что я описал в вопросе.
В нем отсутствует какая-либо полировка, но в основном он работает - вы импортируете replify.py
модуль в целевом интерпретаторе, затем оцените emacs-remote-repl.el
после исправления дурацкого жестко закодированного пути к client.py
Другие советы
Не делает shell-command
дать вам то, что вы ищете?Вы могли бы написать сценарий-оболочку или настроить #!
и sys.path
соответствующим образом.