初学者脚本:^ @出现在文本的末尾

时间:2011-02-24 13:50:33

标签: vim

我正在尝试创建一个有助于创建shebangs的脚本(好吧,它可能没那么有用,但是当你不知道程序在哪里时有优势),这就是我到目前为止所拥有的: / p>

function! CreateShebang()
    call inputsave()
    let program = input('Enter the program name: ')
    call inputrestore()
    let path = system('which ' . program)
    call append(0, '#!' . path)
endfunction

顺便说一下,我刚开始使用vim scrips,所以如果你发现任何错误的功能和概念,或者知道更好的方法来实现结果,请告诉我。任何帮助都非常感谢。

最大的问题是,在运行之后,脚本会正确提示输入程序名称,然后将类似内容添加到文件中:

#!/usr/bin/perl^@

^@在那里做什么?

此外,如果我可以在此处提出其他问题,如何在input()之后清除命令行?用户输入的文本将一直显示,直到输入另一个命令。

2 个答案:

答案 0 :(得分:4)

命令末尾的

^@是由append()函数转换为NULL的换行符,请参阅:h NL-used-for-Nul(这是您substitute(...\%d000...)工作的原因。你的字符串中有NULL)。由于which命令始终在字符串末尾输出换行符,因此建议您通过在[:-2]调用的末尾添加system()来稍微修改代码。这种结构只会去掉函数输出的最后一个字节:

let path = system('which ' . program)[:-2]

如果您使用替代品,请使用

let path=substitute(path, '\n', '', 'g')

,不要将自己与\%d000混淆,这在语义上是错误的。

答案 1 :(得分:1)

which命令输出可能包含NULL字符。

system()函数用<NL>替换换行符。 (来自:help system())。因此你可以这样做:

let path = substitute(system('which ' . program), '\%x00', '', 'g')

否则您可以执行以下操作:

function! CreateShebang()
    call inputsave()
    0 put = '#!/usr/bin/env ' . input('Enter the program name: ')
    call inputrestore()
endfunction