我在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'”
显然不行。怎么样?
答案 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中的临时缓冲区。
答案 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,因为从最终的错误消息中调试更容易。