оценка буфера в Python-режиме Emacs на удаленном хосте - PullRequest
5 голосов
/ 17 декабря 2010

Я использую emacs23 с tramp для модификации скриптов Python на удаленном хосте.Я обнаружил, что когда я запускаю оболочку python в emacs, она запускает python на удаленном хосте.

Моя проблема в том, что когда я пытаюсь вызвать python-send-buffer через Cc Cc, возникает ошибка

Traceback (последний вызов был последним): File "", строка 1, в?ImportError: Нет модуля с именем emacs

Traceback (последний вызов был последним): файл "", строка 1, в?NameError: имя 'emacs' не определено

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

Большое спасибо.

Редактировать: я последовал совету eichin и повторно внедрил python-отправка в регион.Смотрите мой ответ ниже.

Ответы [ 2 ]

3 голосов
/ 04 января 2011

В настоящее время я пытаюсь объединить мой незарегистрированный вопрос с этим аккаунтом, после чего я смогу принять ответ eichin и отредактировать свое сообщение, включив в него свое решение.

Я последовал предложению eichin и скопировал файлы emacs2.py emacs3.py и emacs.py на удаленный хост и добавил их каталог в PYTHONPATH в переменной tramp-remote-process-environment.

Затем я переопределил функцию python-send-buffer в моем .emacs

(require 'python)

(defun python-send-region (start end)
  "Send the region to the inferior Python process."

  (interactive "r")

  (let* ((loc_name)
     (f (if (file-remote-p default-directory)
        (let* ((con (tramp-dissect-file-name default-directory)))
          (setq loc_name (tramp-make-tramp-temp-file con))
          (concat "/"
              (tramp-file-name-method con) ":"
              (tramp-file-name-user con) "@"
              (tramp-file-name-host con) ":"
              loc_name
              ))
          (setq loc_name (make-temp-file "py"))))
     (command (format "emacs.eexecfile(%S)" loc_name))
     (orig-start (copy-marker start)))
    (save-excursion
      (let ((curbuf (current-buffer))
        (tempbuf (get-buffer-create "*python_temp*")))
    (set-buffer tempbuf)
    (delete-region (point-min) (point-max))
    (insert-buffer-substring curbuf start end)
    (python-mode)
    (when (save-excursion 
        (goto-char (point-min))
        (/= 0 (current-indentation)))
      (python-shift-left (point-min) (point-max)))
    (write-region nil nil f nil 'nomsg))

    (python-send-command command)
    (with-current-buffer (process-buffer (python-proc))
      ;; Tell compile.el to redirect error locations in file `f' to
      ;; positions past marker `orig-start'.  It has to be done *after*
      ;; `python-send-command''s call to `compilation-forget-errors'.
      (compilation-fake-loc orig-start f)))
))

Я по сути копирую регион в новый буфер, корректирую отступ, а затем записываю его во временный файл, созданный с помощью tramp-make-tramp-temp-file или make-temp-file, в зависимости от того, является ли посещаемый файл удаленный или локальный.

У меня были некоторые проблемы с tramp-handle-write-region, который, похоже, не принимал строку в качестве первого аргумента, поэтому я сначала сделал все форматирование в отдельном буфере.

Дайте мне знать, если все еще есть проблемы с кодом, но это моя первая попытка кодирования elisp, поэтому, пожалуйста, будьте осторожны.

2 голосов
/ 02 января 2011

Краткий ответ: не без написания недостающего кода elisp.

Длинная версия: В python.el, run-python добавляет data-directory (который на моем Ubuntu 10.10 поле /usr/share/emacs/23.1/etc/) к $PYTHONPATH, в частности, чтобы он мог найти emacs.py (как предоставлено местным Распределение emacs.) Затем он делает (python-send-string "import emacs") и ожидает, что он будет работать ...

Похоже, что defadvice оболочки, используемые tramp, на самом деле не передают PYTHONPATH, поэтому это не сработает, даже если у вас есть соответствующая версия emacs в удаленной системе.

Если вы M-x customize-variable RET tramp-remote-process-environment RET затем нажмите одну из кнопок INS и добавьте PYTHONPATH=/usr/share/emacs/23.1/etc, затем нажмите STATE и установите для нее значение «текущий сеанс» (просто для проверки или «сохранить для будущих сеансов», если он работает для вас), это почти работает - жалоба уходит, в любом случае, потому что удаленный питон теперь может найти удаленный emacs.py. Если вы теперь вернетесь к исходному вопросу, выполнив python-send-buffer, вы просто столкнетесь с другой ошибкой: No such file or directory: '/tmp/py24574XdA', потому что python-mode просто вставляет содержимое во временный файл и говорит подпроцессу python загрузить его.

Вам придется изменить python-send-region (другие функции вызывают его) и, в частности, способ, которым он использует make-temp-file, чтобы быть в курсе событий - есть даже tramp-make-tramp-temp-file, на который вы, вероятно, могли бы опираться. (Не забудьте опубликовать его, если вы делаете ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...