2008-12-12 97 views
29

我最近嘗試從使用python-mode.el切換到python.el來編輯emacs中的python文件,發現這個體驗有點陌生並且沒有任何效果,並且急躁起來。我一直在使用python-mode.el來做類似十年的事情,所以也許我對自己的方式有所瞭解。我有興趣聽到任何仔細評估這兩種模式的人的意見,特別是他們感知每種模式的優點和缺點,以及他們的工作如何與python.el特有的功能進行交互。從python-mode.el切換到python.el

兩個主要有python.el對我來說問題是

  1. 每個緩衝區訪問Python文件都有自己的劣勢交互式Python外殼。我習慣於在一個交互式shell中進行開發並在python文件之間共享數據。 (從軟件工程學的角度看,這似乎是不好的做法,但我通常使用大量數據集,需要一段時間才能加載到內存中。)

  2. python.el中的骨架模式支持,免費(python的語法使得這種自動化不必要)和設計得很差(例如,它不知道「for」循環生成器表達式或「<expr 1> if <cond> else <expr 2>」表達式,所以你必須回去並刪除它在堅持你之後插入的冒號輸入minibuffer中的表達式子句。)我無法弄清楚如何關閉它。有一個python.el變量聲稱控制這個,但它似乎沒有工作。這可能是因爲我使用的python.el版本被破解(它來自debian emacs-snapshot軟件包),所以如果有人知道它的最新版本,我想聽聽它。 (我在大約兩週前與CVS emacs中的版本有同樣的問題。)

+5

你不說你爲什麼試圖切換到python.el。這有什麼好處? – ShreevatsaR 2008-12-12 14:04:51

回答

1

python-mode.el由Python社區編寫。 python.el是由emacs社區編寫的。只要我記得,我已經使用了python-mode.el,python.el甚至沒有接近python-mode.el的標準。我相信Python社區比Emacs社區更能提出一個體面的模式文件。只要堅持python-mode.el,是不是有一個真正的原因?

+17

感謝您的意見,但它相當專制。我在實際的層面上尋找軟件包功能的比較。我不關心作者的認知證書。 – 2008-12-12 12:31:08

4

對於什麼是值得的,我沒有看到你在#1問題中看到的行爲,「每個訪問python文件的緩衝區都有它自己的劣質交互式python shell。」

這是我從Emacs 22.2使用python.el所做的。

CX比照foo.py改爲 [插入:打印爲 「foo」]

CX比照bar.py [插入:打印 「酒吧」]

抄送鋯石[*的Python *緩衝器出現]

CXö

抄送氯RET [ 「BAR」 被印刷在*的Python *]

CX b foo.py RET

C-C C-L RET [ 「foo」 被印刷在同一*的Python *緩衝器]

因此這兩個文件都共享同一個劣蟒殼。也許在python模式的個人定製和python.el的默認行爲之間有一些無法預料的相互作用。你有沒有嘗試過使用Python。沒有你的.emacs自定義,並檢查它是否行爲相同的方式?

python.el在Python模式中的主要特性是符號完成函數python-complete-symbol。您可以添加這樣的事情

(define-key inferior-python-mode-map "\C-c\t" 'python-complete-symbol) 

然後鍵入

>>> import os 
>>> os.f[C-c TAB] 

,你會得到一個*完井*緩衝區包含

Click <mouse-2> on a completion to select it. 
In this buffer, type RET to select the completion near point. 

Possible completions are: 
os.fchdir       os.fdatasync 
os.fdopen       os.fork 
os.forkpty       os.fpathconf 
os.fstat       os.fstatvfs 
os.fsync       os.ftruncate 

它會在.py文件緩衝區工作了。

+3

從Ubuntu 8.04(Emacs 23)的emacs-snapshot軟件包中使用python.el,我似乎沒有python-complete-symbol功能。 – 2009-06-17 18:42:13

+1

此答案中的信息現在已過時Emacs 24.1.50。上面的defun已經被刪除,並由`python-completion-complete-at-point`和其他完成機制取代。我不清楚這些是如何工作的,否則我會編輯答案。 – suvayu 2012-07-01 12:02:42

1

python-mode.el不支持三引號字符串,所以如果你的程序包含很長的docstrings,所有的語法着色(和相關的syntaxic功能)往往會分解。

我0.02

3
  1. 我不能重現上的Emacs v23.1這種行爲,這一定是從那以後改變了。

  2. 忘掉任何模式的骨架支持,並使用超高級和可擴展的yasnippet代替它,這真的值得一試!

2

注意幾乎所有在這裏說的東西都是過時的,而事情發生了變化。

python-mode.el命令前綴基本上是「py-」,你應該可以使用來自兩者的命令,而不管哪一個先被加載。

python-mode.el不會卸載python.el;除了重新定義的python-mode-map之外。

差異是在顯示的菜單和鍵盤設置中,但最後一個加載將確定。