从vim执行bash中的当前行
这个问题类似于Vim:执行当前文件? 而不是执行当前文件,我只想执行当前行。
这可能吗?
更新:理想情况下,我正在寻找解决scheme,可以在shell有副作用。 例如,假设我有以下行:
alias foo=bar
在vim中运行命令之后,如果我使用:sh
启动一个shell,别名foo
可用,但是如果我使用:q
退出vim
,那么别名不再可用。
当然,您可以将当前文件的任何内容“写入”另一个程序的标准input:
:.w !bash
这里 (w之前的部分)是指你正在写的行的范围.
只是当前的路线。 然后你使用!bash
把这些行写成bash。
我一直在做这样的事情:
:exec '!'.getline('.')
你甚至可以在.vimrc中创build一个映射:
nmap <F6> :exec '!'.getline('.')
大安的答案也有效,我给了他一个赞成票。
将光标移动到该行,并在正常模式下按下:
!!bash<cr>
如果我能评论,这可能是一个评论。
关于vim中当前缓冲区的redirect/pipe道线到外部命令,大哥巴克尔的很好的回答启发,我写了我在这里回答( https://stackoverflow.com/a/40002312/3625404 ),关于运行python脚本的问题当前缓冲区)。
除了运行整个缓冲区之外,还演示了如何通过外部命令运行一系列的行。 为了节省时间,我只是复制下面。
#####################
在vim中,您可以简单地将当前缓冲区的任何范围redirect到外部命令(无论是bash,python还是自己的python脚本)。
# redirect whole buffer to python :%w !python
假设你的当前缓冲区包含如下两行,
import numpy as np print np.arange(12).reshape(3,4)
那么:%w !python
会运行它,不pipe它是否保存。 并在terminal上打印下面的内容
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
当然,你可以做一些持久的东西,例如一些键盘映射。
nnoremap <F8> :.w !python<CR> vnoremap <F8> :w !python<CR>
第一个运行当前行,第二个运行视觉select,通过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
不低于一个,其中涉及正常的命令,而不是一个命令。
:h command-range