¿Cómo desplazarse línea por línea en GNU Emacs?

87

En pocas palabras, estoy tratando de hacer scroll en emacs como en vim y la mayoría de los demás editores; cuando estoy por ejemplo, dos líneas de la parte inferior / superior, y presione hacia abajo / arriba ( Ctrl- p, n, , ) que va sólo una línea hacia arriba o hacia abajo, ni la mitad de la pantalla.

Torre
fuente
5
Estoy convencido de que esto nunca se solucionará. Fue una deficiencia en los últimos 90 y todavía está roto aquí en 2010.
Steve Kuo
12
@Steve Kuo: Salir de bashing: funciona según lo diseñado , pero se puede cambiar (o "arreglar") con una configuración simple.
Teddy
17
@Teddy y ¿qué es este "entorno sencillo"?
Steve Kuo
1
@Teddy sí, ¿qué es?
Scooter
@Rook: En realidad, recomendaría usar z.vim con más frecuencia para tener la sensación de Emacs ;-) Puede ser inusual, pero en realidad es más útil que desplazarse línea por línea en mi humilde opinión.
U. Windl

Respuestas:

51

Vea algunas de las sugerencias en EmacsWIki:

(setq desplazamiento-paso 1
      scroll-conservadoramente 10000)
ars
fuente
3
Lo vi, en realidad, ambas respuestas, la tuya y la de jrockway, pero en Wiki no se recomiendan. Desafortunadamente, las razones de esto no se explican claramente. Por eso publiqué la pregunta, esperando que alguien haya encontrado un método que funcione sin fallas.
Torre
1
No veo por qué no se recomienda esto. He estado usando una configuración similar y ha funcionado bastante bien. Para asegurarle más, vea este documento de paso de desplazamiento (observe la última oración): * El número de líneas para intentar desplazarse por una ventana cuando el punto se mueve hacia afuera. Si eso no devuelve el punto al marco, el punto se centra en su lugar. Si es cero, el punto siempre se centra después de que se mueve fuera del marco. Si desea que el desplazamiento sea siempre una línea a la vez, debe establecer `scroll-conservatively 'en un valor grande en lugar de establecerlo en 1.
an0
Sí, mirando un poco más a mi alrededor, no veo mucho más para respaldar esa nota de advertencia en la wiki. Por ejemplo, el paso de desplazamiento parece ser bastante común en varios archivos .emacs a través de una búsqueda en Google. ¿Quizás el autor de la wiki se esté refiriendo a una versión antigua de emacs?
ars
Nunca tuve problemas con scroll-conservatively. Las advertencias contra esto son un poco extrañas: si causa un problema, ¡es bastante fácil eliminar la línea de su init.el!
dbr
1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… así que con emacs <23.1 y archivos grandes, a veces puede saltar el cursor al medio, lo que no parece ser el mayor problema
dbr
51

Si desea colocar la pantalla exactamente, puede usar Ctrl-L.

  • De forma predeterminada, coloca la línea actual en el medio de la pantalla.

  • ESC 0 Ctrl-L coloca la línea actual en la parte superior.

estrella azul
fuente
14
No se lo tome mal, pero ¿qué tiene que ver eso con el desplazamiento línea por línea? (es decir, la pregunta)
Rook
9
Ofrecer un flujo de trabajo alternativo que sea (en opinión del autor) más natural con la herramienta en cuestión es razonable. Pero debe precederlo con una exención de responsabilidad a tal efecto y explicar por qué este enfoque es "mejor" si es posible.
dmckee --- ex-moderador gatito
2
@dmckee - He usado vim ... uhmm, mucho tiempo. Muy bien con eso. Sin embargo, como estoy haciendo algo con lisp, comencé a obligarme a al menos a familiarizarme con emacs nuevamente, y esta forma "alternativa" de moverme es demasiado para mí en este momento. Leer el tutorial, saberlo ... pero, es demasiado extraño, en mi humilde opinión. No es natural.
Torre
1
@Idigas: Claro. Eso es justo y no es necesario que sigas el consejo de starblue. Pero creo que este tipo de respuesta puede ser útil si es directa e incluye una explicación convincente.
dmckee --- gatito ex-moderador
1
Sí, esto funciona con un par de pulsaciones de teclas. (Busqué en Google "cómo desplazarse línea por línea" solo porque me pareció una forma útil de buscar "cómo hacer que el código vaya a donde quiero"). ¡Gracias!
Ennael
42

Llego un poco tarde a la fiesta, pero si no le importa instalar un paquete, entonces el desplazamiento suave ( github , también disponible en MELPA ) puede ser lo que está buscando, ciertamente funciona para mí.

Una vez que lo haya instalado, puede mostrar lo siguiente en su init.el:

(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)

La última línea es opcional; comienza a desplazarse cerca del borde de la pantalla en lugar de en él, por lo que siempre tienes un poco de contexto alrededor del punto. Ajustar al gusto.

Stuart Hickinbottom
fuente
7
Rompí a llorar cuando leí esto. Estoy bastante seguro de que esta es la respuesta a la pregunta.
Eric Brown
3
Sí, como usuario de Vim probando Emacs, esto es exactamente lo que estaba buscando.
juanjux
Usé tanto esta solución como la solución de paso de desplazamiento, la combinación es fascinante cuando me muevo a la sexta línea desde abajo y presiono hacia abajo, se desplazará una línea, y lo mismo desde arriba.
Emad Elsaid
Lamentablemente, el desplazamiento suave ahora falla con bastante frecuencia cuando está saltando por su archivo usando, por ejemplo, el modo de ocurrencia o la búsqueda: ambos pueden sacar el punto de la pantalla y debe presionar CL para que se muestre el resultado.
Erik Knowles
27

Mi solución no es cambiar el desplazamiento predeterminado de Emac, sino crear un comando de secuencia de teclas a partir de una macro. De esta manera, tiene una forma conveniente de desplazarse una línea a la vez cuando lo desee. No es ideal, pero es muy fácil. Simplemente sucede que M- (↓) y M- (↑) están disponibles, así que eso es lo que usé.

Así es como lo hice. Primero, debe grabar una macro para desplazamientos de una línea, hacia arriba y hacia abajo.

Comenzar macro

C-x ( 

Desplácese hacia abajo uno

C-u 1 C-v

Detener macro

C-x )

Para desplazarse hacia arriba uno, use

C-u 1 M-v

A continuación, debe nombrar la macro.

M-x name-last-kbd-macro

Déle un nombre cuando se le solicite como:

down-one-line

Luego, use lo siguiente para vincular una secuencia de teclas a ese nombre de comando:

M-x global-set-key

Y cuando se le solicite, use algo como:

M-(down arrow)

Luego le preguntará qué comando desea vincular, y debe darle el nombre que inventó anteriormente, por ejemplo, down-one-line.

Aquí es donde obtuve esta información. También puede encontrar instrucciones a continuación y en otros lugares sobre cómo agregar su macro al archivo .emacs.

Aquí para la explicación de la definición macro

Aquí para saber cómo controlar el desplazamiento

Josh Cason
fuente
22

Los he estado usando en mi .emacsarchivo desde 2000.

(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward)) 

De esta manera, puedo mantener el comportamiento predeterminado de Emacs y desplazarme una línea a la vez, dependiendo de lo que esté haciendo.

Esto funcionó hasta al menos GNU Emacs 22. Recientemente actualicé a Emacs 24 y descubrí que View-scroll-line-forwardya View-scroll-line-backwardno están disponibles. Después de un poco de caza, descubrí que funcionan las líneas de desplazamiento hacia arriba y hacia abajo. Entonces, si está usando Emacs 24, puede usar esto.

(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line)) 

Casi siempre me salté Emacs 23, así que si esa es la versión que estás usando, puedes experimentar con las dos anteriores.

Nota: en scroll-up-linerealidad, se desplaza una línea hacia abajo , porque el búfer se mueve una línea hacia arriba.

Rajesh J Advani
fuente
Gracias, esto funciona ... pero encontré otro problema sobre el que pregunté aquí: stackoverflow.com/questions/19256551/…
scorpiodawg
13

Vuelvo a enlazar mis teclas de flecha para realizar operaciones de desplazamiento.

(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))

(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))
Derek Slager
fuente
2
Esto no es exactamente lo que estaba buscando. No quiero que la pantalla se desplace (ya que me gustaría que el bloqueo de desplazamiento estuviera habilitado), pero que la pantalla se "mueva" ... oh, ... cómo lo hace el bloc de notas :)
Torre
12

Los simples hacen esto:

(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))

luego el meta cursor hacia arriba se mueve hacia arriba y el meta cursor hacia abajo se mueve hacia abajo.

QED. ¡No estoy seguro de qué estaban fumando todas las personas mencionadas!

Adán
fuente
O, como acabo de publicar, puede usar la línea de desplazamiento hacia arriba y la línea de desplazamiento hacia abajo.
Rajesh J Advani
5

Tengo lo siguiente en mi archivo .emacs para habilitar un buen comportamiento de desplazamiento ctrl-up, ctrl-down. También utilizo esto para la rueda del mouse.

(defun scroll-down-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-up-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)
Alex B
fuente
Acabo de probar esto, pero no es el comportamiento que estaba buscando. Le permite bajar a la última línea en la pantalla, pero al hacer clic hacia abajo, todavía "moverá la pantalla varias líneas hacia arriba" ... no sé cómo explicarlo mejor.
Torre
Me gusta la idea de mapear la rueda del mouse. Pero, ¿no funcionarían las funciones View-scroll-line-forward y View-scroll-line-backward (o las más nuevas de scroll-up-line y scroll-down-line) en lugar de definir sus propias funciones?
Rajesh J Advani
2

Para que el desplazamiento "vim" ponga esto en su archivo .emacs:

(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)
jjpikoov
fuente
@ Matt lo hace por mí
jjpikoov
2

Dado que puede ser molesto usar el M-up, M-downporque interfiere con el modo org que sobrecarga estos comandos. Para evitar este problema, personalmente utilizo los comandos que combinan M-page-up M-page-down". Aquí definí el desplazamiento hacia arriba y hacia abajo hasta 1 línea.

;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines)
                                                  (forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines)
                                                  (forward-line number-of-lines))))

;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines))))
romwel
fuente
1

M-x customize-variable scroll-conservatively

Póngalo en 1.

Sin embargo, realmente no quieres hacer esto.

jrockway
fuente
5
Lo vi, en realidad, ambas respuestas, la suya y la de ars, pero en Wiki no se recomiendan. Desafortunadamente, las razones de esto no se explican claramente. Por eso publiqué la pregunta, esperando que alguien haya encontrado un método que funcione sin fallas.
Torre
3
Sería útil si pudiera explicarnos, novatos, por qué no es una buena idea.
Daniel
La única razón por la que puedo pensar por qué esto no es una buena idea es que el desplazamiento se vuelve lento: siempre tendrá que desplazarse una línea a la vez, en lugar de la media pantalla predeterminada. (¿Supongo?)
ShreevatsaR
1

Si está buscando una forma rápida de crear un efecto de desplazamiento, ingrese C-ny C-lsecuencialmente lo que mueve el cursor hacia abajo y luego lo centra.

Michael David Watson
fuente
0

Si inicia emacs en .xsession, en mi caso, configurar scroll-conservadoramente en 100+ no funcionará, ni scroll-step 1. Pero si inicia emacs después de X, funciona.

seb
fuente
0

Si no le importa usar el mouse y tiene una rueda de desplazamiento, puede personalizar la variable mouse-wheel-scroll-amount por:

Ch v mouse-wheel-scroll-amount (haga clic en personalizar, cambie el valor a "Número específico de líneas" 1, Aplicar y guardar).

o agregue a .emacs la línea: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Hay muchas posibilidades enumeradas en https://www.emacswiki.org/emacs/Scrolling

Felipe
fuente