从vim执行bash中的当前行

时间:2013-11-09 22:32:03

标签: bash vim

这个问题与Vim: execute current file?类似,但我没有执行当前文件,而只想执行当前行。

这可能吗?

更新:理想情况下,我正在寻找可在外壳中产生副作用的解决方案。 例如,假设我有以下行:

alias foo=bar

在vim中运行命令后,如果我使用:sh启动shell,则别名foo可用,但如果我使用vim退出:q,则别名不再可用。

7 个答案:

答案 0 :(得分:88)

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

:.w !bash

此处.(w之前的部分)指的是您正在编写的行的范围,.仅是当前行。然后使用!bash将这些行写入bash。

答案 1 :(得分:28)

我一直这样做:

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

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

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

Daan的回答也有效,我给了他一个upvote。

答案 2 :(得分:13)

将光标移动到该行,在正常模式下按:

!!bash<cr>

答案 3 :(得分:5)

如果我可以评论,这可能是评论。

关于vim到外部命令的当前缓冲区的重定向/管道线, 在Daan Bakker的鼓舞人心的答案中,我写道,我在这里回答 (https://stackoverflow.com/a/40002312/3625404),关于一个问题 运行python脚本(当前缓冲区)。

除了运行整个缓冲区外,还演示了如何通过外部命令运行一系列行。 为了节省时间,我只需将其复制到下面。

#####################

在vim中,您可以简单地将当前缓冲区的任何范围重定向到外部命令(无论是bash,python还是您自己的python脚本)。

# redirect 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 write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

对于cmdline范围,请参阅

:h cmdline-ranges

不低于一,关于正常命令,而不是cmdline一。

:h command-range

受到https://stackoverflow.com/a/19883963/3625404

的启发

答案 4 :(得分:1)

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

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

说明:

  1. yy 取消当前行
  2. p 在下面粘贴带圆圈的行(光标移至下一行)
  3. :.!csh<CR> 执行此新粘贴的行(使用csh)。该行的输出将替换当前行,因此在执行该行之前先将其拉下并粘贴到下面。

答案 5 :(得分:0)

如果我在vi / vim中的一行文本上有这样的命令,则

ls -la

将光标置于行上的任何位置并执行 “:。!!”然后按回车键。

那是:冒号点bang bang返回

这将从vi / vim中在当前外壳的该行中执行文本,并将输出插入文本文件中。

我在想你在问什么?就像魔术。

答案 6 :(得分:0)

考虑以下命令在终端上运行,

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