有没有一种方法可以指示Vim在搜索时要忽略变音符号/重音符号?例如,我希望能够搜索
kočička
通过输入
/kocicka
在ignorecase
和smartcase
选项是非常有用的,但他们似乎并不有什么关系变音符号/口音。
有没有一种方法可以指示Vim在搜索时要忽略变音符号/重音符号?例如,我希望能够搜索
kočička
通过输入
/kocicka
在ignorecase
和smartcase
选项是非常有用的,但他们似乎并不有什么关系变音符号/口音。
Answers:
正如@muru在评论中提到的那样,您可以使用等价类(在:help /[[
中进行了描述),它似乎是一个字符类表达式,被评估为一组相似的字符(即,一旦删除任何重音符号或变音符号,它们都是相同的)。
例如,要查找kočička
并kocicka
使用相同的模式,可以使用以下命令:
ko[[=c=]]i[[=c=]]ka
角色[[=c=]]
的等效类在哪里c
。
要c
在执行搜索时点击时自动插入此字符类,可以使用以下映射:
cnoremap <expr> c getcmdtype() =~ '[?/]' ? '[[=c=]]' : 'c'
可以这样分解:
<expr>
输入表达式的求值getcmdtype() =~ '[?/]'
测试您正在编写向后搜索还是向前搜索'[[=c=]]'
c
如果先前的测试成功,则返回字符的等效类'c'
c
否则返回字符以前的映射有两个缺点:
c
角色可以通过重新映射来改进它,<CR>
如下所示:
cnoremap <CR> <C-\>e getcmdtype() =~ '[?/]' ? substitute(getcmdline(), '\a', '[[=\0=]]', 'g'): getcmdline()<CR><CR>
当您<CR>
在编写了用于搜索的模式后点击时,映射将自动将所有字母字符替换为对应的等价类。
的映射<CR>
与之前的映射相似c
,不同之处在于它不使用参数,<expr>
而是使用系统映射<C-\>e
。
<expr>
允许您插入表达式的求值,同时<C-\>e
允许您将整个命令行替换为表达式的求值。
/kočička
matchs)kocicka
,则可以使用'[[:lower:][:upper:]]'
代替'\a'
。替代品'[:alpha:]'
和'\I'
没有似乎与多字节字符工作; 但是,它'[^[:punct:]]'
似乎可以工作(尽管我不太确定),而且我想也可以建立自己的等效类(例如'[А-яЁё]'
)。
:h [[=
和:h patterns-composing
。