你如何在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中的临时缓冲区。
如果你已经在新的[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。