【问题标题】:How can you use Python in Vim?如何在 Vim 中使用 Python?
【发布时间】:2009-02-01 21:10:02
【问题描述】:

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

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

如何在 Vim 中直接进行此类调整? [已解决]

[澄清]我需要一些 Vim 的东西,比如打印序列、算术...... - 我在 Vim 中无法做到的事情。

[?] 有人可以详细说明这一点: "您的脚本可以从标准输入读取以直接在给定的行上操作 (., %, ...)。"

[进一步说明]

如果我想在第 4、5、6 和 7 行打印 'Hello',出了什么问题:

:4-7!python -c "p​​rint 'hello'"

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

:7,32,99!python -c "p​​rint 'hello'"

显然不起作用。怎么样?

【问题讨论】:

  • 您能否详细说明一下,您要做什么?

标签: python vim


【解决方案1】:

在你的任何 vim 窗口中,输入如下内容:

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

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

:!python

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

:'<,'>!python

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

:vnoremap <f5> :!python<CR>

【讨论】:

  • 多年来我一直在使用 vim 和 python,但这个建议让我大吃一惊。不知道为什么我从来没有想过。
  • 其实直到 HL 问了他的问题我才意识到它可以这么容易做到,我不得不想出一个答案......
  • 在普通模式下输入“ggVG”可以直观地全选。或者,如果你像我一样使用 MacVim,那只是 command-a。
  • 天啊。刚刚意识到这个技巧适用于任何写入标准输出的东西,例如ls -l 然后选择 Visual 并使用 :'&lt;,'&gt;!bash 运行
  • 将光标定位在定义的开头并输入 "V}!python" 将选定的段落发送到 python。
【解决方案2】:

有人可以详细说明这一点:“您的脚本可以从标准输入读取以直接对给定的行进行操作 (., %, ...)。”

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

:%!sort

或者,您可以通过在可视模式下选择几行然后键入:

:!sort

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

:5,10!sort

您可以编写自己的命令行脚本(假设您知道如何执行此操作)来反转文本行。它的工作原理是这样的:

bash$ myreverse 'hello world!'
!dlrow olleh

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

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

【讨论】:

  • :%!myreverse 在 Vim 中对我不起作用。它给出了输出:/bin/bash: myreverse: command not found
  • @Masi:这个想法是,如果你写了一个myreverse 命令,你就会执行它。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:
    【解决方案5】:

    我认为您不只是缺少-c 标志。例如:

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

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

    【讨论】:

      【解决方案6】:

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

      :r !python %
      
      u
      

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

      【讨论】:

      • 但是,如果您使用的是 tmp 缓冲区,则这是不可能的 - 您必须先保存它,然后它才能工作 - 您是否知道如何将其用于临时缓冲区?
      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        如果您在新的 [No Name] 缓冲区中编写了 Python 脚本,那么您可以使用以下内容:

        :0,$!python
        

        当你有一个无名缓冲区时,你不能使用'%',因此需要 0,$,这意味着缓冲区中的所有行都从第 0 行开始直到最后一行

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

        【讨论】:

          【解决方案9】:

          如果我想在第 4、5、6 和 7 行打印 'Hello',出了什么问题:

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

          【讨论】:

            【解决方案10】:

            如果你想在不使用 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”,最后输出“bye”,中间输出“this was:”的每一行加上该行。这样您就可以逐行处理。请注意,您可以做比逐行处理更复杂的事情,您实际上可以考虑以前的行。对于这样的东西,我宁愿导入 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"
            

            希望对您有所帮助。

            【讨论】:

            • 我想这可以做得更短。我没有得到长时间的工作方法。
            【解决方案11】:

            我认为您真正想要的是解释here

            【讨论】:

              【解决方案12】:

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

              !start python my...
              

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

              !start python myscript.py
              

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-01-09
                • 2011-04-19
                • 1970-01-01
                • 1970-01-01
                • 2011-08-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多