[英]Eval region ipython interpreter in aquamacs
我正在努力使Aquamacs 3.0a GNU Emacs 24.3.50.2與iPython 1.2.0一起使用作為解釋器。 我能夠使用python.el中的指令使iPython基本上正常工作。 特別是,我加入最多的回答給出的設置, 這里給我的.emacs文件,但我仍然能看到一些奇怪的行為。
注意:我的.emacs文件中的設置顯然適用於iPython 0.11,而不是1.2.0,這可能是問題的根源。 我不是一個lisp專家,所以對此有任何幫助將不勝感激。
這是我能夠重現的一個症狀:^ C ^ R(eval region)命令可能會生成大量空白“In [X]:”從解釋器。 為了重現aquamacs中的問題,我創建了一個名為test.py
的文件,並將以下代碼放入其中:
spam = "spam "
spam = spam + spam
spam = spam + spam
print spam
然后我鍵入^ C ^ P(啟動解釋器),返回test.py
緩沖區,然后鍵入^ C ^ C(eval buffer)。 輸出是:
(... iPython startup message ...)
In [1]:
In [2]:
In [3]:
In [4]: spam spam spam spam
In [5]:
這一切都很好。 但后來我突出顯示最后一行print spam
,然后輸入^ C ^ R. 輸出:
In [5]:
In [5]:
In [5]:
奇怪,不是嗎? 對於較長的文件,情況變得更糟。 即使活動區域是一行,我經常會看到15個空白“In [X]:”行或更多行。
^ C ^ R(eval region)命令可以從解釋器生成大量空白“In [X]:”。
以下是我能夠理解的問題。 您所看到的是如何在comint-mode
評估代碼的comint-mode
(這是一種基於python-mode的repl編寫的通用模式)。
基本上它將您選擇的字符串發送到下級進程(包括換行符等),然后它接收來自下級進程的輸出並將其打印在emacs comint緩沖區(您在emacs中打開的repl)中。 python代碼
spam = "spam "
spam = spam + spam
spam = spam + spam
不要產生任何輸出,這就是為什么你看到空白的“In [X]:”行。
這一切都很好。 但后來我突出顯示最后一行打印垃圾郵件,然后輸入^ C ^ R. 輸出:
做Cc Cr后 ,如果你切換到python repl並按回車鍵,你實際上會打印輸出。 我猜的問題是python-mode不是將最終newline
(觸發評估)添加到發送給命令解釋器的字符串。 我能夠將這個問題跟蹤到python.el
的函數python-shell-send-string
(執行Ch f python-shell-send-string
RET ,你會看到幫助緩沖區中python.el
的鏈接,點擊它和emacs將帶您定義功能)。 在功能的最后,我們有這些線
(when (or (not (string-match "\n$" string))
(string-match "\n[ \t].*\n?$" string))
(comint-send-string process "\n"))
看來這會檢查剛發送的字符串是否有最終newline
,如果沒有顯式發送newline
,則單行字符串檢查失敗,python模式永遠不會插入最后一個換行符。 這似乎是一個bug,也許這是固定在emacs trunk需要檢查。
UPDATE
我可以確認這已在emacs主干中修復。 實際上,您報告的兩個問題都已修復。
UPDATE
python.el的github存儲庫現已棄用,它具有獲取最新版本庫的說明。
1)從此網址下載最新版本
2)通過向init文件添加類似的內容,將已下載python.el
的目錄添加到加載路徑中
(add-to-list 'load-path "<name_of_the_directory>")
3)最后需要python-mode
(require 'python)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.