Deje que Emacs mueva el cursor fuera de la pantalla

23

Esta pregunta se hizo originalmente en /programming/15895313/let-emacs-move-the-cursor-off-screen , pero todas las respuestas que obtuve más o menos decían "no se puede hacer" , que con emacs simplemente no acepto.

¿Es posible dejar que Emacs mueva el cursor fuera de la pantalla, como funciona la mayoría de los editores de texto GUI? Esta es una de las cosas más importantes que me molesta cuando uso Emacs sobre cualquier editor de GUI. Cuando me desplazo hacia abajo, el cursor es "empujado hacia adelante" por la parte superior del búfer.

Anteriormente pensé que esto era completamente imposible, porque está conectado a la arquitectura de Emacs, pero luego vi múltiples cursores, que hace exactamente esto para los cursores secundarios (suponiendo que evite que las funciones de desplazamiento actúen en el secundario cursores). ¿Es posible usar múltiples cursores para tener el cursor principal en algún búfer oculto, y el cursor efectivo es con lo que realmente edito? ¿O tal vez algún otro truco inteligente? ¿O tal vez mi Google me ha fallado y esto ya es posible sin magia?

Yo uso el terminal emacs, por lo que debería funcionar allí.

asmeurer
fuente
Tenga en cuenta que todo lo que hace el paquete de cursores múltiples es agregar cursores falsos que no están sujetos a las restricciones del verdadero. Espero que haya una respuesta basada en las sugerencias de su pregunta anterior.
wasamasa
Supongo que este problema es específico del uso de barras de desplazamiento, ¿es así?
nispio
1
Entonces, ¿qué comandos de desplazamiento estás usando que esperarías no traer el cursor contigo? En mi experiencia, el cursor te sigue en todos los editores cuando usas PgUp / PgDn o las teclas de flecha.
nispio
44
¿@nispio tal vez desplazándose con la rueda del mouse?
ffevotte
2
Página arriba y página abajo (Cv y Mv) no mueven el cursor en emacs a menos que el cursor se mueva fuera de la pantalla. Desplazarse es diferente de moverse (el cursor).
asmeurer

Respuestas:

11

Hay un nuevo paquete disponible en GNU ELPA llamado scroll-restoreque intenta remediar este problema. Hay un puñado de comportamientos diferentes para elegir, pero la forma en que lo configuré para mí (ver más abajo) hace que el cursor se vuelva invisible durante los comandos de desplazamiento y luego vuelva a su ubicación original cuando empiezo a escribir de nuevo.

Hasta ahora, he encontrado algunos errores, pero el paquete parece funcionar como se anuncia en su mayor parte. Puede probarlo instalándolo con

M-x package-install RET scroll-restore RET

Después de instalar el paquete, puede habilitar el modo menor con

M-x scroll-restore-mode

Personalmente, lo estoy vinculando a la Scroll Lockclave porque parece increíblemente apropiado. Esto es lo que estoy agregando a mi archivo init:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)
nispio
fuente
1
Si le ha vinculado una clave, supongo que a veces desea deshabilitarla. ¿Es este modo molesto para la edición normal?
T. Verron
1
@ T.Verron Parece bastante defectuoso en este momento, y uno de sus modos de falla es "atrapar" el cursor en un área y no dejar que se vaya. La única forma en que he encontrado para liberar mi cursor nuevamente es deshabilitar el modo. Una vez que se solucionen todos los errores, no me importaría usarlo todo el tiempo.
nispio
2
¿Cómo se supone que esto funcione? Parece que no puedo lograr que haga nada.
asmeurer
5

El método que siempre uso es establecer la marca donde quiero volver a saltar, y luego, cuando termino de leer el búfer, hago estallar la marca usando C-u C-SPC. Incluso cuando me olvido de establecer la marca antes de alejarme, encuentro que hacer estallar la marca generalmente me deja bastante cerca de donde vine. Esto se debe en parte al hecho de que algunos comandos (como isearchpor ejemplo) establecen la marca sin que te des cuenta. Entonces, a lo largo de su edición, sin darse cuenta ha dejado un pequeño rastro de migas de pan.

De la documentación:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

Casi nunca me molesto en establecer marcadores o registros, pero casi siempre puedo encontrar el camino de regreso de donde vengo rápidamente usando C-u C-SPCo pop-global-mark.

nispio
fuente
Francamente, creo que la razón principal por la que la gente quiere que el cursor pueda moverse fuera de la pantalla es porque están acostumbrados a los editores que no tienen un historial adecuado de las posiciones del cursor. También podría hacerlo de modo que scroll-upy scroll-downautomáticamente ajusta la marca, por lo que C-u C-SPCsería seguro para ayudarle a volver de dónde viene.
Radon Rosborough
0

El siguiente código es lo suficientemente bueno como para saltar hacia atrás después del desplazamiento de la rueda del mouse:

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
AhLeung
fuente