我在OS X(El Capitan)上使用Python劣质shell,每次我向Python进程发送一段代码(使用C-c C-r
它都绑定python-shell-send-region
)我在Python shell中得到这样的消息:
>>> import codecs, os;
__pyfile = codecs.open('''/var/folders/6j/g9hcs1s17g1dgxr3p_m04rq80000gn/T/py5013kfY''', encoding='''utf-8''');
__code = __pyfile.read().encode('''utf-8''');
__pyfile.close();
os.remove('''/var/folders/6j/g9hcs1s17g1dgxr3p_m04rq80000gn/T/py5013kfY''');
exec(compile(__code, '''/Users/user/Desktop/sample.py''', 'exec'));
Run Code Online (Sandbox Code Playgroud)
我想在每次调用命令时都不会显示此消息.Linux上的相同版本的Emacs(以及python.el文件)没有此问题.消息的模板在python-shell-send-file
函数中定义(在python.el
文件中),这本身就令人费解,因为我无法看到在调用时如何调用此函数python-shell-send-region
.对于第一次运行,我使用以下命令调用Python解释器(版本2.7.10)
/usr/bin/python -i
Run Code Online (Sandbox Code Playgroud)
但它也与其他python解释器(通过brew安装)的行为相同.我正在使用Emacs 24.5.1(再次通过brew安装).我使用的唯一特定于python模式的配置.emacs
与选项卡宽度有关:
(add-hook 'python-mode-hook
(lambda ()
(setq indent-tabs-mode t)
(setq tab-width 2)
(setq python-indent 2)))
Run Code Online (Sandbox Code Playgroud)
任何帮助或建议表示赞赏.
编辑:
我在这个页面找到了一个解决方案(https://github.com/jorgenschaefer/elpy/issues/1307):
$ easy_install-3.6 gnureadline
$ cd /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload
$ mv readline.cpython-36m-darwin.so readline.cpython-36m-darwin.so.bak
Run Code Online (Sandbox Code Playgroud)
如果在安装gnureadline时出错fatal error: 'stdio.h' file not found
,请尝试xcode-select --install
.
在切换到我通常运行命令的缓冲区之后,我想通过搜索来浏览历史记录,而不是在缓冲区末尾一次导航一个命令(例如C-p
).
基本上我想在缓冲区末尾"反向搜索" 命令历史记录,而不是搜索缓冲区.
有没有人编写有效的解决方案?请注意,我注意到有一个命令历史记录缓冲区可用,但在这里它只是一堆文本,并且我认为使用不够好.
正如文档所说, RET 将comint-send-input
在 shell 模式下的任何地方。问题是,如果您错误地在任何行上按了 Enter 键,并且您没有收到提示,它将执行整个随机文本,直到下一个提示。我怎样才能防止这种情况发生?如果点击Enter
提示之外的任何地方会将您发送到底部的新提示,那就太好了。