2011-01-12 9 views
9

Uso Emacs para escribir la mayoría de mis escritos. Escribo usando reStructuredText, y luego los transformo en LaTeX después de un preprocesamiento ya que escribo mis citas á-la LaTeX. Este es un extracto de una de mis textos (en español):¿Cómo hacer flyspell omite algunas palabras por contexto?

En \cite[pp.~XXVIII--XXIX]{Crnkovic2002} se brindan algunos riesgos 
que se pueden asumir con el desarrollo basado en componentes, los 

Este texto es procesado por algunos scripts personalizados que se ocupa de la parte \cite por lo rst2latex puede hacer su trabajo.

Cuando activo el modo flyspell, señala la mayoría de las teclas de citas como errores ortográficos.

¿Cómo puedo decir flyspell no para revisar la ortografía dentro de \cite comandos.

Además, ¿cómo puedo combinar el primer modo y el flyspell, para que el primer modo evite que el flyspell realice la prueba ortográfica de lo siguiente?

  • reST comentarios Código
  • reST literal
  • parámetros directiva el descanso y argumentos
  • contenidos directiva prima resto

¿Alguna idea?

Respuesta

11

Puede establecer la variable ispell-parser en el valor 'tex para que flyspell omita las secuencias de tex (la). Para ello, puede configurar manualmente en cada búfer de este modo:

M-: (setq 'ispell-parser 'tex) 

o escribir una pequeña función que hará que para usted. Ponga lo siguiente en el fichero .emacs:

(defun flyspell-ignore-tex() 
    (interactive) 
    (set (make-variable-buffer-local 'ispell-parser) 'tex)) 

entonces todavía puede invocar de forma manual, utilizando

M-x flyspell-ignore-tex 

o se podría añadir un gancho que llama a la función que automáticamente cada vez que se edita un archivo de una cierto tipo. Haría lo último agregando la función recién definida a su auto-mode-alist. Dicen los nombres de archivo por lo general terminan con ".rst", a continuación, añadir esta línea a su fichero .emacs:

(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex)) 

En cuanto a la segunda parte de su pregunta: hacer flyspell-modo de ignorar las regiones más grandes, tales como, por ejemplo, REVISAR comentarios, no es fácilmente alcanzable. Se vuelve claro cuando piensas en la forma en que funciona el flyspell: verifica el texto palabra por palabra. Para eso, flyspell-word solo mira una palabra a la vez que envía a un proceso ispell que se ejecuta en segundo plano. El proceso ispell realiza la búsqueda del diccionario y devuelve si la palabra actual es correcta o no. Si flyspell-word tuviera que verificar cada vez si la palabra actual es parte de un comentario u otra región que no debería verificarse, sería bastante lento, porque eso incluiría bastante búsqueda a través del búfer.

Ahora, por supuesto, uno podría acercarse a esto un poco más inteligente y primero encontrar las regiones sin comentarios, etc. y luego hacer la verificación palabra por palabra solo en las partes que están fuera de esas regiones, pero desafortunadamente, esa no es la forma en que se implementa flyspell.

Sin embargo, si puede prescindir de la parte "volar", ispell-mode tiene un mecanismo para personalizar las regiones de un búfer que se pueden omitir. Esto se hace a través de la variable ispell-skip-region-alist. Pero a pesar de que el modo flyspell funciona a partir del modo ispell, por los motivos descritos anteriormente, esa variable no es utilizada por el modo flyspell.

+0

Thomas, ¡muchas gracias! He usado el modo ispell en el pasado, pero el flyspell me queda mejor en este momento. Sin embargo, después de leer el documento 'ispell-skip-region-alist', creo que tendría que programar una función para detectar el final del comentario. Todavía no estoy tan familiarizado con Emacs Lisp. De todos modos, el método 'ispell-parser' sigue siendo útil. Tal vez podría comprobar cómo se usa y crear mi propio tweek ispell-parser cuando pueda. – manu

+0

Manu, probablemente no tenga que programar una función de lisp para detectar el comienzo y el final de un comentario. Normalmente, una expresión regular debería ser suficiente, una que coincida con el comienzo y otra que coincida con el final. Pones ambos en paréntesis y lo agregas al 'ispell-skip-region-alist' (lo probé ayer, en realidad no es tan difícil) y hay una buena posibilidad de que' primer-modo' ya contenga las expresiones regulares que estamos buscando un lugar – Thomas

+0

En reStructuredText, el final de la sección de código se detecta cuando se disminuye el nivel de sangría. Entonces, la expresión regular no ayudaría. Saludos cordiales, Manu. – manu

4

También puede usar flyspell-generic-check-word-predicate como le expliqué in this question en Super User.

1

(filtro tex de aspell puede hacer exactamente lo que quiere - pero si quieres una solución más general)

Aunque estoy usando el código de abajo para persuadir a flyspell a no marcará ciertas palabras con números en ellos, se puede usar este tipo de gancho para que coincida con cierto contexto.

buscando comienza en la posición que desea, por lo que es posible que desee buscar hacia atrás para el inicio/fin del contexto que le interese.

(when "another attempt to accept certain words flyspell/ispell/aspell flags as incorrect" 
    (defun flyspell-ignore-WordNumber99-stuff/ag (beg end info) 
    (save-excursion 
     (goto-char beg) 
     (cond 
    ((or 
     (looking-at "\\bWord1\\b") 
     (looking-at "\\bWord99Foo\\b") 
     ) 
     t) 
    (t nil) 
    ) 
    ) 
    ) 
) 

(add-hook 'flyspell-incorrect-hook 'flyspell-ignore-WordNumber99-stuff/ag) 
Cuestiones relacionadas