有没有一种方法可以指示Vim在搜索时要忽略变音符号/重音符号?例如,我希望能够通过输入

kočička


ignorecase搜索

/kocicka


smartcase选项非常有用,但它们似乎与变音符号/重音符号没有任何关系。

评论

相关::h [[=和:h模式组成。

#1 楼

如评论中@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字符other明智的


以前的映射有2个缺点:


它仅覆盖c字符
它会使模式难以阅读

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

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


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


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

评论


此外,如果您想反向移动,例如/kočička匹配kocicka,则可以使用'[[:lower:] [:upper:]]'代替'\ a'。备选方案'[:alpha:]'和'\ I'似乎不适用于多字节字符;但是,'[^ [:punct:]]'似乎可以工作(尽管我不太确定),而且我想也可以构建自己的等效类(例如'[А-яЁё]')。

–kevinlawler
18年1月3日在21:04



我希望有一个设置。虽然使用[[= c =]]可行,但键入错误意味着您需要单击Backspace 7次。可读性也受到损害。

– daliusd
19年2月7日在11:17