Vimscript 删除控制字符



>我有一个如下所示的 vimscript 函数,它可以在当前拉动/复制的文本缓冲区上执行搜索和替换并将它们粘贴到文件中。

function Repaste(s, ...)
for i in a:000
let sub = substitute(getreg('"'), a:s, i, 'ge')
let sane = substitute(sub, '[^[:print:]]', 'n', 'ge')
call append(line('.'), sane)
endfor
endfunction
command -nargs=* RP call Repaste(<f-args>)

当我调用这个函数时,我得到^@字符来代替换行符。 这是拉动/复制的文本的示例

set cindent

下面是执行的命令的示例

:RP c d e f

这是输出

set findent ^@  
set eindent ^@ 
set dindent ^@

如何删除这些字符以及它们为什么会出现?谢谢。

append()函数是一个低级函数。:help append()显示作为字符串类型的{expr}作为文本行插入,而不考虑其内容中的换行符。^@是线条内n的表示;CP:help <Nul>.

如果你真的想继续使用append(),你必须提供一个List类型;要获得这个,你可以split()你的 String:

call append(line('.'), split(sane, 'n'))

但是,我认为最好使用更高级别的函数插入创建的行,使用带有表达式寄存器的:put插入变量的内容:

put =sane

这将:

  • 自动处理嵌入式换行符
  • 将更改标记设置为插入的文本'[']
  • 打印消息4 more lines(如果插入的号码超过'report'阈值(。

将调用替换为appendput=sub将生成所需的结果。

最新更新