2009-02-01 2 views
17

Я использую Emacs для написания кода Python 2. Теперь у меня есть оба Python 2.6 и 3.0, установленные в моей системе, и мне также нужно написать код Python 3.Оба Python 2 и 3 в Emacs

Вот как различные версии настроены в/USR/BIN:

python -> python2.6* 
python2 -> python2.6* 
python2.6* 

python3 -> python3.0* 
python3.0* 

Есть ли способ, чтобы установить это так, что Emacs использует правильную версию Python, в зависимости от того, какой язык я с помощью? Например, C-c C-c в настоящее время запускает буфер, но он всегда вызывает python2.6, даже если я пишу код Python 3.

+1

Вы задаетесь вопросом, как получить Emacs для автоматического обнаружения ли вы пишете Python 2 кода или Python 3 кода, и назвать правильную версию Python? Или вы спрашиваете, как сменить Emacs так, чтобы он вызывал другую команду (т.е. python3) во всех случаях, когда код Python загружается в буфер? –

+0

Очевидно, что первый был бы идеальным, но это кажется довольно сложным, так как синтаксические различия между Python 2 и Python 3 незначительны. Похоже, что ответы на этот вопрос позаботятся о втором случае. Спасибо за разъяснения. – 2009-02-03 22:48:36

ответ

4

Ответ да. Если вы можете отличить Python 2 от Python 3, то это простая задача программирования, чтобы заставить emacs делать то, что вы хотите.

(define run-python (&optional buffer) 
    (with-current-buffer (or buffer (current-buffer)) 
     (if (is-python3-p) 
       (run-python3) 
      (run-python2)))) 

(define-key python-mode-map (kbd "C-c C-c") #'run-python) 

Все, что осталось сделать, это реализовать is-python3-p и run-python3 (и т.д.)

10

Если вы используете питона-mode.el вы можете попытаться изменить py-which-shell. Для того, чтобы сделать это на основе каждого файла, который вы можете поместить

# -*- py-which-shell: "python3"; -*- 

в первой строке файла - или на второй линии, если первая строка начинается с #!. Другой выбор поставить

# Local Variables: 
# py-which-shell: "python3" 
# End: 

в конце файла. Возможно, вы должны дать полный путь к python3, а не просто «python3».

+0

Локальная переменная файла не работает для меня. Кажется, команда py-python должна быть установлена ​​с использованием setq в dotemacs для вступления в силу. Я уточню в своем другом ответе на исходный вопрос. – Yoo

+0

Я предложил установить команду py-python, но python-mode.el использует внутренне py-which-shell и устанавливает py-which-shell в значение py-python-command * before *, он видит локально-локальное значение. Я отредактировал ответ, чтобы предложить напрямую изменить py-which-shell. – cefstat

+0

Я подозреваю, что это было бы более полезно для 'C-h i g (emacs) Переменные каталога', чем для' (emacs). Переменные файла. – phils

3

Мой комментарий к this answer.

Я написал /t/min.py, который будет прекрасно работать в Python3, но не в python2 (словарь понимание работы в Python3)

Содержание /t/min.py

#!/usr/bin/python3 
# -*- py-python-command: "/usr/bin/python3"; -*- 
a = {i:i**2 for i in range(10)} 
print(a) 

Обратите внимание, что shebang указывает на python3 и локальную переменную py-python файла.

Я также написал /t/min-py.el, который гарантирует, что вместо python.el используется python-mode.el (ver 5.1.0).

Содержание /t/min-py.el

(add-to-list 'load-path "~/m/em/lisp/") 
(autoload 'python-mode "python-mode" "Python Mode." t) 
;; (setq py-python-command "python3") 

Обратите внимание, что последняя строка является комментарием.

Я начинаю Emacs с помощью следующей команды:

emacs -Q -l /t/min-py.el /t/min.py & 

Теперь Emacs запускается с моим альтернативным dotemacs /t/min-py.el, и это открывает /t/min.py.

Когда я нажимаю C-c C-c для отправки буфера на python, он говорит, что часть «for» неверна и указывает, что вместо python3 используется python2. Когда я нажимаю C-c! для запуска интерпретатора python, он говорит, что запускается python 2.5.

Я могу изменить вторую строку/т/мин.py к этому:

# -*- py-python-command: "chunkybacon"; -*- 

и повторите этот эксперимент, и emacs по-прежнему использует python2.

Если последняя строка /t/min-py.el не закомментирована, то C-c C-c и C-c! оба используют python3.

+0

Кажется, что ваши локальные переменные не оцениваются. Вы видите сообщение, запрашивающее подтверждение перед оценкой? в противном случае, что такое значение «enable-local-variables», если это не 't', ваши локальные переменные игнорируются! – marcz

2

относительно комментария jrockway в:

(defun is-python3-p() "Check whether we're running python 2 or 3." 
    (setq mystr (first (split-string (buffer-string) "\n" t))) 
    (with-temp-buffer 
    (insert mystr) 
    (goto-char 0) 
    (search-forward "python3" nil t))) 
(defun run-python() "Call the python interpreter." 
    (interactive) 
    (if (is-python3-p) 
     (setq py-python-command "/usr/bin/python3") 
    (setq py-python-command "/usr/bin/python")) 
    (py-execute-buffer)) 

Это будет вызывать python3 если "python3" находится в верхней строке буфера (хижину, как правило). По какой-то причине (setq py-pyton-command ...) не позволяет изменять версии после того, как вы запустили py-execute-buffer один раз. Это не должно быть проблемой, если вы не измените свой файл в том же буфере взад и вперед.

1

С текущими python-mode.el shebang имеет честь.

Интерактивные открыть оболочку Python, только с

M-x pythonVERSION  
M-x python 

будет вызывать установленный по умолчанию.

http://launchpad.net/python-mode