我正在尝试将 vim 合并到我的主要工作流程中。对我来说,一个主要的症结是交互式编辑和运行程序/脚本。
例如,我目前正在 vimmed 到 test.py 中
print('hello')
x = 5
y = x+2
print(y)
如果不离开 vim 我会怎样:
a) 在不离开 vim 的情况下运行整个脚本
b) 只运行“print('hello')”
评论者和其他答案已经指出了如何从 vim 运行文件。但他们掩盖了一些真正强大的可能性。我想更详细地解释其中一些是如何工作的。
在 vim 中运行 python 脚本的最简单方法是在文件上调用 python 解释器,例如
:!python %
或者,正如我更喜欢做的那样,以确保没有未保存的更改,
:w | !python %
但是甚至不需要有一个文件来在 vim 中运行 python 脚本。原因是因为
:w
!= save! :w
表示 write,如果不提供参数,它恰好会写入您正在编辑的文件。但是,您可以“写入”到 STDOUT、另一个文件,甚至另一个程序。因此,如果您想将缓冲区作为 python 代码运行,而不需要保存和运行文件,您可以简单地执行以下操作:
:w !python
这意味着将当前缓冲区写入
外部程序“python”。这实际上只是将缓冲区的内容直接发送到 python。
现在这就是它变得非常酷的地方。在 vim 中,:w
是一个“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>
取决于您是否要保存到文件。
为某个范围创建一个函数,如this
问题中所述:
如果您想为其绑定一个键,另一种简单的方法是将
makeprg
设置为您的 python 可执行文件::set makeprg=python3
,然后将一个键绑定到 :make<cr>
。在这种情况下,我将设置自动命令来根据文件类型切换
makeprg
。如果你想运行一个简单的语句,你可以使用Python的
-c
开关::!python3 -c 'print("Hello world")'
,或者你可以直接运行
:!python3
,不带参数,在不离开 Vim 的情况下将其放入 REPL 中。
vim 中的另一颗宝石...要运行 shell 命令+捕获所述命令输出,您可以尝试两种方法:
选择目标行作为 shell 命令
run
norm y
let @a = system (getreg('"'))
@a
宏中。norm "ap
(将寄存器的输出粘贴到 vim 缓冲区)
'<,'>w !bash | xclip