如何在Vim中将所有行输出到Python控制台?
我设置了F2键的快捷方式,用这个命令:map <f2> :w<cr>:! D:\Python34\python %<cr>
。当我在vim中打开一个Python文件并按下F2键时,这个Python文件就会被执行。举个简单的例子,下面是我在gvim中打开的Python文件。
现在我不能输入其他的Python代码,我只能看到结果,然后按任意键关闭这个窗口。我想要的是:当我按下F2键(Python文件在gvim中打开时),Python控制台弹出来,文件里的所有内容自动复制到Python控制台中,然后我可以在控制台输入一些代码,比如Obj().hello
,或者继续在gvim中编辑。我是个懒人,gvim和Python控制台都在等着我,我能不能写个vim脚本来实现这个目标?命令:!D:\Python34\python -i %
可以正常工作,我得到了输出:。但还有一个问题:
1) 当命令
:!D:\Python34\python -i %
执行时,gvim窗口会被冻结,我无法拖动鼠标查看vim中的代码。
2) Python控制台窗口里没有任何Python代码。
所以如果程序里有很多行代码,而我又记不住之前的内容,更糟糕的是,gvim窗口被冻结,我该怎么获取这些代码呢?
3 个回答
你可以从Python的角度来解决这个问题(2.7版本)。
- 把文件放在原来的位置(或者给它起个独特的名字,存到临时目录),然后让Python直接加载这个文件。
- 在你的命令行中去到那个位置,交互式地运行Python(或者让vim为你启动一个解释器)。
- 导入你的文件,使用命令
import demo
。 - 试着用你实现的功能,像这样
demo.SomeModule().meth()
。 - 在vim中做一些修改。
- 重新加载你的Python模块,使用命令
reload(demo)
。 - 再次试验你的代码,像这样
demo.SomeModule().differentMeth()
。
你还可以让vim创建一个文件,里面有快捷功能,用于加载或重新加载你正在工作的文件。当vim启动解释器时,你可以把这个文件设置为 PYTHONSTARTUP
环境变量,这样解释器启动时会自动加载这个文件。例如,你可以创建一个叫 r()
的函数,来自动重新加载你正在工作的文件。
另外值得一提的是,重新加载模块可能会有点奇怪。如果你先实例化了一些模块,然后再重新加载文件,只有新的模块会使用新代码;旧的模块仍然会运行旧代码。
也许Vim插件Conque可以解决你的问题:
- 安装说明可以在这里找到 https://code.google.com/p/conque/
- 使用时只需输入
:ConqueTermVSplit python -i test.py
(VSplit是指垂直分屏,你也可以选择水平分屏) - 运行Python代码时不会阻塞你的窗口 - 你可以通过按两次Ctrl+W来退出交互模式,切换回你的窗口
避免阻塞
为了让调用变成异步的(也就是在Python会话期间不让GVIM卡住),可以使用Windows特有的 :!start
命令:
nnoremap <f2> :w<cr>:!start D:\Python34\python -i %<cr>
列出代码
我不太确定能不能从交互式Python调试器中列出传入的源代码。不过你可以在启动之前打印文件内容:
nnoremap <f2> :w<cr>:!start cmd /c type % && D:\Python34\python -i %<cr>
额外提示
- 你应该使用
:noremap
;这样可以让映射不受重新映射和递归的影响。 - 因为你的映射只在正常模式下工作,所以使用
:nnoremap
(或者扩展它以支持可视模式选择)。