从 Vim 执行 Bash 中的当前行

这个问题类似于 < a href = “ https://stackoverflow. com/questions/15449591/Vim-execute-current-file”> Vim: execute current file? ,但是我想只执行当前行而不执行当前文件。

这可能吗?

理想情况下,我正在寻找解决方案,可以有副作用的外壳。

例如,假设我有以下一行:

alias foo=bar

在 Vim 中运行命令之后,如果使用 :sh启动 shell,别名 foo是可用的,但是如果使用 :q退出 vim,那么别名将不再可用。

27990 次浏览

当然,你可以将当前文件的任何内容写入另一个程序的 标准输入:

:.w !bash

这里的 .(什么之前的部分)是指你正在写的行的范围,而 .只是当前的行。然后使用 !bash将这些代码行写到 Bash。

将光标移动到该行,在普通模式下按下:

!!bash<cr>

我经常这么做:

:exec '!'.getline('.')

您甚至可以在.vimrc 中创建一个映射:

nmap <F6> :exec '!'.getline('.')

如果我可以评论的话,这可能是一个评论。

关于 Vim 中当前缓冲区到外部命令的重定向/管道线,受到 Daan Bakker 的伟大回答的启发,我在这里写了我的回答 (< a href = “ https://stackoverflow. com/questions/601039/Vim-Save-and-run-at-the-same-time/40002312 # 40002312”> 在 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

不是下面的那个,关于普通命令,不是 cmdline 1。

:h command-range

这是受到 在 Vim 中执行 Bash 中的当前行的启发。

如果我在 vi/Vim 中的一行文本上有这样的命令”

LS-la

将光标放在线上的任何位置,然后执行 “ . . !”然后按回车键。

就是: 冒号点碰碰返回

它将从 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

将此映射添加到您的. vimrc 文件,

nmap <leader>E yyp:.!csh<CR>

说明:

  1. 拔掉电源线
  2. 粘贴下面的拉线(光标移动到下一行)
  3. 就地执行(使用 csh)这个新粘贴的行。这一行的输出代替了当前的这一行,因此在执行该行之前会被拉出并粘贴到下面。