有没有一种方法可以指示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čkamatchs)kocicka,则可以使用'[[:lower:][:upper:]]'代替'\a'。替代品'[:alpha:]'和'\I'没有似乎与多字节字符工作; 但是,它'[^[:punct:]]'似乎可以工作(尽管我不太确定),而且我想也可以建立自己的等效类(例如'[А-яЁё]')。
:h [[=和:h patterns-composing。