Comment faire défiler ligne par ligne dans GNU Emacs?

87

Pour faire simple, j'essaye d'obtenir le défilement dans emacs comme dans vim et la plupart des autres éditeurs; quand je suis par exemple, deux lignes à partir du bas / haut, et je presse vers le bas / vers le haut ( Ctrl- p, n, , ) il va seulement une ligne vers le haut ou vers le bas, pas la moitié de l'écran.

Tour
la source
5
Je suis convaincu que cela ne sera jamais réglé. C'était une lacune dans les années 90 et elle est toujours cassée ici en 2010.
Steve Kuo
12
@Steve Kuo: Arrêtez de dénigrer - cela fonctionne comme prévu , mais peut être changé (ou "corrigé") avec un réglage simple.
Teddy
17
@Teddy et quel est ce "réglage simple"?
Steve Kuo le
1
@Teddy ouais, qu'est-ce que c'est?
Scooter
@Rook: En fait, je recommanderais d'utiliser z.dans vim plus fréquemment pour obtenir le sentiment Emacs ;-) Cela peut être inhabituel, mais c'est en fait plus utile que de faire défiler ligne par ligne à mon humble avis.
U. Windl

Réponses:

51

Voir quelques-unes des suggestions sur EmacsWIki:

(setq scroll-step 1
      scroll-conservativement 10000)
ars
la source
3
Je l'ai vu, en fait - les deux réponses, la vôtre et celle de jrockway, mais sur Wiki, les deux ne sont pas recommandées. Malheureusement, les raisons ne sont pas clairement expliquées. C'est pourquoi j'ai posté la question, en espérant que quelqu'un a trouvé une méthode qui fonctionne sans défauts.
Rook
1
Je ne vois pas pourquoi ce n'est pas recommandé. J'utilise une configuration similaire et cela fonctionne assez bien. Pour vous assurer plus loin, consultez cette doc de scroll-step (notez la dernière phrase): * Le nombre de lignes pour essayer de faire défiler une fenêtre lorsque le point sort. Si cela ne parvient pas à ramener le point sur l'image, le point est centré à la place. S'il s'agit de zéro, le point est toujours centré après avoir quitté le cadre. Si vous voulez que le défilement soit toujours une ligne à la fois, vous devez définir `scroll-conservativement 'sur une valeur élevée plutôt que de le définir sur 1.
an0
Ouais, en regardant un peu plus autour, je ne vois pas grand chose de plus pour sauvegarder cette mise en garde sur le wiki. Par exemple, l'étape de défilement semble être assez courante dans plusieurs fichiers .emacs via une recherche Google. Peut-être que l'auteur du wiki fait référence à une ancienne version d'emacs?
ars
Jamais eu de problèmes avec scroll-conservatively. Les avertissements contre cela sont un peu étranges - si cela pose problème, il est assez facile de supprimer la ligne de votre init.el!
dbr
1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… donc avec emacs <23.1 et des fichiers volumineux, cela peut parfois faire passer le curseur au milieu, ce qui ne semble pas être le plus gros problème
dbr
51

Si vous souhaitez positionner l'écran exactement, vous pouvez utiliser Ctrl-L.

  • Par défaut, il positionne la ligne courante au milieu de l'écran.

  • ESC 0 Ctrl-L positionne la ligne courante en haut.

