¿Cómo evitar desplazarse con archivos grandes que cuelgan por cortos períodos de tiempo? (sosteniendo teclas de página, por ejemplo)

9

Incluso usando la configuración predeterminada ( emacs -Q) he encontrado que los archivos C grandes pueden ser lentos para desplazarse con Emacs.

Si, por ejemplo, abro un archivo grande y lo sostengo Page-Down. Se desplazará hacia abajo 1-2 páginas, luego se colgará por un segundo o dos, al soltar el documento se desplazará muchas páginas hacia abajo (20 páginas más o menos). * *

Sé que Emacs es capaz de tener un comportamiento menos errático porque si toco rápidamente page down, se las arregla para mantenerse al día y no se cuelga como antes.

¿Es posible que Emacs no intente manejar múltiples eventos a la vez, y en su lugar redibuje entre eventos?

¿O de alguna manera se vuelve más receptivo en lugar de colgar mientras intenta procesar muchos eventos?


* La desaceleración real en este caso es causada por el resaltado de sintaxis, ya que si desplazo todo el documento una vez, después de todo, el desplazamiento es rápido. He examinado diferentes opciones relacionadas con el bloqueo de fuentes y he llegado a la conclusión de que los valores predeterminados de bloqueo de fuentes son razonables y ajustarlos no resuelve el problema, mencioné esto ya que ya lo he investigado y no creo que sea una parte importante de esto. pregunta.

ideasman42
fuente
1
Eso no suena normal. ¿Has hecho alguna prueba para descubrir cuál es la causa? Podría estar relacionado con su configuración de emacs (pruebe con emacs -Qpara descartarlo), o podría ser que su disco es muy lento. También puede intentar desactivar el resaltado de sintaxis u otro comportamiento útil (coloque el búfer en modo fundamental).
db48x
1
Por configuración predeterminada me refería a emacs -Q, pregunta editada. Disminuir la velocidad definitivamente es el resaltado de sintaxis. Sin embargo, empeora cuando emacs intenta manejar todos los eventos antes de volver a dibujar.
ideasman42

Respuestas:

10

Como notó, esto sucede básicamente cuando la visualización es demasiado lenta por alguna razón. No hay mucho que podamos hacer en el caso general (cuando es "demasiado lento"), pero cuando es "un poco demasiado lento" puede intentar uno de esos (o ambos, aunque probablemente no haga nada más que solo uno de los dos):

(setq jit-lock-defer-time 0)
(setq fast-but-imprecise-scrolling t)

Tenga en cuenta que ambos son nuevos en Emacs-25.

Stefan
fuente
2
La cadena de documentos para la variable fast-but-imprecise-scrollingdice " Cuando no sea nulo, acelere las operaciones de desplazamiento " . Quizás el ejemplo debería reflejar un valor no nulo, ya que eso aceleraría el desplazamiento.
abogados
2
  1. Una cosa que puede hacer es pasar un argumento de prefijo numérico al comando de desplazamiento, en lugar de simplemente presionar y mantener presionada su tecla para invocarlo repetidamente.

    Por ejemplo, si está usando la <next>tecla (aka PageDown), entonces el comando que invoca es scroll-up-command. Y C-h f scroll-up-commandle dice que un prefijo numérico arg dice que se desplace tantas líneas.

    Por ejemplo: suponga que su búfer tiene 50,000 líneas y el cursor está en la parte superior (en la primera línea). Si lo hace C-u 25000 <next>, se desplazará hasta la mitad del búfer (25,000 líneas).

    Todavía habrá una pausa, pero será algo más corta.

  2. Otra posibilidad es moverse hacia abajo por un cierto número de cosas grandes de Emacs. Si su búfer separa secciones de texto usando caracteres ^L(Control-L, formulario-alimentación), entonces puede usar los comandos de navegación de página, como forward-page, que está vinculado C-x ]. Nuevamente, puede pasarle un argumento de prefijo numérico para avanzar tantas páginas a la vez. Si no hay ^Lcaracteres, puede usar forward-paragraph( C-<down>) forward-lineu otro comando de movimiento con un prefijo arg.

  3. Del mismo modo, puede usar el comando goto-line( M-g M-g) para ir a un número de línea en particular. (Elija un número grande). El comando what-linele indica cuál es el número de línea actual (también puede mostrarlo en la línea de modo). (lo M->lleva al final del búfer, donde M-x what-linele indicará cuántas líneas hay en total).

  4. (Agregado después de su comentario sobre desnatado hasta que vea esto o aquello). Utilice la búsqueda incremental para la navegación. Busque algo cerca de donde desea desplazarse, utilizando C-so (para la búsqueda de expresiones regulares) C-M-s.

    Si usa la biblioteca Isearch + , también puede incorporar predicados arbitrarios en su búsqueda, sobre la marcha.

    Es decir, no necesita buscar utilizando solo la coincidencia de patrones. Podría, por ejemplo, buscar (1) coincidir con un patrón que seleccione un bloque de comentarios completo o una switchdeclaración completa , y (2) requerir que la coincidencia tenga un cierto tamaño (número de caracteres).

    Isearch + también le permite buscar coincidencias con múltiples patrones o buscar una coincidencia con un patrón dentro de una distancia dada a ("cerca") una coincidencia para otro patrón (donde la distancia se mide en caracteres, palabras, sexps, listas, oraciones. ..)

Dibujó
fuente
1
Estoy familiarizado con las formas de saltar alrededor del documento, agujerear la página hacia abajo o usar la rueda del mouse es principalmente una forma de leer un archivo rápidamente (puede desplazarse rápidamente hacia abajo hasta que llegue a un bloque de comentarios grande de una declaración de cambio grande, por ejemplo, el equivalente digital de hojear un libro :)) .
ideasman42
1

Publicar esto ya que es una solución débil pero mejor que nada.

En lugar de cambiar todo el comportamiento de emacs, es posible escribir funciones que obligan a redibujar después de cada operación, lo que evita el bloqueo y hace que el desplazamiento responda mejor a la página arriba / abajo y la rueda del mouse.

(global-set-key [next]
 (lambda () (interactive)
   (condition-case nil (scroll-up)
     (end-of-buffer (goto-char (point-max))))
   (redisplay)))

(global-set-key [prior]
 (lambda () (interactive)
   (condition-case nil (scroll-down)
     (beginning-of-buffer (goto-char (point-min))))
   (redisplay)))

(global-set-key (kbd "<mouse-4>")
 (lambda () (interactive) (scroll-down mouse-wheel-scroll-amount) (redisplay)))
(global-set-key (kbd "<mouse-5>")
 (lambda () (interactive) (scroll-up mouse-wheel-scroll-amount) (redisplay)))
ideasman42
fuente
Tenga en cuenta que esto tenderá a hacer que Emacs se quede atrás de su repetición de teclas, por lo que cuando suelta la tecla, el desplazamiento continúa más allá de lo que pensaba :-(
Stefan
Correcto, en la práctica no encuentro esto como un problema porque normalmente solo mantengo presionado por un corto tiempo.
ideasman42