検索時に発音区別符号/アクセントを無視する


12

検索時に発音区別符号/アクセントを無視するようにVimに指示する方法はありますか?たとえば、検索できるようにしたい

kočička

入って

/kocicka

ignorecaseおよびsmartcaseオプションは非常に便利ですが、発音区別符号/アクセントとは何かを持っていないようです。


3
関連::h [[=および:h patterns-composing
ムル

回答:


16

コメントで@muruが言及したように、:help /[[類似クラスのセットとして評価される文字クラス式であると思われる等価クラス(で説明)を使用できます(つまり、アクセント記号や発音区別符号を削除すると同じになります)。

たとえば、同じパターンを検索するkočičkakocickaは、これを使用できます。

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

where [[=c=]]は、cキャラクターの等価クラスです。


c検索の実行中にヒットするたびにこの文字クラスを自動的に挿入するには、次のマッピングを使用できます。

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

次のように分類できます。

  • <expr> 式の評価を入力します
  • getcmdtype() =~ '[?/]' 後方検索と前方検索のどちらを書いているかをテストします
  • '[[=c=]]'c前のテストが成功した場合、キャラクターの等価クラスを返します
  • 'c'cそうでなければ文字を返します

前のマッピングには2つの欠点があります。

  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čkaマッチはkocicka、あなたが使用することができます'[[:lower:][:upper:]]'代わりに'\a'。代替案'[:alpha:]''\I'マルチバイト文字で動作するようには思えません。ただし、動作して'[^[:punct:]]'いるように見えますが(確信はありませんが)、独自の等価クラス(例:)も構築すると思います'[А-яЁё]'
ケビンローラー

そのための設定があればいいのに。[[= c =]]を使用している間は動作しますが、タイプミスにより、バックスペースを7回クリックする必要があります。同様に、読みやすさが低下します。
ダリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.