【问题标题】:Beginner scripting: ^@ appearing at the end of text初学者脚本:^@ 出现在文本末尾
【发布时间】:2011-02-24 13:50:32
【问题描述】:

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

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

顺便说一句,我只是从 vim 脚本开始,所以如果您发现任何错误的功能和概念或知道实现结果的更好方法,请告诉我。非常感谢任何帮助。

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

#!/usr/bin/perl^@

^@ 在那里做什么?

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

【问题讨论】:

  • 回答另一个问题(它是题外话,所以使用评论):尝试redraw,或者,如果它没有帮助redraw!。请注意,我以前写在input()之后,但因为一些我现在不记得的问题而放弃了。

标签: vim


【解决方案1】:

命令末尾的^@ 是由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 混淆。

【讨论】:

  • 感谢 ZyX 的解释和重绘提示。现在一切正常。
【解决方案2】:

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

system() 函数用<NL>s 替换换行符。 (来自: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

【讨论】:

  • @Benoit,这个脚本的大部分灵活性来自which,但路径并不总是相同的。但是你提示它是一个空字符帮助我解决了这个问题,只需调用substitute(path, "\\%d000", "", "")。可能不是最好的解决方案,但目前有效。关于清除命令行,我想我会坚持使用echo(这样,没有参数)。谢谢贝努瓦
  • @Benoit,请忽略我对which 用法部分的最新评论。没注意到你聪明的“/usr/bin/env”吧。
  • -1:你错了:系统函数不能用 NULL 替换换行符,因为 C 字符串中不可能有 NULL(参见 :h expr-string 的最后一条注释)。替换由append() 函数完成,参见:h NL-used-for-Nul。总体思路:在可以获取/返回行列表的函数/命令中,NL 表示 NULL,并且列表项被认为是由 NL 分隔的。 :h system()中提到的只是替换不同系统上的行尾,你可以检查:echo string(system('echo -e ''a\0b''')):它会回显一个a。
  • 顺便说一下,\x00 在模式中表示十六进制数字后跟两个零。
  • @ZyX:你是对的,正确的表达是\%x00。我已经测试过了。 system('which which.exe') 将有尾随换行符,而替换 \%x00 会删除它。
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2010-10-12
相关资源
最近更新 更多