如何检测 vim 字符串或寄存器中的空字符(0x00)?

如何检测 vim 字符串或寄存器中的空字符(0x00)?

我有一个包含字符串的 vim 寄存器。我需要遍历字符串中的每个字符,并分别处理每个字符。

我的问题是,给定从字符串中提取的一个字符,我无法区分空0x00字符和换行符之间的区别0x0a

因为寄存器是由 v:register 指定的,所以我不能(据我所知)在脚本中直接访问寄存器,以便对其进行索引(我很乐意被纠正),所以我必须先复制/引用寄存器,然后对其let l:string = getreg(v:register)进行操作l:string

我已尝试以下方法;-

  1. char2nr(l:string[x])- 总是返回一个空字符0x0a
  2. match(l:string[x], '[\x0]')- 比赛0x000x0a角色!
  3. match(l:string[x], '\%x00')- 比赛0x000x0a角色!(虽然我敢发誓这在某一时刻确实对我有用 - 也许我失去了情节?)
  4. 我甚至尝试将字符粘贴到缓冲区,希望使用映射g8来读回它的值(即exe "normal! r".l:string[x]."\<esc>"),但它粘贴了一个换行符0x0a
  5. 坦白说,还有一些事情我现在已经忘记了

有人知道我该如何实现这一点吗?令人沮丧的是,当 nul 字符出现在缓冲区中时,vim 可以完美地处理它们(并且可以直观地选择和提取它们,然后再次粘贴它们,没有任何问题)。但尝试处理字符串或寄存器中包含的 nul 似乎有问题。

仅供参考,文档char2nr()指出

“文件中的 NUL 字符用 指定nr2char(10),因为 NUL 用换行符表示。 nr2char(0)是真正的 NUL 并终止字符串,因此导致空字符串”

这似乎有些不准确(或者不是全部),因为文件/缓冲区中的 nul 字符可以正确处理。并且包含 nul 的寄存器仍然可以粘贴到文档中,并且会正确粘贴为 nul。所以有些东西正在区分 nul 和换行符

任何帮助将不胜感激

相关内容