搜索时忽略变音符号/重音符号


Answers:


16

正如@muru在评论中提到的那样,您可以使用等价类(在:help /[[中进行了描述),它似乎是一个字符类表达式,被评估为一组相似的字符(即,一旦删除任何重音符号或变音符号,它们都是相同的)。

例如,要查找kočičkakocicka使用相同的模式,可以使用以下命令:

ko[[=c=]]i[[=c=]]ka

角色[[=c=]]的等效类在哪里c


c在执行搜索时点击时自动插入此字符类,可以使用以下映射:

cnoremap <expr> c getcmdtype() =~ '[?/]' ? '[[=c=]]' : 'c'

可以这样分解:

  • <expr> 输入表达式的求值
  • getcmdtype() =~ '[?/]' 测试您正在编写向后搜索还是向前搜索
  • '[[=c=]]'c如果先前的测试成功,则返回字符的等效类
  • 'c'c否则返回字符

以前的映射有两个缺点:

  1. 它只覆盖c角色
  2. 它会使图案难以阅读

可以通过重新映射来改进它,<CR>如下所示:

cnoremap <CR> <C-\>e getcmdtype() =~ '[?/]' ? substitute(getcmdline(), '\a', '[[=\0=]]', 'g'): getcmdline()<CR><CR>

当您<CR>在编写了用于搜索的模式后点击时,映射将自动将所有字母字符替换为对应的等价类。


的映射<CR>与之前的映射相似c,不同之处在于它不使用参数,<expr>而是使用系统映射<C-\>e
<expr>允许您插入表达式的求值,同时<C-\>e允许您将整个命令行替换为表达式的求值。


1
此外,如果您想反向搜索(例如/kočičkamatchs)kocicka,则可以使用'[[:lower:][:upper:]]'代替'\a'。替代品'[:alpha:]''\I'没有似乎与多字节字符工作; 但是,它'[^[:punct:]]'似乎可以工作(尽管我不太确定),而且我想也可以建立自己的等效类(例如'[А-яЁё]')。
kevinlawler '18

我希望有一个设置。虽然使用[[= c =]]可行,但键入错误意味着您需要单击Backspace 7次。可读性也受到损害。
daliusd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.