这个问题类似于Vim:执行当前文件?,但我不想执行当前文件,而是只想执行当前行。
这可能吗?
理想情况下,我正在寻找可能在外壳中产生副作用的解决方案。
例如,假设我有以下行:
alias foo=bar
在 Vim 中运行命令后,如果我使用 启动 shell :sh
,则别名foo
可用,但如果我退出vim
使用:q
,则别名不再可用。
这个问题类似于Vim:执行当前文件?,但我不想执行当前文件,而是只想执行当前行。
这可能吗?
理想情况下,我正在寻找可能在外壳中产生副作用的解决方案。
例如,假设我有以下行:
alias foo=bar
在 Vim 中运行命令后,如果我使用 启动 shell :sh
,则别名foo
可用,但如果我退出vim
使用:q
,则别名不再可用。
当然,您可以将当前文件的任何内容“写入”到另一个程序的标准输入中:
:.w !bash
这里.
(w之前的部分)是指您正在编写的行的范围,并且.
只是当前行。然后,您使用!bash
将这些行写入 Bash。
我一直在做这种事情:
:exec '!'.getline('.')
你甚至可以在你的 .vimrc 中创建一个映射:
nmap <F6> :exec '!'.getline('.')
将光标移动到该行,然后在正常模式下按:
!!bash<cr>
如果我可以发表评论,这可能是评论。
关于 Vim 中当前缓冲区的重定向/管道到外部命令,受 Daan Bakker 的出色回答的启发,我写了我在这里回答(在 Vim 中同时保存和运行),关于运行 Python 脚本(当前缓冲区)的问题.
除了运行整个缓冲区之外,还演示了如何通过外部命令运行一系列行。
为了节省时间,我把它复制在下面。
#####################
在 Vim 中,您可以简单地将当前缓冲区的任何范围重定向到外部命令(无论是“bash”、“python”还是您自己的 Python 脚本)。
# Redirect the whole buffer to 'python'
:%w !python
假设您当前的缓冲区包含如下两行,
import numpy as np
print np.arange(12).reshape(3,4)
然后:%w !python
将运行它,无论是否保存。并在您的终端上打印如下内容,
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
当然,您可以使某些东西持久化,例如,一些键盘映射。
nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>
第一个运行当前行。第二个通过 Python 解释器运行视觉选择。
#!! Be careful, in Vim ':w!python' and ':.w !python' are very different, the
first writes (creates or overwrites) a file named 'python' with thew contents of
the current buffer. The second redirects the selected cmdline range (here dot .,
which mean current line) to an external command (here 'python').
有关 cmdline 范围,请参阅
:h cmdline-ranges
不是下面的,是关于普通命令的,不是命令行的。
:h command-range
将此映射添加到您的 .vimrc 文件中,
nmap <leader>E yyp:.!csh<CR>
解释:
yy
Yank 当前行p
粘贴下面的拉线(光标转到下一行):.!csh<CR>
执行(使用csh
)这个新粘贴的行。该行的输出替换了当前行,因此在执行之前该行被拉出并粘贴到下面。如果我在 vi/Vim 中的一行文本上有这样的命令“
ls -la
将光标定位在该行的任意位置并执行“:.!!” 然后按回车。
即:冒号 dot bang bang return
这将从 vi/Vim 中执行当前 shell 中该行中的文本,并将输出插入到文本文件中。
我想这就是你要问的?这就像魔术一样。
考虑在终端上运行以下命令,
seq 0 10 | xargs printf "%02x "
预期输出是,
00 01 02 03 04 05 06 07 08 09 0a
考虑您将上述命令写入文件中。要执行此命令,在该文件中获取相应的输出,您可以在您的 .vimrc 中添加此映射,
nmap <leader>E :exec 'r!'.getline('.')<CR>
请注意,要执行上述行,您需要通过为 ' %
' 添加转义字符来编写它,如下所示,
seq 0 10 | xargs printf "\%02x "
进入文件中的这一行,然后按<leader>E
。在我的情况下,<leader>
映射到,
因此我将按,E