如何在Vim中将所有行输出到Python控制台?

4 投票
3 回答
1470 浏览
提问于 2025-04-18 18:08

我设置了F2键的快捷方式,用这个命令:map <f2> :w<cr>:! D:\Python34\python %<cr>。当我在vim中打开一个Python文件并按下F2键时,这个Python文件就会被执行。举个简单的例子,下面是我在gvim中打开的Python文件。

enter image description here enter image description here

现在我不能输入其他的Python代码,我只能看到结果,然后按任意键关闭这个窗口。我想要的是:当我按下F2键(Python文件在gvim中打开时),Python控制台弹出来,文件里的所有内容自动复制到Python控制台中,然后我可以在控制台输入一些代码,比如Obj().hello,或者继续在gvim中编辑。我是个懒人,gvim和Python控制台都在等着我,我能不能写个vim脚本来实现这个目标?命令:!D:\Python34\python -i %可以正常工作,我得到了输出:enter image description here。但还有一个问题: 1) 当命令:!D:\Python34\python -i %执行时,gvim窗口会被冻结,我无法拖动鼠标查看vim中的代码。 2) Python控制台窗口里没有任何Python代码。

所以如果程序里有很多行代码,而我又记不住之前的内容,更糟糕的是,gvim窗口被冻结,我该怎么获取这些代码呢?enter image description here

3 个回答

0

你可以从Python的角度来解决这个问题(2.7版本)。

  1. 把文件放在原来的位置(或者给它起个独特的名字,存到临时目录),然后让Python直接加载这个文件。
  2. 在你的命令行中去到那个位置,交互式地运行Python(或者让vim为你启动一个解释器)。
  3. 导入你的文件,使用命令 import demo
  4. 试着用你实现的功能,像这样 demo.SomeModule().meth()
  5. 在vim中做一些修改。
  6. 重新加载你的Python模块,使用命令 reload(demo)
  7. 再次试验你的代码,像这样 demo.SomeModule().differentMeth()

你还可以让vim创建一个文件,里面有快捷功能,用于加载或重新加载你正在工作的文件。当vim启动解释器时,你可以把这个文件设置为 PYTHONSTARTUP 环境变量,这样解释器启动时会自动加载这个文件。例如,你可以创建一个叫 r() 的函数,来自动重新加载你正在工作的文件。

另外值得一提的是,重新加载模块可能会有点奇怪。如果你先实例化了一些模块,然后再重新加载文件,只有的模块会使用新代码;旧的模块仍然会运行旧代码。

0

也许Vim插件Conque可以解决你的问题:

  1. 安装说明可以在这里找到 https://code.google.com/p/conque/
  2. 使用时只需输入 :ConqueTermVSplit python -i test.py(VSplit是指垂直分屏,你也可以选择水平分屏)
  3. 运行Python代码时不会阻塞你的窗口 - 你可以通过按两次Ctrl+W来退出交互模式,切换回你的窗口
1

避免阻塞

为了让调用变成异步的(也就是在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(或者扩展它以支持可视模式选择)。

撰写回答