你如何在Vim中使用Python?

时间:2009-02-01 21:10:02

标签: python vim

我在Vim和Python之间浪费了很多时间。我发现从Python手动复制粘贴到Vim太慢了,反之亦然。一个好的破坏的例子是:

  

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

你怎么能在Vim做这样的调整?的 [解决]

[澄清] 我需要Vim的东西,比如打印序列,算术...... - 在Vim我不能做的事情。

[?] 有人可以详细说明这一点: “你的脚本可以从stdin读取,直接在(。,%,...)的行上运行。

[进一步澄清]

如果我想在第4,5,6和7行打印'Hello',那就错了:

  

:4-7!python -c“print'hello'”

点。修改当前行。我可以在多行7,32和99上打印:

  

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

显然不行。怎么样?

12 个答案:

答案 0 :(得分:164)

在任何vim窗口中,输入以下内容:

for x in range(1,10):
    print '-> %d' % x

直观地选择这两行(V以启动可视模式),然后键入以下内容:

:!python

因为你在视觉模式下按了':',结果会像:

:'<,'>!python

按Enter键,选择将替换为print语句的输出。您可以轻松将其转换为映射:

:vnoremap <f5> :!python<CR>

答案 1 :(得分:6)

  

有人可以详细说明这一点:“你的脚本可以从stdin中读取,直接在给定的行(。,%,...)上运行。”

一个常见用途是使用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

答案 2 :(得分:5)

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

%!python -c "for i in xrange(25): print 6*i"

-c的{​​{1}}选项为其提供了一个可运行的脚本。但是,您可能会发现此技术仅在非常短的情况下有用,因为与其他语言不同,Python不适合在一行中编写完整的程序。

答案 3 :(得分:2)

答案 4 :(得分:1)

我想你不会错过-c标志。例如:

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

您不应该将您提供的脚本充当线选择的过滤器。也就是说,您的脚本可以从stdin读取,直接在给定的行(.%,...)上运行。但是,除了最简单的任务之外,最好还是将python命令放入自己的脚本文件中。

答案 5 :(得分:1)

您可以执行代码,读取光标上的输出并以u结束,假设您正在执行python代码。简单快捷。

:r !python %

u

我喜欢映射和选择视觉模式,就像使用too-much-php一样,因为它保持了基础简单!

答案 6 :(得分:1)

我刚刚编写了以下模块,可以直接在Python解释器中编辑vim中的临时缓冲区。

http://philipbjorge.github.com/EditREPL/

答案 7 :(得分:1)

如果您已在新的[No Name]缓冲区中编写了python脚本,则可以使用以下命令:

:0,$!python

当你没有名字缓冲区时就不能使用&#39;%&#39;,因此需要0,$表示缓冲区中的所有行从第0行开始直到最后一行

输出将写入缓冲区,不幸的是不在最后

答案 8 :(得分:0)

  

如果我想在第4,5,6和7行打印'Hello',那就错了:

如果您想在整个文件中随机选择的位置执行某些操作,则最好记录击键并重放它们。转到要更改的第一行,然后点击qz开始录制到注册z。对该行进行任何编辑操作,并在完成后再次点击q。转到您要更改的下一行,然后按@z重播宏。

答案 9 :(得分:0)

如果你想在不使用python解释器编译vim的情况下进行一些python调用(这将允许你用Python编写插件,而且无论如何也需要Omnicomplete)你可以尝试这样:

:.!python -c "import os; print os.getcwd()"

这会告诉你你在驱动器中的位置(当前路径)。

现在让我们从空文件开始编号几行,这样我们就可以轻松地看到结果:

:.!python -c "for i in range(1,101): print i"

(vim编号从1开始的行不是0) 现在我们只有每行中每行的编号,直到第100行。

现在让我们在您当前的路径中添加一个小脚本(如上所示)并运行它,看看它是如何工作的。让我们复制粘贴这个愚蠢的。实际上,您会发现每行输出一行的脚本最有用,但您不必这样做,因为此脚本显示:

print "hi"

try:
    while True:
        i=raw_input()
        print "this was:",i
except EOFError:
    print "bye"

所以你可以打电话,例如(想象你称之为“what.py”):

:10,20!python what.py

(请注意,文件名的选项卡完成有效,因此您可以验证它实际上在路径中)

如您所见,每行都作为标准输入提供给脚本。首先它输出“hi”,在结尾“再见”,在它们之间,对于每一行输出“this is:”加上该行。这样您就可以逐行处理。请注意,您可以执行比逐行处理更复杂的操作,您实际上可以考虑以前的行。对于这样的东西,我宁愿导入sys并按照这样做:

import sys

print "hello"

for i in sys.stdin.readlines():
    i = i.rstrip("\n") # you can also prevent print from doing \n instead
    print "here lyeth",i

print "see you"

希望有所帮助。

答案 10 :(得分:0)

我认为你真正想要的是here

答案 11 :(得分:0)

在Windows上,如果您正在编辑python脚本,只需执行:

!start python my...

并按tab沿可用文件名循环,直到找到匹配项:

!start python myscript.py

它将在新的cmd窗口中运行。我个人更喜欢做!start cmd并从那里运行Python,因为从最终的错误消息中调试更容易。