vim脚本在stdin中留下字符

时间:2015-01-06 19:50:42

标签: bash vim vi prompt

我正在尝试使用带-s选项的vim来运行一个替换文件中某些行的脚本(text.txt):

test1
ab
ac
ae
test2
sd

脚本文件是这样的(脚本):

:silent %s/test1\zs\_.\+\zetest2/\=substitute(submatch(0), '\n\(\w\)', '\n#\1', 'g')/g
:wq

它注释掉test1和test2之间的界限。这就是我想要的。我不想要的是在提示之前和之后输出。我跑了然后得到:

user@hostname: ~/vimtest$ vim -s script text.txt 
^[[?1;2cuser@hostname: ~/vimtest$ 1;2c

所以这个^[[?1;2c已经是坏消息,但1;2c在输入中就像我已经输入它一样。如果我点击输入它会给我一个bash错误。因此,每次使用脚本时我都必须删除这些符号。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

似乎vim(或某些vim启动脚本)试图找出您正在使用的终端类型。 ^[[?1;2c,在输入缓冲区中保留最后几个字符,几乎可以肯定是终端仿真器对DA(设备属性)查询的响应的一部分。您可以通过键入bash来自己看到:

printf '\033[c'

或者,要查看完整的返回,请暂停一下:

printf '\033[c'; sleep 0.1; echo

响应\033[?1;2c表示“我是具有高级视频选项的VT100。”,这是xterm和许多其他控制台程序响应的内容。 (Linux控制台本身响应\033[?6c,这意味着“我是VT102。”

顺便说一下,只有1;2c留在控制台输入缓冲区中的原因是初始转义码\033[?在读取时被忽略了。 readline库将忽略它而不回显它,而正常的控制台输入将回显它然后忽略它;这就是上面两个shell命令不同的原因。

我无法使用vim安装重现此问题,因此我甚至不知道从哪里开始查找。但您可能会尝试查看禁用所有启动文件是否有帮助:

vim -u NONE -s script text.txt

如果有帮助,请逐个停用已安装的扩展程序,直至找到导致问题的扩展程序。

答案 1 :(得分:1)

:%s/test1\zs\_.\+\ze\ntest2/\=substitute(submatch(0), '\n', '\n#', 'g')/g
:wq

这是在这里测试的,它以所需的方式更改了输入文件。

根据您的命令进行了一些更改:

  • \n
  • 之后添加\ze
  • 在substitute()函数中我们只能处理\n,我们不需要在\n
  • 之后捕获单词

答案 2 :(得分:1)

我注意到你用bash标记了问题,所以我认为也应该接受shell解决方案。

awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' file

这个awk oneliner应该为你做到这一点。 vim是非常强大的编辑器,我喜欢vim。但是如果你想做一些自动转换,我更喜欢脚本或适当的文本处理工具。在Linux机器上,你总能找到一个。它更容易测试和调试。

使用您的输入进行测试:

kent$  cat f
test1
ab
ac
ae
test2
sd

kent$  awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' f
test1
#ab
#ac
#ae
test2
sd

如果要将文本保存回文件,可以:

awk '...' file > tmp.file && mv tmp.file file