2011-02-26 5 views
6

Estoy empezando a aprender Python y usar Emacs como mi editor. Actualmente, Emacs usa el mismo color para las cadenas normales (comillas simples) y docstrings (comillas triples). Quiero que las docstrings tengan un color diferente, así que utilicé la opción de menú 'Opciones-> Personalizar Emacs' para cambiar 'font-lock-doc-face' a un nuevo color y guardé los cambios. Sin embargo, Emacs continúa manteniendo docstrings del mismo color que las cadenas normales. Cambiar el color de las cadenas normales también aplica el cambio a las cadenas de documentos.¿Cómo cambio la fuente de Emacs para las cadenas de Python?

Parece que Emacs trata las cadenas de documentos y las cadenas normales de la misma manera. ¿Hay alguna manera de hacer que Emacs encuentre y coloree adecuadamente las cadenas de documentos Python por separado de las cadenas normales?

Editar: Estoy usando Emacs 23.1.1 (paquete Kubuntu 10.10) con la configuración predeterminada del modo Python. También utilizo el paquete de tema de color con el tema de medianoche.

+5

No sé la respuesta, pero solo para aclarar: docstrings y las cadenas de comillas triples son cosas separadas (aunque las comillas triples se utilizan a menudo para docstrings). Una cadena inmediatamente después de una línea 'def' o' class' es una docstring. Las comillas triples te permiten extender una cadena en varias líneas fácilmente. –

+0

Eso es bueno saber. Soy nuevo en Python y pensé que las cadenas de comillas triples eran docstrings implícitos. Parecería, entonces, que el problema es que Emacs no puede diferenciar entre una docstring como usted describe y cualquier otra cadena de comillas triples en un archivo de Python. –

+0

Vea también http://stackoverflow.com/questions/27317396/how-to-distinguish-python-strings-and-docstrings-in-an-emacs-buffer –

Respuesta

1

Interesante. Estaba yendo para decir que debido a la forma en que funciona la tabla de sintaxis de emacs, emacs piensa que """ y ''' representan una cadena vacía seguida del comienzo de una nueva cadena.

Usted puede fácilmente verificar esto en su copia de emacs pegando el siguiente código en un búfer de pitón:

class MrsRobinson(object): 
    ''' 
    What's that you say? 
    ''' 
    pass 

En emacs 23.1.1 [actualización: y al parecer en stackoveflow] este rompe por completo el resaltado de sintaxis para el resto del archivo.

siempre uso """ específicamente para evitar problemas apóstrofe en las cadenas de documentación, por lo que no se dio cuenta hasta que en este mismo momento en que emacs 23.2.1, esto es de alguna manera fijó finalmente ...

(Sí, hay una nueva función llamada python-quote-syntax en python.el)

Entonces: en su versión de emacs, esto es imposible porque las cadenas no se analizan correctamente. Si actualiza a los últimos emacs, puede puede ser capaz de hacerlo realidad modificando esa función en python.el para tratarlos de manera diferente.

+0

He copiado su pequeño ejemplo en Emacs y realmente funciona correctamente. Es decir, toda la secuencia de documentos se resalta como una cadena y 'pase' se resalta correctamente como una palabra clave. No sé, sin embargo, si hay una manera de hacer que Emacs diferencie entre una cadena de documentos y cualquier otra cadena de comillas triples ('' 'o "") que aparezca en el código. Imagino que debe haber alguna manera de alimentar Emacs algunas expresiones regulares diciéndole cómo son las cadenas de documentos, ¿sabes cómo se puede hacer? –

+0

Oh, puedo estar ejecutando el "otro" modo python en los emacs más antiguos. De todos modos, todavía tiene que modificar esa misma función. Realiza el resaltado de sintaxis para cadenas * all * python. Solo necesita determinar si la cadena (independientemente de la cantidad de citas que utiliza) apareció inmediatamente en la parte superior de un archivo, clase o función (ignorando los comentarios y el espacio en blanco).Tal vez podría modificar el lexer para establecer un indicador cuando golpea una 'clase' o' def', establecer otro indicador cuando golpea el ':', desajustar ambos cuando golpea cualquier cosa menos un comentario, y anular el rostro si ambos son establecer y lo que golpeó fue una cadena. – tangentstorm

+0

Eché un vistazo al archivo python.el y de hecho es donde tendría que cambiar las cosas para hacer lo que quiero. Ciertamente está por encima de mi cabeza en este momento, pero tendré que jugar con en algún momento. Gracias por ponerme más cerca de averiguarlo. –

Cuestiones relacionadas