starblue
la source
14
Ne vous méprenez pas, mais qu'est-ce que cela a à voir avec le défilement ligne par ligne? (c'est-à-dire la question)
Rook
9
Il est raisonnable d'offrir un flux de travail alternatif (de l'avis de l'auteur) plus naturel avec l'outil à portée de main. Mais vous devriez le faire précéder d'un avertissement à cet effet et expliquer pourquoi cette approche est «meilleure» si possible.
dmckee --- ex-moderator chaton
2
@dmckee - J'ai utilisé vim ... uhmm, depuis longtemps. Très bien avec ça. Cependant, depuis que je fais quelque chose avec lisp, j'ai commencé à me forcer à au moins me familiariser avec emacs à nouveau, et cette façon «alternative» de se déplacer est trop pour moi en ce moment. Lisez le tutoriel, sachez-le ... mais c'est trop bizarre, à mon humble avis. Pas naturel.
Tour du
1
@Idigas: Bien sûr. C'est juste, et vous n'avez pas besoin de suivre les conseils de starblue. Mais je pense que ce genre de réponse peut être utile si elle est directe et comprend une explication convaincante.
dmckee --- ex-moderator chaton
1
Oui, cela fait le travail en quelques frappes. (J'ai googlé "comment faire défiler ligne par ligne" uniquement parce que cela semblait être un moyen utile de rechercher "comment faire en sorte que le code aille où je veux".) Merci!
Ennael
42

Je suis un peu en retard à la fête, mais si cela ne vous dérange pas d'installer un package, alors le défilement en douceur ( github , également disponible dans MELPA ) peut être ce que vous recherchez - cela fonctionne certainement pour moi.

Une fois que vous l'avez installé, vous pouvez afficher ce qui suit dans votre init.el:

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

La dernière ligne est facultative; il commence à défiler près du bord de l'écran plutôt que sur celui-ci, vous avez donc toujours un peu de contexte autour du point. Ajustez au goût.

Stuart Hickinbottom
la source
7
Je me suis effondré en pleurant quand j'ai lu ceci. Je suis sûr que c'est la réponse à la question.
Eric Brown du
3
Oui, en tant qu'utilisateur de Vim essayant Emacs, c'est exactement ce que je recherchais.
juanjux
J'ai utilisé à la fois cette solution et la solution par étapes de défilement, la combinaison est fascinante lorsque je passe à la 6ème ligne en partant du bas et que j'appuie dessus pour faire défiler une ligne, et même en haut.
Emad Elsaid
Malheureusement, le défilement fluide échoue maintenant assez souvent lorsque vous sautez dans votre fichier en utilisant, par exemple, le mode occurrence ou la recherche: les deux peuvent faire sortir le point de l'écran et vous devez appuyer sur CL pour afficher votre résultat.
Erik Knowles
27

Ma solution n'est pas de changer le défilement par défaut d'Emac, mais plutôt de créer une commande de séquence de touches à partir d'une macro. De cette façon, vous disposez d'un moyen pratique de faire défiler une ligne à la fois quand vous le souhaitez. Pas idéal, mais super facile. Il arrive juste que M- (↓) et M- (↑) soient disponibles, c'est donc ce que j'ai utilisé.

Voilà comment je l'ai fait. Tout d'abord, vous devez enregistrer une macro pour les défilements d'une ligne, de haut en bas.

Commencer la macro

C-x ( 

Faites défiler vers le bas

C-u 1 C-v

Arrêter la macro

C-x )

Pour faire défiler vers le haut, utilisez

C-u 1 M-v

Ensuite, vous devez nommer la macro.

M-x name-last-kbd-macro

Donnez-lui un nom lorsque vous y êtes invité comme:

down-one-line

Ensuite, utilisez simplement ce qui suit pour lier une séquence de touches à ce nom de commande:

M-x global-set-key

Et à l'invite, utilisez quelque chose comme:

M-(down arrow)

Ensuite, il vous demandera quelle commande vous voulez lier, et vous devriez lui donner le nom que vous avez inventé précédemment, par exemple, une ligne en bas.

Voici où j'ai obtenu cette information. Vous pouvez également trouver des instructions ci-dessous et ailleurs sur l'ajout de votre macro au fichier .emacs.

Ici pour l'explication de la définition de macro

Ici pour savoir comment contrôler le défilement

Josh Cason
la source
22

Je les utilise dans mon .emacsdossier depuis 2000.

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

De cette façon, je peux conserver le comportement par défaut d'Emacs et faire défiler une ligne à la fois, en fonction de ce que je fais.

Cela a fonctionné jusqu'à au moins GNU Emacs 22. J'ai récemment mis à niveau vers Emacs 24 et j'ai découvert cela View-scroll-line-forwardet je ne suis View-scroll-line-backwardplus disponible. Après quelques recherches, j'ai découvert ce travail de défilement vers le haut et vers le bas. Donc, si vous utilisez Emacs 24, vous pouvez l'utiliser.

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

J'ai principalement ignoré Emacs 23, donc si c'est la version que vous utilisez, vous pouvez expérimenter les deux.

Remarque: scroll-up-linefait défiler en fait une ligne vers le bas , car le tampon est déplacé d'une ligne vers le haut.

Rajesh J Advani
la source
Merci, cela fonctionne ... mais j'ai rencontré un autre problème que j'ai posé ici: stackoverflow.com/questions/19256551/…
scorpiodawg
13

Je réassocie mes touches fléchées pour effectuer des opérations de défilement.

(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
la source
2
Ce n'est pas exactement ce que je recherchais. Je ne veux pas que l'écran défile (comme si le verrouillage du défilement était activé), mais que l'écran «bouge» ... oh, ... comme le bloc-notes fait ça :)
Rook
12

Les Simples font ceci:

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

puis le méta curseur vers le haut se déplace vers le haut et le méta curseur vers le bas se déplace vers le bas.

QED. Je ne sais pas ce que toutes les personnes ci-dessus fumaient!

Adam
la source
Ou, comme je viens de le publier, vous pouvez utiliser la ligne de défilement vers le haut et la ligne de défilement vers le bas.
Rajesh J Advani
5

J'ai ce qui suit dans mon fichier .emacs pour activer un bon comportement de défilement ctrl-haut, ctrl-bas. J'utilise également ceci pour la molette de la souris.

(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
la source
Je viens d'essayer cela, mais ce n'est pas le comportement que je recherchais. Il vous permet de descendre à la dernière ligne à l'écran, mais en cliquant vers le bas, il "secouera toujours l'écran de plusieurs lignes" ... Je ne sais pas comment l'expliquer mieux.
Tour
J'aime l'idée de cartographier la molette de la souris. Mais les fonctions intégrées View-scroll-line-forward et View-scroll-line-backward (ou la nouvelle ligne de défilement vers le haut et la ligne de défilement vers le bas) ne fonctionneraient-elles pas, au lieu de définir vos propres fonctions?
Rajesh J Advani
2

Pour que le défilement "vim" place ceci dans votre fichier .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
la source
@Matt ça fait pour moi
jjpikoov
2

Puisqu'il peut être ennuyeux d'utiliser le M-up, M-downcar cela interfère avec le mode org qui surcharge ces commandes. Pour éviter ce problème, j'utilise personnellement ces commandes qui combinent M-page-up M-page-down". Ici, j'ai défini le défilement vers le haut et vers le bas jusqu'à 1 ligne.

;;;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
la source
1

M-x customize-variable scroll-conservatively

Réglez-le sur 1.

Cependant, vous ne voulez pas vraiment faire ça.

jrockway
la source
5
Vu, en fait - les deux réponses, la vôtre et la vôtre, mais sur Wiki, les deux ne sont pas recommandées. Malheureusement, les raisons ne sont pas clairement expliquées. C'est pourquoi j'ai posté la question, en espérant que quelqu'un a trouvé une méthode qui fonctionne sans défauts.
Rook
3
serait utile si vous pouviez nous expliquer pourquoi ce n'est pas une bonne idée.
Daniel
La seule raison pour laquelle je peux penser que ce n'est pas une bonne idée est que le défilement devient lent: vous devrez toujours faire défiler une ligne à la fois, au lieu du demi-écran par défaut. (Je suppose?)
ShreevatsaR
1

Si vous cherchez un moyen rapide de créer un effet de défilement, entrez C-net C-lséquentiellement ce qui déplace le curseur vers le bas puis le centre.

Michael David Watson
la source
0

Si vous démarrez emacs en .xsession, dans mon cas, régler le scroll-conservativement à 100+ ne fonctionnera pas, ni le scroll-step 1. Mais si vous démarrez emacs après X, cela fonctionne.

Seb
la source
0

Si cela ne vous dérange pas d'utiliser la souris et d'avoir une molette de défilement, vous pouvez personnaliser la variable mouse-wheel-scroll-amount de l'une ou l'autre:

Ch v mouse-wheel-scroll-amount (cliquez sur personnaliser, changez la valeur en "Specific # of lines" 1, ApplyAndSave.)

ou ajoutez à .emacs la ligne: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Il existe de nombreuses possibilités répertoriées sur https://www.emacswiki.org/emacs/Scrolling

Philippe
la source