你如何在Vim中使用Python?

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

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

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

[澄清]我需要Vim的一些东西,比如打印序列,algorithm… – 在Vim中我无法做到的事情。

有人可以详细说明这一点:“你的脚本可以从标准input读取,直接在给定的行(。,%,…)上操作。

[进一步澄清]

如果我想打印第4,5,6和7行的“Hello”,那么错在哪里:

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

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

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

显然不工作。 怎么样?

在任何你的vim窗口中,input如下所示的内容:

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

从视觉上select这两行(V开始可视模式),然后input以下内容:

 :!python 

因为您在可视模式下按下了“:”,最终结果如下:

 :'<,'>!python 

按Enter键,select被print语句的输出replace。 你可以很容易地把它变成一个映射:

 :vnoremap <f5> :!python<CR> 

有人可以详细说明这一点:“你的脚本可以从标准input读取直接操作给定(。,%,…)”。

一个常见的用法是使用shell中可用的“sort”命令对文本行进行sorting。 例如,您可以使用以下命令对整个文件进行sorting:

 :%!sort 

或者,您可以通过在可视模式中select几行来sorting,然后键入:

 :!sort 

您可以使用以下命令对第5-10行进行sorting:

 :5,10!sort 

你可以写你自己的命令行脚本(假设你知道如何做到这一点),它颠倒了文本行。 它是这样工作的:

 bash$ myreverse 'hello world!' !dlrow olleh 

您可以将它应用到vim中的一个打开的文件中,方法与您使用的sort方式完全相同:

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

在你的例子中,看起来好像你想要执行一个Python脚本,并且脚本的输出显示在当前的Vim缓冲区中。 如果这是正确的,那么你可以在Vim的命令行中执行以下操作:

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

python-c选项给它一个脚本来运行。 但是,您可能会发现这种技术仅在非常短的情况下才有用,因为与其他一些语言不同,Python不能很好地在一行中编写完整的程序。

我不确定它们的用处,可能是为了进一步阅读:

  • Python和vim:Sean Reifschneider(Advanced)的两个伟大的口味,
  • Python和vim:制作你自己的IDE
  • Vim为python定制

我想你只是错过了-c标志。 例如:

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

您不应该将您提供的脚本作为行select的filter。 也就是说,你的脚本可以从stdin读取,直接在给定的行( .% ,…)上操作。 然而,除了最简单的任务之外,你最好将python命令放到它自己的脚本文件中。

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

 :r !python % u 

我喜欢通过映射和select在视觉模式,像太多的PHP ,因为它保持简单的基础!

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

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

如果你已经在新的[No Name]缓冲区中写入了你的python脚本,那么你可以使用下面的代码:

 :0,$!python 

当你有一个没有名字的缓冲区,那么你不能使用'%',因此需要0,$,这意味着缓冲区中的所有行以行0开始,直到最后一行

输出将被写入缓冲区,不幸的是不会结束

如果我想打印第4,5,6和7行的“Hello”,那么错在哪里:

如果你想在整个文件的随机select的地方做一些事情,你最好logging击键并重放它们。 转到您想要更改的第一行,然后按qz开始logging到寄存器z 。 做任何你想要的线路编辑,当你完成后再打q 。 转到要更改的下一行,然后按@z重播macros。

如果你想做一些python调用,而不用python解释器来编译vim(这将允许你用Python编写插件,而且Omnicomplete也需要这样做),你可以这样做:

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

这将告诉你你在驱动器(当前path)的位置。

现在让我们从一个空文件开始写几行,以便我们很容易地看到结果:

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

(从1的vim数字行不是0)现在我们只有行中的每一行,直到100行。

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

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

所以你可以打电话,比如(想象你叫它“what.py”):

:10,20!python what.py

(请注意,文件名的制表符完成工作,所以你可以validation它实际上是在path中)

正如你所看到的,everyline是作为标准input提供给脚本的。 首先输出“嗨”,在结束“再见”和之间,你输出的每一行“这是:”加上行。 这样你可以逐行处理。 注意你可以做更复杂的东西而不是逐行处理,你可以考虑以前的线条。 对于这样的东西,我宁愿导入系统,像这样做:

 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" 

希望有所帮助。

我认为你真正想要的是在这里解释。

在Windows上,如果您正在编辑python脚本,请执行以下操作:

 !start python my... 

然后按tab键循环显示可用的文件名,直到find匹配项:

 !start python myscript.py 

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