我和您有同样的愿望:我想编写普通的vim命令并让它们编辑管道流。我对默认vim选项提供的以这种方式使用普通vim的困难(这么多标志!)感到失望。
因此,我在vim上写了一个小的包装来做到这一点:https : //github.com/MilesCranmer/vim-stream/。叫做vims
。
包装程序的核心是以下命令:
vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2
使用此命令,通过我执行的命令生成,它非常简洁,并且由于vim是模式编辑器,因此我制作vims
了模式流编辑器。有三种主要模式可用于管道编辑思维方式:
[-t|--turn-off-mode] - (Default mode)
Every string is a vim command line, e.g., '%g/foo/d' deletes
all lines with foo.
[-e|--exe-mode] - Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] - Like exe-mode, but runs on 1st line only
看这个:
$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World
因此,e
转到的末尾Hello
,然后a
开始追加。
在exe模式下,有些幻想者注释掉包含的行my_bad_var
,并删除前一行。
cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'
转换为vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
- I
是在行首开始插入的命令,并且//
是注释序列。
\<esc>kdd
按下退出键,向上移动一行,然后删除该行。
我在仓库中总共有11个示例,我建议您检查一下。同样,这是在vim之上运行的,这只是使vim更像sed进行流输入的一种方法(但保留了所有您钟爱的vim宏!)
|
字符管一个命令的输出到另一个。wea-this
不是命令。管道也不能用于实现您想要的目的;这会使Vim的stdin成为左手应用程序,而不是键盘。如果要将stdin放入vim的缓冲区中,请以减号开头以指定文件名:echo Hello, world! | vim -
。