从vim执行bash中的当前行

mer*_*011 58 vim bash

这个问题类似于Vim:执行当前文件? 但我没有执行当前文件,而只想执行当前行.

这可能吗?

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

alias foo=bar
Run Code Online (Sandbox Code Playgroud)

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

Daa*_*ker 99

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

:.w !bash
Run Code Online (Sandbox Code Playgroud)

这里.(w之前的部分)指的是你正在写的行的范围,并且.只是当前行.然后你用!bash这些行写入bash.

  • @AlecJacobson 你可以试试这个:`yy` 拉出当前行,然后`:!<Control-r>"` 将当前行的内容粘贴到 Vim 命令行中。 (2认同)
  • 我将这个命令绑定到`〜/ .vimrc`中的`,r`,其中包括:`nnoremap,r:.w!bash <CR>`.现在在命令模式下,要执行一行,将光标移动到该行并输入`,r`.输出将直接显示在编辑器中. (2认同)

cfo*_*ish 31

我一直这样做:

:exec '!'.getline('.')
Run Code Online (Sandbox Code Playgroud)

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

nmap <F6> :exec '!'.getline('.')
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个答案。您还可以使用 `@"` 而不是 `.getline('.')` 来执行拉出的文本而不是一行。 (3认同)

Ken*_*ent 15

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

!!bash<cr>
Run Code Online (Sandbox Code Playgroud)

  • 这具有用输出替换当前线的不幸效果,这是不期望的. (3认同)
  • @merlin2011 如果外部 (bash) 命令有输出,您不想在缓冲区中显示它吗?或者你想要它低于“当前行”? (2认同)

qea*_*tzy 5

如果可以发表评论,这可能是评论。

关于vim到外部命令的当前缓冲区的重定向/管道线,灵感来自Daan Bakker的出色答案,我在这里写了我的答案(/sf/answers/2800161871/),关于运行python脚本的问题(当前缓冲区)。

除了运行整个缓冲区之外,还演示了如何通过外部命令运行一定范围的行。为了节省时间,我只在下面复制它。

#####################
Run Code Online (Sandbox Code Playgroud)

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

# redirect whole buffer to python
:%w !python
Run Code Online (Sandbox Code Playgroud)

假设您当前的缓冲区包含两行,如下所示,

import numpy as np
print np.arange(12).reshape(3,4)
Run Code Online (Sandbox Code Playgroud)

然后:%w !python将其运行(无论是否已保存)。并在您的终端上打印以下内容,

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
Run Code Online (Sandbox Code Playgroud)

当然,您可以使某些内容持久化,例如,一些键盘映射。

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>
Run Code Online (Sandbox Code Playgroud)

第一个运行当前行,第二个运行可视化选择,通过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').
Run Code Online (Sandbox Code Playgroud)

有关cmdline范围,请参见

:h cmdline-ranges
Run Code Online (Sandbox Code Playgroud)

不低于1,这与正常命令有关,而不是命令1。

:h command-range
Run Code Online (Sandbox Code Playgroud)

/sf/answers/1391877441/启发


Roh*_*ige 5

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

nmap <leader>E yyp:.!csh<CR>
Run Code Online (Sandbox Code Playgroud)

解释:

  1. yy 撤回当前行
  2. p 粘贴下面拉出的行(光标转到下一行)
  3. :.!csh<CR>csh就地 执行(使用)这个新粘贴的行。该行的输出替换了当前行,因此在执行之前该行被拉出并粘贴到下面。