2008-11-26 15 views
7

Estoy tratando de agregar un marcado especial a las cadenas de documentación de Python en emacs (modo python).Regexps en Elisp para incluir líneas nuevas

Actualmente soy capaz de extraer una sola línea con:

(font-lock-add-keywords 
'python-mode 
'(("\\(\"\\{3\\}\\.+\"\\{3\\}\\)" 
    1 font-lock-doc-face prepend))) 

Esto funciona ahora:

"""Foo""" 

Pero tan pronto hay un salto de línea como:

""" 
Foo 

""" 

Ya no funciona. Esto es lógico, ya que . no incluye nuevas líneas (\n). ¿Debo usar una clase de personaje?

¿Cómo puedo corregir esta expresión regular para incluir todo entre """ """?

¡Gracias de antemano!

Respuesta

2
"\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" 

El "*?" construct es la versión no codiciosa de "*".

+0

Por alguna extraña razón mis emacs se cuelgan al usar esta expresión regular. Se bloquea en 'Cargando vc ... hecho' – wunki

0

Una línea nueva en emacs regexps es ingresada por C-q C-j así que simplemente pegue un grupo que contenga. y C-q C-j en tu expresión regular. Cuando uso la herramienta de expresión regular para construirlos, la mía no se cita por completo como la tuya, pero espero que los cambios sean obvios.

\("\{3\}\(.\| C-QC-j \)+"\{3\}\)

Lo siento, no puedo darle formato mejor, stackoverflow no está de acuerdo conmigo.

También probablemente aparecerá como una nueva línea en emacs.

+0

Esto no es correcto. Para los literales de cadena en elisp, usas '\ n'. Al ingresar una interactividad de expresiones regulares, como con una búsqueda de expresiones regulares, solo '\ n' no será una nueva línea, y 'C-q C-j' es necesario en su lugar. – derekv

0

Esto funciona media:

(font-lock-add-keywords 
    'python-mode 
     '(("\\(\"\\{3\\}\\(.\\|\n\\)*?\"\\{3\\}\\)" 
     1 font-lock-warning-face prepend))) 

Pero cuando se añade RET es el margen de beneficio se ha ido.

La expresión regular sugerida "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" hace que mis emacs se cuelguen al abrir un archivo .py.

quizás es el momento para visitar la lista de correo de emacs ..

+0

\ n no es nueva línea en emacs –

+0

@ JoelBorggrén-Franck está mal, '\ n' en una cadena de Lisp representa una nueva línea. – tripleee

0

La forma mejor y más fácil es éste:

font-lock-add-keywords 
'python-mode 
'(("\\(\"\\{3\\}\\[^|]*?\"\\{3\\}\\)" 
    1 font-lock-doc-face prepend))) 

Se puede utilizar cualquier carácter que definitivamente no es entre """ y '' "en lugar de |.

+0

Pero no hay garantía de que la cadena no contenga todos los caracteres ASCII posibles. Es por eso que el delimitador consta de tres caracteres idénticos.Supongo que podrías solucionarlo con algo como '\\ ([^ \"] + \\ (\ "[^ \"] \\ | \ "\" [^ \ "] \\) \\? \\) * ' – tripleee

Cuestiones relacionadas