从Vim中的脚本执行选择

Cha*_*les 19 vim

我正在尝试将vim纳入我的主要工作流程.对我来说,一个主要的关键点是交互式编辑和运行程序/脚本.

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

print('hello')
x = 5
y = x+2
print(y)
Run Code Online (Sandbox Code Playgroud)

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

DJM*_*hem 44

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

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

:!python %
Run Code Online (Sandbox Code Playgroud)

或者,我更喜欢确保没有未保存的更改,

:w | !python %
Run Code Online (Sandbox Code Playgroud)

但是甚至没有必要让文件在vim中运行python脚本.原因是因为:w!=保存! :w表示写入,如果没有提供参数,则会写入您正在编辑的文件.但是,您可以写入 STDOUT,写入另一个文件,甚至写入另一个程序.因此,如果您希望将缓冲区作为python代码运行,而无需保存和运行文件,则可以执行以下操作:

:w !python
Run Code Online (Sandbox Code Playgroud)

这meanse 写入当前缓冲区到外部程序"蟒蛇".这实际上只是将缓冲区的内容直接发送到python.

现在这里变得非常酷.在vim中,:w是一个"ex命令",例如你从最初来自ex的vim命令行运行的命令,这是一个非常古老的基于行的unix文本编辑器.关于ex命令的令人敬畏的事情是,因为它们都是基于行的,所以您可以直接说明要将命令应用到哪些行.例如:

:2w myfile.txt
Run Code Online (Sandbox Code Playgroud)

将只将第二行写入文件"myfile.txt".你甚至可以提供一个范围,例如

:2,7w myfile.txt
Run Code Online (Sandbox Code Playgroud)

将第2-7行写入"myfile.txt".这意味着使用您的示例,我们可以运行

:1w !python
Run Code Online (Sandbox Code Playgroud)

运行刚

print('hello')
Run Code Online (Sandbox Code Playgroud)

为了使这更方便,您可以使用可视模式选择您想要运行的每一行,这将自动为您填写正确的范围.这看起来像

:'<,'>w !python
Run Code Online (Sandbox Code Playgroud)

为了使这更方便,我建议添加类似的东西

xnoremap <leader>p :w !python<cr>
Run Code Online (Sandbox Code Playgroud)

到你的.vimrc.然后你可以直观地选择你想要的任何东西,并通过输入运行它作为python代码

\p
Run Code Online (Sandbox Code Playgroud)

(替换\你设置为领导者的任何东西).你也可以这样做

nnoremap <leader>p :w !python<cr>
Run Code Online (Sandbox Code Playgroud)

要么

nnoremap <leader>p :w | !python %<cr>
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个完美的答案。SO 是为了教学,而不是用勺子喂食。谢谢! (2认同)

Rus*_*nov 5

如本问题所述,为范围创建一个函数:

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

创建视觉模式的映射:

vmap <C-F6> :call PyRun()<CR>
Run Code Online (Sandbox Code Playgroud)

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