在 Vim 中执行脚本选择

问题描述 投票:0回答:4

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

例如,我目前正在 vimmed 到 test.py 中

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

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

vim
4个回答
70
投票

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

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

:!python %

或者,正如我更喜欢做的那样,以确保没有未保存的更改,

:w | !python %

但是甚至不需要有一个文件来在 vim 中运行 python 脚本。原因是因为

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

这意味着将当前缓冲区
写入

外部程序“python”。这实际上只是将缓冲区的内容直接发送到 python。 现在这就是它变得非常酷的地方。在 vim 中,:w 是一个“ex 命令”,例如从 vim 命令行运行的命令,最初来自

ex

,一个非常古老的基于行的 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>

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

为某个范围创建一个函数,如
this

问题中所述:


5
投票

为视觉模式创建映射: vmap <C-F6> :call PyRun()<CR>

然后您可以选择一个范围并按 
Control

-

F6
。行的范围将由
python

执行。结果将显示在命令区域中。 您可以使用

:!
从 vim 运行程序,即

:!python3 %

3
投票

如果您想为其绑定一个键,另一种简单的方法是将

makeprg
设置为您的 python 可执行文件:
:set makeprg=python3
,然后将一个键绑定到

:make<cr>

。在这种情况下,我将设置自动命令来根据文件类型切换

makeprg

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

:!python3 -c 'print("Hello world")'

,或者你可以直接运行

:!python3
,不带参数,在不离开 Vim 的情况下将其放入 REPL 中。

vim 中的另一颗宝石...
要运行 shell 命令+捕获所述命令输出,您可以尝试两种方法:


0
投票

选择目标行作为 shell 命令

run

norm y

(将选定的行复制到 vim 未命名寄存器)
  1. run
  2. let @a = system (getreg('"'))
  3. (运行存储在未命名寄存器中的命令,将命令输出的结果存储到
    @a
    宏中。
  4. run
    norm "ap
    (将寄存器的输出粘贴到 vim 缓冲区)
    
    
  5. 将程序写入 shell
  6. 运行
  7. '<,'>w !bash | xclip
(将选定的行写入bash作为程序并将STDOUT复制到系统剪贴板)

    此方法假设安装了 xclip 或等效实用程序/工具/cmdlet。
© www.soinside.com 2019 - 2024. All rights reserved.