如何在Vim中使用Python?

52

我在Vim和Python间浪费很多时间。手动从Python复制黏贴到Vim和反向操作太慢了。一个好的示例是:

%!python for i in xrange(25); print 6*i \n

如何在Vim中直接进行这样的调整?[已解决]

[澄清] 我需要像打印序列、算术运算等这些无法在Vim中完成的操作。

[?] 有人能详细说明一下这个观点吗: “您的脚本可以从stdin读取以直接操作给定的行 (., %,...)。”

[更进一步的澄清]

如果我想将“Hello”打印到第4、5、6和7行,以下方式有什么问题:

:4-7!python -c "print 'hello'"

点号.修改当前行。我能在多行7、32和99上打印吗:

:7,32,99!python -c "print 'hello'"

显然不起作用。怎么办?


请问你能否详细说明一下,你试图做什么? - Alex
12个回答

165
在任意一个vim窗口中,输入类似这样的内容:
for x in range(1,10):
    print '-> %d' % x

进入可视模式(按下 V),然后选择那两行代码,输入以下内容:

:!python

因为您在可视模式下按下了“:”,所以看起来会像这样:

:'<,'>!python

按下回车键,选择内容将被print语句的输出替换。您可以轻松将其转换为映射:

:vnoremap <f5> :!python<CR>

12
我已经使用 Vim 和 Python 多年了,然而这个建议让我大吃一惊。不知道为什么从来没有想到过。 - rhettg
3
其实在HL问了问题并且我不得不想出一个答案之前,我并没有意识到这件事情可以这么容易地完成。 - too much php
7
哦,我意识到这个技巧可以用于任何写入标准输出的东西,例如 ls -l,然后选择 Visual 模式并运行 :'<,'>!bash - Mike Ellis
1
将光标移动到定义的开头,然后键入“V}!python”将选定的段落发送到Python。 - BandGap
这个东西真正好的地方在于它可以与任何脚本语言一起使用,尝试在!lua中使用**print('Hello '..'World')**。 - FUD
显示剩余2条评论

6
有人可以解释一下这个点:“您的脚本可以从标准输入中读取以直接处理给定的行(.,%,...)”吗?
一个常见的用法是使用您的shell中可用的“sort”命令对文本行进行排序。例如,您可以使用此命令对整个文件进行排序:
:%!sort

或者,您可以通过在可视模式下选择几行并键入以下内容来对其进行排序:
:!sort

您可以使用以下命令对第5到10行进行排序:
:5,10!sort

你可以编写自己的命令行脚本(假设你知道如何编写),用于反转文字行。它的工作方式如下:
bash$ myreverse 'hello world!'
!dlrow olleh

你可以像使用sort一样,将其应用于vim中的一个打开文件:

:%!myreverse      <- all lines in your file are reversed

在Vim中,:%!myreverse对我不起作用。它会输出:/bin/bash: myreverse: 命令未找到。 - Léo Léopold Hertz 준영
1
@Masi:这个想法是,如果你已经编写了一个myreverse命令,那么你就可以这样执行它。 - Ed Brannin

5

从您的示例中看来,似乎您想要执行Python脚本并将其输出显示在当前的Vim缓冲区中。如果是这样的话,那么您可以在Vim命令行中执行以下操作:

%!python -c "for i in xrange(25): print 6*i"
-c选项是给python一个要运行的脚本。然而,你可能只会在非常短的情况下发现这种技术有用,因为与其他一些语言不同,Python不太适合在一行中编写完整的程序。


1

我认为你只是缺少了-c标志。例如:

:.!python -c "print 'hello'"

你应该知道,你提供的脚本作为对行选择的过滤器。也就是说,你的脚本可以从 stdin 读取以直接操作给定的行(.%,...)。然而,如果任务比较复杂,最好将 Python 命令放入自己的脚本文件中。


1

如果您在新的[无名称]缓冲区中编写了Python脚本,则可以使用以下方法:

:0,$!python

当您拥有一个无名称的缓冲区时,就不能使用“%”,因此需要0,$,这意味着从第零行开始直到最后一行的所有行都在缓冲区中。
输出将被写入缓冲区,不幸的是不会在末尾。

1
你可以执行代码,读取光标上的输出,并以u结束,假设你正在执行Python代码。简单又快捷。
:r !python %

u

我喜欢它胜过映射和在可视模式下选择,就像 太多的PHP 一样,因为它保持了基础简单!


如果您正在使用临时缓冲区,那么这是不可能的 - 您必须先保存它,然后才能正常工作 - 请问您知道如何使临时缓冲区正常工作吗? - serup

1

0
如果我要在第4、5、6和7行打印“Hello”,以下哪一点是错误的:
如果你想在文件的随机位置做些什么,最好记录按键并重放。 转到您要更改的第一行,并按qz开始记录到寄存器z中。 对于该行所需的任何编辑,请进行任何编辑,完成后再次按q。 转到下一行要更改的行,并按@z以重新播放宏。

0

我觉得你真正想要的是在这里解释这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接