我正在尝试创建一个有助于创建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()
之后清除命令行?用户输入的文本将一直显示,直到输入另一个命令。
答案 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