2012-06-07 6 views
8

Unicode especifica que \X should match an "extened grapheme cluster" - por ejemplo, un carácter base seguido de cero o más caracteres de combinación. (Creo que esto es una simplificación, pero puede ser suficiente para mis necesidades.)¿Vim tiene un equivalente a X para coincidir con los "clústeres de grafemas" de Unicode?

Estoy bastante seguro de que al menos Perl admite \X en sus expresiones regulares.

Pero Vim define \X para que coincida con un dígito hexadecimal no.

¿Vim tiene un equivalente a \X o de cualquier forma que coincida con un clúster de grafemas extendido Unicode?

Vim tiene un concepto de combinar o "componer" caracteres, pero its documentation no cubre si son compatibles o no en expresiones regulares.

Parece que Vim aún no soporta esto directamente, pero todavía estoy interesado en una solución donde una búsqueda resaltará todos los caracteres que incluyen una combinación de caracteres en al menos la gama más básica de U+0300 a U+0364.

+0

¿Qué es exactamente lo que quieres hacer? ¿Podría proporcionar un caso de muestra? ¿Quieres unir esos "caracteres" como à o Æ? – romainl

+0

Voy a escribir algunos códigos JavaScript para convertir entre caracteres en georgiano y varios esquemas de transliteración oficiales y ad-hoc. Algunos de estos caracteres pueden implicar la combinación de caracteres, por lo que quiero asegurarme de que mis herramientas sean capaces de trabajar con ellos, incluso decirme qué texto encuentro en la naturaleza y pegarlo contiene esos caracteres. – hippietrail

+0

Por ejemplo, podría necesitar manejar 'J̌' (' 004a 030c'). Pero, en términos más generales, solo quiero saber si Vim tiene o planea tener soporte para esto, ya que cada vez es más común que los programadores estadounidenses tengamos que lidiar con tales cosas. – hippietrail

Respuesta

3

Si la instalación de Vim se compila con perl support, puede ser capaz de ejecutar:

:perldo s/\X/replacement/g 

he instalado vim-nox en debian (que contiene el soporte en Perl), y combinando \X con perldo trabaja de hecho, pero No estoy seguro de que haga lo que quiera, ya que todos los caracteres normales también se corresponden y no parece que perldo lo hará resaltar en vim.

Si bien no es perfecto, si puede obtener soporte para Perl, puede usar bloques y categorías Unicode. Lo que significa que puede usar \p{Block: Combining_Diacritical_Marks} o \p{Category: Nonspacing_Mark} para, al menos, detectar ciertos caracteres, aunque todavía no obtendrá resaltado.

+0

También tengo gVim en Windows, así que tampoco tengo soporte para Perl. Y, de hecho, solo quería buscar y destacar esos personajes por ahora en lugar de reemplazarlos. – hippietrail

+0

¡Gracias por su esfuerzo para ver qué es posible! – hippietrail

+0

@hippietrail Tengo vim y gvim en "windows" (vino) y puedo decir que funciona muy bien con fresas perl. Lo compilé yo solo, pero anteriormente usé vim de [tuxproject] (http://tuxproject.de.nyud.net/projects/vim/) y funcionó bien con fresas perl también. Sin embargo, debe tener la misma versión de Perl que la que figura en la página del proyecto. – ZyX

3

Puede buscar todos los caracteres y hacer caso omiso a componer caracteres con \Z. O puede buscar una gama de caracteres Unicode. Lea :help /[] para obtener más información sobre ambos.

El último mensaje aquí puede ofrecer más ayuda:

http://vim.1045645.n5.nabble.com/using-regexp-to-search-for-Unicode-code-points-and-properties-td1190333.html

Pero expresión regular de Vim no tiene una clase de caracteres como Perl.

+0

hilo muy informativo, gracias. – romainl

+1

Si bien '\ Z' es interesante, no hace lo que el OP quiere, que es hacer coincidir, p. '004a 030c' pero ** not ** simplemente' 004a', aunque esto no está directamente claro en el texto de la pregunta, sino en "decirme qué texto ... contiene tales caracteres" en los comentarios. – beerbajay

+0

Entiendo. Esperaba que alguien fuera capaz de combinar '\ Z' con' \ [] 'para encontrar la respuesta. Había intentado '\ [\ Z^\ w]' pero eso no funcionó. @romainl fue capaz de dar un paso más, pero aún no estamos totalmente allí. –

Cuestiones relacionadas