Faire correspondre le mot contenant des caractères au-delà de a-zA-Z

15

Pour faire correspondre un mot, on peut utiliser

\v(\w+)

Depuis l'aide de vim :h \w:

\ w caractère de mot: [0-9A-Za-z_]

Cela fonctionne exactement comme décrit dans le manuel. Cependant, je veux faire correspondre des mots qui contiennent des caractères au a-z- delà , par exemple prästgården . La correspondance de l'expression régulière \v(\w+)contre prästgården donne lieu à trois correspondances, au lieu de cela:

prästgården
^^ ^^^ ^^^^

Comment faire correspondre des mots contenant des caractères au a-z- delà ? Mon environnement local est défini sur l'anglais et si possible, je voudrais que cela reste ainsi.

Modifier: les mots peuvent ne pas appartenir à un seul lieu, par exemple

prästgården
treść
Marco
la source
Les classes de caractères POSIX (par exemple [[:alpha:]]\+dans ce cas) sont censées faire ce que vous voulez ici, mais selon les documents Vim ( :help regex), cela ne fonctionne pas: "Ces éléments ne fonctionnent que pour les caractères 8 bits." Il se trouve que cela fonctionne ici avec Vim 7.3 sur OS X 10.8, mais Vim 7.3 sur Linux ne fonctionne pas, donc je suppose qu'il y a quelque chose d'Apple spécifique à ce Vim qui le permet. Vous constaterez également que le faire via la liaison Vim Perl échoue également, même si Perl a une très bonne prise en charge Unicode. Vous devrez peut-être basculer vers un script Perl externe, afin de pouvoir activer la prise en charge complète d'Unicode.
Warren Young
Par ailleurs, si vous allez avec Perl, vous souhaitez utiliser à la \p{Word}place d'une classe de caractères POSIX. Il existe de nombreux cas d'exception dans la gestion des classes de caractères POSIX de Perl, que vous évitez lorsque vous utilisez des propriétés Unicode à la place.
Warren Young

Réponses:

9

Vim (à partir de la version 7.3) est très limité en ce qui concerne la prise en charge des caractères non ASCII dans les modèles. En particulier, \wne correspond qu'aux lettres ASCII, ce qui est d'une utilité limitée.

Il existe quelques modèles de classe de caractères qui prennent en charge Unicode. Ce qui vous intéresse \I, qui correspond en gros aux lettres et uniquement aux lettres, plus _et @. Au moins sur Debian Squeeze (dans un environnement local UTF-8), il y a des erreurs; par exemple, ×et ÷correspondent à des lettres, mais toutes les lettres accentuées latines semblent être reconnues correctement. \Ipeut être configuré via l' isidentoption, au moins pour la partie ASCII.

Si vous souhaitez un support sérieux Unicode, vous devrez vous fier à un outil externe. Par exemple, perl -C -e '/\p{L}/'pour faire correspondre les lettres UTF-8 (en supposant une locale UTF-8).

Gilles 'SO- arrête d'être méchant'
la source
3

Utilisez \k. Voir iskeywordoption.

Hans Ginzel
la source
2

Cela fonctionne aussi pour le cyrillique

\v\k

Un peu plus compliqué et échoue avec le cyrillique

\v(\c[0-9a-z_[=a=][=c=][=e=][=i=][=l=][=n=][=o=][=r=][=s=][=t=][=u=][=y=][=z=]])

Doc .

Testé sur Vim 7.4.

pevik
la source
J'ajouterais [=l=]à la liste qui couvrirait ł(par exemple złoty), etc. aussi. Mais cela échoue déjà pour le russe. Quoi qu'il en soit, merci pour le partage.
Marco