Ignorare segni / accenti durante la ricerca


12

C'è un modo per istruire Vim che voglio ignorare i segni / gli accenti durante la ricerca? Ad esempio, vorrei essere in grado di cercare

kočička

entrando

/kocicka

Le opzioni ignorecasee smartcasesono molto utili, ma non sembrano avere nulla a che fare con segni / accenti diacritici.


Risposte:


16

Come menzionato @muru nel commento , potresti usare una classe di equivalenza (descritta in :help /[[) che sembra essere un'espressione di classe di caratteri valutata come un insieme di caratteri simili (cioè sono gli stessi una volta rimosso qualsiasi accento / diacritico).

Ad esempio, per cercare kočičkae kocickacon lo stesso modello, è possibile utilizzare questo:

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

dove [[=c=]]è la classe di equivalenza per il cpersonaggio.


Per inserire automaticamente questa classe di caratteri ogni volta che si colpisce cdurante l'esecuzione di una ricerca, è possibile utilizzare questo mapping:

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

che può essere scomposto in questo modo:

  • <expr> digitare la valutazione di un'espressione
  • getcmdtype() =~ '[?/]' verifica se stai scrivendo una ricerca indietro o avanti
  • '[[=c=]]'restituisce la classe di equivalenza per il ccarattere se il test precedente ha avuto esito positivo
  • 'c'restituisce il cpersonaggio altrimenti

La mappatura precedente presenta 2 svantaggi:

  1. copre solo il cpersonaggio
  2. può rendere difficile la lettura del modello

Potrebbe essere migliorato rimappando in <CR>questo modo:

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

Quando si colpisce <CR>dopo aver scritto un modello per una ricerca, la mappatura sostituirà automaticamente tutti i caratteri alfabetici con la loro controparte della classe di equivalenza.


Il mapping per <CR>è simile al mapping precedente per c, tranne per il fatto che non utilizza l'argomento <expr>ma il mapping di sistema <C-\>e.
<expr>consente di inserire la valutazione di un'espressione, mentre <C-\>econsente di sostituire l'intera riga di comando con la valutazione di un'espressione.


1
Inoltre, se si desidera andare nella direzione opposta, ad esempio le /kočičkapartite kocicka, è possibile utilizzare '[[:lower:][:upper:]]'invece di '\a'. Le alternative '[:alpha:]'e '\I'non sembrano funzionare con caratteri multibyte; tuttavia, '[^[:punct:]]'sembra funzionare (anche se ne sono meno sicuro), e immagino anche di costruire la tua classe di equivalenza (ad esempio '[А-яЁё]').
Kevinevler

Vorrei che ci fosse un'ambientazione per quello. Mentre si utilizza [[= c =]] funziona, ma mistype significa che è necessario fare clic su backspace 7 volte. Anche la leggibilità ne soffre.
daliusd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.