【问题标题】:How do I match a range of range combining diacritical marks in Vim?如何在 Vim 中匹配一系列范围组合变音符号?
【发布时间】:2011-04-02 23:31:04
【问题描述】:

我有一个文件,其中一些行包含带有变音符号的 unicode 字符。 我想删除文件中包含任何 unicode 变音符号的所有行(unicode 0x0300 - unicode 0x0362)。

我可以清除文件中几乎所有其他 unicode,因为范围匹配,如下面的函数:

:g/[{ctrl-v}u0129-{ctrl-v}u0229]/d

但由于某种原因,当范围在变音范围内时,变音符号适用于范围括号,所以我最终得到带有不匹配任何重音的方括号。

可以但是一次匹配一个,例如:g/{ctrl-v}u0301/d,但我宁愿不经过 100 次左右的迭代来确保我得到它们全部。

另外,反向搜索也让我失望了。 :g/[^ -~]/d 将删除包含 {space} 到波浪号范围之外的字符的每一行,除了带有变音符号的行

谢谢

【问题讨论】:

  • 看起来像一个错误:/<C-v>u0301 能够找到变音符号,但 /[\u0301] 不能。
  • 已将其发布到 vim-dev 邮件列表。

标签: vim unicode


【解决方案1】:

我认为 vim 中存在一些错误:集合与变音符号不匹配。您可以使用替代方案作为解决方法:

execute 'g/\('.join(map(range(0x0300, 0x0362), 'printf("\\%%u%04x", v:val)'), '\|').'\)/d'

execute 'g/\('.join(map(range(0x0300, 0x0362), 'nr2char(v:val)'), '\|').'\)/d'

应该做你想做的。

【讨论】:

  • 太棒了。这很完美,我学会了在一行中放弃了一些方便的部分。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2018-01-31
  • 2014-10-10
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多