2010-12-16 15 views
5

Używam emacs23 z trampem do modyfikowania skryptów Pythona na zdalnym hoście. Znalazłem, że po uruchomieniu powłoki python w emacs uruchamia się pyton na zdalnym hoście.Ocena bufora w trybie pytona emacs na zdalnym hoście

Moim problemem jest to, że kiedy spróbuj zadzwonić python-send-bufora za pomocą Cc Cc chodzi się z błędem

Traceback (most recent call last): File "", line 1, in ? ImportError: No module named emacs

Traceback (most recent call last): File "", line 1, in ? NameError: name 'emacs' is not defined

Teraz muszę przyznać, że ja naprawdę nie wiem, co się dzieje tutaj. Czy istnieje sposób, aby skonfigurować emacs, aby móc ocenić bufor na zdalnym hoście?

Wielkie dzięki.

Edytuj: Podążałem za radami eichin i ponownie zaimplementowałem python-send-region. Zobacz moją odpowiedź poniżej.

Odpowiedz

2

Krótka odpowiedź: nie bez napisania brakującego kodu elizującego.

Długa wersja: W python.el, run-python dodaje data-directory (co na moim Ubuntu 10.10 pudełka jest /usr/share/emacs/23.1/etc/) do $PYTHONPATH, specjalnie tak, że można go znaleźć emacs.py (jak dostarczany przez lokalnej dystrybucji Emacsa.) Potem robi (python-send-string "import emacs") i oczekuje go do pracy ...

wygląda jak defadvice owijarki że tramp zastosowania w rzeczywistości nie przechodzą PYTHONPATH, więc to nie działa, nawet jeśli masz wersję pasujące emacs na zdalnym systemie.

Jeśli M-x customize-variable RET tramp-remote-process-environment RET następnie uderzył jednego z przycisków INS i dodać PYTHONPATH=/usr/share/emacs/23.1/etc następnie uderzył STATE i ustawić ją na „Bieżąca sesja” (tak go przetestować, czy „zaoszczędzić na przyszłych sesjach” czy to działa dla ciebie) to prawie działa - skarga zniknie, w każdym razie, ponieważ zdalny python może teraz znaleźć zdalnego emacs.py. Jeśli powrócisz do pierwotnego pytania, robiąc python-send-buffer, po prostu napotkasz inny błąd: No such file or directory: '/tmp/py24574XdA', ponieważ python-mode po prostu umieszcza zawartość w pliku tymczasowym i przekazuje podprocesor Pythona do załadowania tego.

Musiałbyś zmienić python-send-region (inne funkcje to nazywają), a szczególnie sposób, w jaki używa make-temp-file, aby być świadomym trampów - jest nawet tramp-make-tramp-temp-file, na którym możesz prawdopodobnie polegać. (Pamiętaj, aby opublikować, jeśli to zrobisz ...)

+0

Wielkie dzięki. Poniżej zamieściłem moją implementację Pythona-Send-Region i wygląda na to, że działa. – Adrian

+0

Jakieś słowo, jeśli zostało to naprawione w ciągu ostatnich 4 lat? Byłoby świetnie, gdyby zaktualizowana odpowiedź brzmiała "teraz po prostu działa". –

3

Próbuję obecnie połączyć moje niezarejestrowane pytanie z tym kontem, po czym będę mógł zaakceptować odpowiedź eichin i edytować mój wpis, aby dołączyć moje rozwiązanie.

Podążyłem za sugestią eichin i skopiowałem pliki emacs2.py emacs3.py i emacs.py do zdalnego hosta i dodałem ich katalog do PYTHONPATH w zmiennej tramp-remote-process-environment.

Następnie przepisany funkcji python-send-bufora w moim .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))) 
)) 

I zasadniczo skopiować obszar do nowego bufora dostosować wcięcia, a następnie zapisać go do pliku tymczasowego, stworzony z tramp -make-tramp-temp-plik lub make-temp-plik, w zależności od tego, czy odwiedzany plik jest zdalny czy lokalny.

Miałem pewne problemy z regionem obsługi uchwytu-uchwytu, który prawdopodobnie nie akceptował ciągu jako pierwszego argumentu, dlatego najpierw zrobiłem całe formatowanie w osobnym buforze.

Daj mi znać, czy są jeszcze jakieś problemy z kodem, ale to moja pierwsza próba w elisp kodowania, więc proszę być łagodne.

+0

Próbowałem powyższego i otrzymałem następujący błąd: "ad-Orig-error: Invalid file-name". Jakieś wskazówki? –

Powiązane problemy