【问题标题】:Execute selection from script in Vim在 Vim 中从脚本执行选择
【发布时间】:2016-10-27 16:20:48
【问题描述】:

我正在尝试将 vim 整合到我的主要工作流程中。对我来说,一个主要的症结在于交互式地编辑和运行程序/脚本。

例如,鉴于我目前正在进入 test.py

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

不离开vim我会怎么做:
a) 在不离开 vim 的情况下运行整个脚本
b) 只运行“print('hello')”

【问题讨论】:

  • 1) :!python3 test.py。 2):!python3 -c "print('hello')".

标签: vim


【解决方案1】:

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

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

:!python %

或者,我更愿意这样做以确保没有未保存的更改,

:w | !python %

但在 vim 中运行 python 脚本甚至不需要文件。原因是因为 :w != save! :w 表示 write,如果没有提供参数,它恰好写入你正在编辑的文件。但是,您可以写入到 STDOUT、另一个文件,甚至另一个程序。因此,如果您想在没有文件保存和运行的情况下将缓冲区作为 python 代码运行,您可以简单地执行以下操作:

:w !python

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

现在这里真的很酷。在 vim 中,:w 是一个“ex 命令”,例如您从最初来自 ex 的 vim 命令行运行的命令,这是一个非常古老的基于行的 unix 文本编辑器。 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

(将 \ 替换为您设置为领导者的任何内容)。你也可以这样做

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

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

取决于您是否要保存到文件。

【讨论】:

  • 这是一个完美的答案。 SO 是为了教学,而不是用勺子喂食。谢谢!
  • :w !python3 在第一行遇到 EOF 错误 input() 我猜这与 python 等待用户输入和 vim 只是转储剩余缓冲区有关。但这确实是一个疯狂的猜测。
【解决方案2】:

this 问题中讨论的范围创建函数:

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&lt;cr&gt;。在这种情况下,我会设置自动命令,根据文件类型切换makeprg

    如果你想运行一个简单的语句,你可以使用 Python 的 -c 开关:

    :!python3 -c 'print("Hello world")',或者你可以直接运行 :!python3,不带参数,在不离开 Vim 的情况下放入 REPL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2011-03-11
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2011-04-14
      相关资源
      最近更新 更多