2010-01-05 15 views
6

Utilizo emacs para editar todo. En algunos de mis documentos LateX, me gustaría deshabilitar automáticamente el modo de autocompletar cuando estoy editando tablas y códigos. Básicamente, me gustaría tener dos etiquetas, como:Suprimir el autocompletar de emacs en una región seleccionada

%%% BEGIN NO FILL 
    %%% END NO FILL 

y nada entre ellas se rellenarán automáticamente.

¿Alguien puede pensar en una forma de hacerlo? Tendría que averiguar si el cursor está dentro de la región y luego tener que alternar el modo, y tendría que hacer eso cada vez que se mueve el cursor. ¿O hay una mejor manera de hacerlo?

+0

Muy buena pregunta! Tengo curiosidad por saber si hay una solución yo mismo. – bnbeckwith

+0

Creo que es posible que tengamos que escribirlo nosotros mismos ... – vy32

Respuesta

1

Lo tengo. Mira esto:

(defun in-no-auto-fill-region() 
    (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0)) 
    (save-excursion (or (search-backward "%%% END NO FILL" (point-min) t) 0)) 
    )) 

(defun previous-line-checking-auto-fill (arg) 
    (interactive "P") 
    (previous-line arg) 
    (if (in-no-auto-fill-region) 
     (turn-off-auto-fill) 
    (turn-on-auto-fill))) 

(defun next-line-checking-auto-fill (arg) 
    (interactive "P") 
    (next-line arg) 
    (if (in-no-auto-fill-region) 
     (turn-off-auto-fill) 
    (turn-on-auto-fill))) 

(add-hook 'LaTeX-mode-hook 
     '(lambda nil 
    (local-set-key "C-p" 'previous-line-checking-auto-fill) 
    (local-set-key "C-n" 'next-line-checking-auto-fill) 
    (auto-fill-mode 1) 
    )) 
2

Si está utilizando AUCTeX (debería ser), entonces es posible que desee comprobar LaTeX-indent-environment-list. Agregar un entorno a esta variable lo hará de modo que (entre otras cosas) M-q no rellene el párrafo. Lamentablemente, no parece funcionar para el modo de autocompletar. El siguiente código en gran parte no probado agregado al LaTeX-mode-hook puede hacer lo que desee.

(setq auto-fill-function 
    (lambda() 
    (unless (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0)) 
       (save-excursion (or (search-backward "%%% END NO FILL" (point-min) t) 0))) 
     (do-auto-fill)))) 

Es muy estúpido e ineficiente, pero parece ser lo suficientemente rápido en mi máquina. No permite anidar, y requiere que marque manualmente todas las secciones que no desea rellenar. Lo que estoy pensando en agregar a mis .emacs (hasta que leí tu pregunta no me di cuenta de cuánto me molestó esto) está por debajo de las claves del entorno actual, por lo que no hay necesidad de un marcado especial (aunque solo mira el entorno más interno (no estoy seguro de cuánto problema causará en la práctica)). La combinación de los dos se deja como un ejercicio para el lector interesado.

;; You can use the following to unset the variables and play around with them 
;; (makunbound 'auto-fill-ignore-environments) 
;; (makunbound 'auto-fill-ignore-environments-regexp) 
(defcustom auto-fill-ignore-environments 
    (mapcar 'car LaTeX-indent-environment-list) 
    "List of environments for which `auto-fill-mode' should be 
disabled. Used to generate `auto-fill-ignore-environments-regexp'." 
    :type '(sexp) 
) 
(defcustom auto-fill-ignore-environments-regexp 
    (regexp-opt auto-fill-ignore-environments) 
    "Regexp matching LaTeX environments for which `auto-fill-mode' 
should be disabled. If not set, automatically generated from 
`auto-fill-ignore-environments'" 
    :type '(string) 
    :set-after '(auto-fill-ignore-environments) 
) 
(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (setq auto-fill-function 
        (lambda() 
        (unless (string-match auto-fill-ignore-environments-regexp 
              (LaTeX-current-environment)) 
         (do-auto-fill)))))) 

Nunca he usado defcustom antes, así que estoy seguro de que esa parte podría mejorarse bastante.

+0

Gracias. Solo estoy usando el modo tex.el que está integrado en MacOS. Creo que tendré que averiguar sobre AUCtex. Su sistema es ineficiente pero parece inteligente. Anidar no es importante Apuesto a que podríamos activar o desactivar el autocompletar con el cursor hacia arriba y hacia abajo ... – vy32

+1

Sí, probablemente puedas analizar el archivo y agregar propiedades de texto o superposiciones con propiedades de puntos a la izquierda y de puntos ingresados. Una dificultad con esto es que tienes que mantener las propiedades del texto sincronizadas, lo que puede ser un problema. Sé que algunos modos de plegado hacen algo como esto. O podría recomendar los comandos de movimiento, pero hay muchos, y creo que se ejecutará con más frecuencia que cuando escribe un carácter de autocompletar, p. espacio. Tal vez podría salir adelante aconsejando solo ciertos comandos de movimiento. –

+0

¿Hay una manera general de asesorar sobre los comandos de movimiento o en movimiento? Se me ocurrió una solución que simplemente vuelve a enlazar^p y^n. – vy32

0

O bien, puede desactivar el modo de autocompletar y usar M-q para formatear los párrafos. No me gusta la falta de autocompletar, así que uso esto en todos los modos.

0

Si quieres ir a la ruta de asesoramiento/redefinir todas las funciones de movimiento, esto debería ayudar:

(defmacro movement-advice (func) 
    `(defadvice ,func (after ; run this after the original function is done (and point has moved) 
        ;; Give it a unique name 
        ,(intern (concat (symbol-name func) "-auto-fill-auto-off")) 
        ;; Hopefully this satisfies the arguments of any function we can throw at it 
        (&rest args) 
        ;; turn it on 
        activate 
        ) 
    "Turn auto-fill-mode on or off automatically." 
    (auto-fill-mode (not (in-no-auto-fill-region))))) 

(dolist (func '(next-line 
       previous-line 
       forward-paragraph 
       backward-paragraph 
       mouse-drag-region 
       ;; Whatever you use 
       )) 
    (eval `(movement-advice ,func))) 
+0

Huh. Necesito aprender sobre este consejo. Gracias. – vy32

+0

Hm. De todos modos, para restringir eso al modo LaTeX, y no a todos los modos? – vy32

+0

Extrañamente, esto no funciona: (modo autollenado (no (in-no-auto-fill-region))) Necesita esto: (if (in-no-auto-fill-region)) \t (apagado-auto-llenado) (encendido-auto-llenado))) No tengo idea de por qué. – vy32

Cuestiones relacionadas