在 Vim 中执行脚本中的选择内容

27

我希望将vim纳入我的主要工作流程中。 对我来说一个重要的难点是进行程序/脚本的交互式编辑和运行。

例如,假设我当前正在使用vim编辑test.py文件。

print('hello')
x = 5
y = x+2
print(y)

不离开vim,我该如何:
a)运行整个脚本而不离开vim
b)仅运行"print('hello')"

在vim中执行以下命令来实现:
a) :!python script.py
b) 首先按下Esc键以确保处于命令模式,然后输入:!python -c "print('hello')"


  1. :!python3 test.py
  2. :!python3 -c "print('hello')"
- L3viathan
3个回答

69

评论者和其他答案已经指出如何从vim中运行文件。但是他们忽略了一些非常强大的可能性。我想更详细地解释一下其中一些方法的工作方式。

在vim中运行python脚本的最简单方法就是调用python解释器,例如:

:!python %

或者,我更喜欢采用这种方式以确保没有未保存的更改:

:w | !python %

不需要文件就可以在vim中运行Python脚本,这是因为:w != save! :w意味着写入,如果没有提供参数,则会将其写入正在编辑的文件。但是,你可以将其写入STDOUT、另一个文件或甚至另一个程序。因此,如果你想要在没有保存和运行文件的情况下以Python代码形式运行缓冲区,只需执行以下操作:

:w !python

这意味着将当前缓冲区的内容写入外部程序“python”。这实际上只是直接将您的缓冲区内容发送到python。

现在,这里变得非常酷了。在vim中,:w是“ex命令”,即从起源于非常古老的基于行的Unix文本编辑器ex的vim命令行中运行的命令。关于ex命令的绝妙之处在于,由于它们都是基于行的,因此您可以直接指定要应用命令的行。例如:

:2w myfile.txt

将"myfile.txt"文件中仅写入第二行的内容。您甚至可以提供一个范围,例如
:2,7w myfile.txt

将行2-7写入“myfile.txt”文件。这意味着使用您的示例,我们可以运行

:1w !python

只需运行即可

print('hello')

为了更加方便,您可以使用可视模式选择想要运行的每一行代码,这样会自动为您填充正确的范围。它看起来像这样:
:'<,'>w !python

为了使这更加方便,我建议添加类似于:

的内容

xnoremap <leader>p :w !python<cr>

在您的.vimrc文件中添加以下内容。然后,您可以通过选择您想要运行的任何内容并输入以下命令将其作为Python代码进行运行。

\p

(replace \ with whatever you have set up as your leader). You could also do
nnoremap <leader>p :w !python<cr>

或者
nnoremap <leader>p :w | !python %<cr>

根据您是否需要保存到文件中,选择不同的选项。


2
这是一个完美的答案。SO旨在教学,而不是喂食。谢谢! - reergymerej
使用 :w !python3 命令在第一行的 input() 处遇到了 EOF 错误。我猜测这可能与 Python 等待用户输入有关,而 Vim 则只是将剩余缓冲区倾倒出来。但这只是一个猜测。 - Max Power
我知道这个回答已经有6年了,但是我从中学到了很多东西,首先,非常感谢! 其次:我想再稍微修改一下这个行为——例如,有时我会写需要打印几百行的代码,我能否将输出打印到一个分割标签或甚至另一个窗口中? (如果更合适的话,我会将这作为一个单独的问题提出来) - ptr64
@ptr64 很高兴它对你有帮助!听到这样的话很不错。至于将输出打印到新缓冲区,那就是 :read 命令(或简写为 :r)。请参见 https://superuser.com/questions/157987/pipe-output-of-shell-command-into-a-new-buffer-in-vim - DJMcMayhem
如果我尝试使用 :tabnew | r '<,'>w !python 命令将一些行的输出导入到一个新标签页中,我只会得到一个空白标签页。我尝试过保存文件并使用 :tabnew | r !python:tabnew | r | w | !python % 命令,但都只得到了空白标签页。是否有可能链接写入和读取命令? - ptr64

5

按照这个问题的讨论,创建一个与范围有关的函数:

fu PyRun() range
  echo system('python -c ' . shellescape(join(getline(a:firstline, a:lastline), "\n")))
endf

创建一个可视模式的映射:
vmap <C-F6> :call PyRun()<CR>

然后您可以选择一个范围并按下Control-F6。这些行的范围将由python执行。结果将显示在命令区域。


3
你可以使用:!在vim中运行程序,例如:!python3 %来运行当前脚本。
如果想要将其绑定到一个按键上,另一种简单的方法是将makeprg设置为你的Python可执行文件::set makeprg=python3,然后将一个按键绑定到:make<cr>。在这种情况下,我会设置autocmds,根据文件类型切换makeprg
如果要运行简单的语句,可以使用Python的-c开关::!python3 -c 'print("Hello world")',或者只需运行:!python3而不带参数即可进入REPL而不离开Vim。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接