Laissez Emacs déplacer le curseur hors de l'écran

23

Cette question a été initialement posée sur /programming/15895313/let-emacs-move-the-cursor-off-screen , mais toutes les réponses que j'ai reçues ont plus ou moins dit "ça ne peut pas être fait" , ce que je n'accepte pas avec emacs.

Est-il possible de laisser Emacs déplacer le curseur hors de l'écran, comme la plupart des éditeurs de texte GUI fonctionnent? C'est l'une des plus grandes choses qui me dérange lorsque j'utilise Emacs sur n'importe quel éditeur GUI. Lorsque je défile vers le bas, le curseur est "poussé vers l'avant" par le haut du tampon.

J'avais précédemment pensé que c'était complètement impossible, car cela est câblé dans l'architecture d'Emacs, mais j'ai ensuite vu plusieurs curseurs, ce qui fait exactement cela pour les curseurs secondaires (en supposant que vous empêchiez les fonctions de défilement d'agir sur le secondaire). curseurs). Est-il possible d'utiliser plusieurs curseurs pour avoir le curseur principal dans un tampon caché, et le curseur efficace étant ce avec quoi je modifie réellement? Ou peut-être un autre truc intelligent? Ou peut-être que mon googling m'a échoué et que c'est vraiment déjà possible sans magie?

J'utilise le terminal emacs, donc cela devrait fonctionner là-bas.

asmeurer
la source
Gardez à l'esprit que tout le paquet de curseurs multiples ajoute des faux curseurs qui ne sont pas soumis aux restrictions du vrai. J'espère qu'il y aura une réponse basée sur les suggestions de votre question précédente.
wasamasa
Je suppose que ce problème est spécifique à l'utilisation des barres de défilement, n'est-ce pas?
nispio
1
Alors, quelles commandes de défilement utilisez-vous que vous vous attendriez à ne pas amener avec vous le curseur? D'après mon expérience, le curseur vous suit dans tous les éditeurs lorsque vous utilisez PgUp / PgDn ou les touches fléchées.
nispio
4
@nispio peut-être défiler avec la molette de la souris?
ffevotte
2
La page vers le haut et la page vers le bas (Cv et Mv) ne déplace pas le curseur dans emacs à moins qu'il ne se déplace hors de l'écran. Le défilement est différent du déplacement (le curseur).
asmeurer

Réponses:

11

Il existe un nouveau package disponible sur GNU ELPA appelé scroll-restorequi tente de remédier à ce problème. Il y a une poignée de comportements différents à choisir, mais la façon dont je l'ai configuré pour moi-même (voir ci-dessous) fait que le curseur devient invisible pendant les commandes de défilement, puis revient à son emplacement d'origine lorsque je recommence à taper.

Jusqu'à présent, j'ai rencontré quelques bugs, mais le package semble fonctionner comme annoncé pour la plupart. Vous pouvez le tester en l'installant avec

M-x package-install RET scroll-restore RET

Une fois le package installé, vous pouvez activer le mode mineur avec

M-x scroll-restore-mode

Personnellement, je le lie à la Scroll Lockclé car il semble si incroyablement approprié! Voici ce que j'ajoute à mon fichier 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
la source
1
Si vous y avez lié une clé, je suppose que vous souhaitez parfois la désactiver. Ce mode est-il gênant pour une édition normale?
T. Verron
1
@ T.Verron Il semble assez bogué en ce moment, et l'un de ses modes de défaillance est de "piéger" votre curseur dans une zone et de ne pas le laisser partir. Le seul moyen que j'ai trouvé pour libérer à nouveau mon curseur est de désactiver le mode. Une fois que tous les bugs ont été résolus, cela ne me dérangerait pas de l'utiliser tout le temps.
nispio
2
Comment est-ce censé fonctionner? Je n'arrive pas à le faire faire quoi que ce soit.
asmeurer
5

La méthode que j'utilise toujours consiste à définir la marque à laquelle je veux revenir, puis lorsque j'ai fini de parcourir le tampon, je pop la marque à l'aide C-u C-SPC. Même lorsque j'oublie de fixer la marque avant de m'éloigner, je trouve que le fait d'appuyer sur la marque me place généralement assez près d'où je viens. Cela est dû en partie au fait que certaines commandes (comme isearchpar exemple) définissent la marque sans même que vous vous en rendiez compte. Donc, au cours de votre montage, vous avez laissé par inadvertance une petite trace de chapelure.

De la documentation:

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').

Je ne me soucie presque jamais de définir des signets ou des registres, mais je peux presque toujours retrouver mon chemin d'où je viens en utilisant rapidement C-u C-SPCou pop-global-mark.

nispio
la source
Franchement, je pense que la principale raison pour laquelle les gens veulent que le curseur puisse se déplacer hors écran est parce qu'ils sont habitués aux éditeurs qui n'ont pas un historique correct des positions du curseur. Vous pouvez également faire en sorte que scroll-upet scroll-downdéfinir automatiquement la marque, afin que C-u C-SPCvous soyez sûr de revenir d'où vous venez.
Radon Rosborough
0

Le code suivant est assez bon pour moi de revenir en arrière après le défilement de la molette de la souris:

(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
la source