Vimscript删除控制字符

时间:2018-09-26 15:37:38

标签: vim

我有一个如下所示的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 ^@

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

2 个答案:

答案 0 :(得分:3)

append()函数是底层函数。 :help append()显示{expr}作为 String 类型作为一个文本行插入 ,而不考虑其内容中的换行符。 ^@是一行中\n的表示; cp :help <Nul>

如果您确实想继续使用append(),则必须提供 List 类型;为此,您可以split()您的字符串:

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

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

put =sane

这将:

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

答案 1 :(得分:0)

append替换对put=sub的调用会产生所需的结果。