Inspirado por esta pregunta: deje que Emacs mueva el cursor fuera de la pantalla , estoy considerando escribir un modo menor que mantendrá el cursor en una posición fija que no se vea afectada por las operaciones de desplazamiento. Tengo algunas ideas sobre cómo podría implementar esto, pero requeriría un gancho para avisarme cuando el cursor se está "empujando" fuera de la pantalla.
En algún lugar dentro de las entrañas de Emacs, existe un código que se llama cuando la ubicación de point
se mueve fuera de la pantalla. Si bien se ha dicho que el código que controla este comportamiento vive en profundidad con el código fuente C, me gustaría saber si hay alguna manera de que pueda recibir una notificación cuando esté a punto de suceder.
¿Hay alguna manera de que pueda ser notificado cuando un comando de desplazamiento está a punto de mover el cursor? O al menos, ¿hay alguna manera de que pueda ser notificado cuando la pantalla está a punto de desplazarse?
Actualización: ¡Ya no planeo escribir un modo menor para lograr esto porque se acaba de lanzar un nuevo paquete en GNU ELPA llamado scroll-restore
que proporciona exactamente las características que estaba pensando implementar yo mismo!
(window-start)
para el desplazamiento horizontal? (tenga en cuenta quewindow-hscroll
no hace el trabajo cuando la fuente en el búfer difiere de la predeterminada).La respuesta de @Gilles es el camino correcto. Mantendré este aquí para la información y los hacks.
Creo que el
point
movimiento lo realizan las funciones Cwindow_scroll_line_based
ywindow_scroll_pixel_based
(dependiendo de los parámetros de su marco). Estas funciones no están expuestas a la máquina de lisp, por lo que no puede aconsejarlas. Tendría que aconsejar las funciones que los llaman.Dos de las funciones (accesibles para lisp) que pueden hacer esto son
scroll-up
yscroll-down
. Así es como me enteré de ellos:M-x (put-text-property (region-beginning) (region-end) 'point-left (lambda (&rest _) (error "Point leaving")))
. Esto arrojará un error cuando el punto abandone la región.M-x toggle-debug-on-error
.Se le proporcionará un búfer de traza inversa como este, que señala claramente la
scroll-down
función.Seguí
scroll-down
su definición en C, que me llevó awindow_scroll
, que me llevó a esas dos funciones anteriores.Lo que puedes hacer
Puede asesorar
scroll-down/up
con unaround
consejo (así como cualquier otra función que también pueda resultar en el movimiento del punto). Use este consejo para verificar si la posición depoint
ha cambiado y registre la posición anterior. Y luego haz lo que quieras con él.Tenga en cuenta que los consejos son muy poco confiables cuando se trata de funciones C. Algunas funciones importantes tienen direcciones especiales en el código compilado por bytes, lo que significa que no se les avisa cuando se compila el código. No creo que ese sea el caso aquí, pero pensé que no deberías.
fuente
scroll-down
yscroll-up
sería útil aquí. Hay muchas otras formas en que puede ocurrir el desplazamiento. Al menos todos los comandos que tienen laisearch-scroll
propiedad deben considerarse comandos de desplazamiento.