1

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の専門家ではないので、これに関する助けがあれば大歓迎です。

私が再現できる症状の 1 つを次に示します。^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 (バッファーの評価) と入力します。出力は次のとおりです。

(... 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]: 

変ですよね?長いファイルの場合、事態はさらに悪化します。アクティブな領域が 1 行の場合でも、空白の "In [X]:" 行が 15 行以上表示されることがよくあります。

4

1 に答える 1

3

^C^R (eval region) コマンドは、インタプリタから多くの空白の "In [X]:" を生成する場合があります。

これが私が問題について理解できたことです。あなたが見ているのは、コードがどのように評価されるかの副作用ですcomint-mode(これは、python-mode の repl が書かれている一般的なモードです)。

基本的には、選択した文字列をそのまま(改行などを含めて)下位プロセスに送信し、下位プロセスからの出力を受け取り、emacs comint バッファー(emacs で開いた repl)に出力します。パイソンコード

spam = "spam "
spam = spam + spam
spam = spam + spam

出力を生成しないため、空白の "In [X]:" 行が表示されます。

これで問題ありません。しかし、最後の行の print spam を強調表示してから、^C^R と入力します。出力:

実行後C-cC-r、python repl に切り替えて を押すenterと、実際に出力が印刷されます。私が推測する問題は、python-mode がnewlineコマンド インタープリターに送信される文字列に最終的なもの (評価をトリガーするもの) を追加していないことです。python-shell-send-stringこの問題を の関数にたどることができましたpython.el(doC-h fpython-shell-send-stringRETを実行すると、ヘルプ バッファに へのリンクが表示さpython.elれます。それをクリックすると、emacs で関数の定義が表示されます)。関数の終わりに向かって、これらの行があります

(when (or (not (string-match "\n$" string))
                (string-match "\n[ \t].*\n?$" string))
        (comint-send-string process "\n"))

これは、送信されたばかりの文字列に final があるかどうかをチェックするようです。そうnewlineでない場合は、明示的に を送信しますnewline。このチェックは単一行の文字列に対して失敗し、python モードは最後の改行を挿入しません。これはバグのようです。これは emacs トランクで修正されている可能性があります。確認する必要があります。

アップデート

これが emacs トランクで修正されていることを確認できます。実際、ご報告いただいた問題は両方とも修正されています。

アップデート

現在非推奨となっているpython.el のgithub リポジトリには、ライブラリの最新バージョンを取得するための手順が記載されています。

1) こちらのURLから最新版をダウンロード

python.el2) init ファイルに次のようなものを追加して、ダウンロードしたディレクトリをロード パスに追加します。

(add-to-list 'load-path "<name_of_the_directory>")

3) 最後に python-mode を要求する

(require 'python)
于 2014-02-23T18:02:08.647 に答える