Consenti a Emacs di spostare il cursore fuori dallo schermo


23

Questa domanda è stata originariamente posta su /programming/15895313/let-emacs-move-the-cursor-off-screen , ma tutte le risposte che ho ricevuto più o meno hanno detto "non si può fare" , che con emacs non accetto.

È possibile consentire a Emacs di spostare il cursore fuori dallo schermo, come funziona la maggior parte degli editor di testo della GUI? Questa è una delle cose più grandi che mi dà fastidio quando uso Emacs su qualsiasi editor di GUI. Quando scorro verso il basso, il cursore viene "spinto in avanti" dalla parte superiore del buffer.

In precedenza avevo pensato che fosse completamente impossibile, perché questo è collegato all'architettura di Emacs, ma poi ho visto più cursori, il che fa esattamente questo per i cursori secondari (supponendo che tu impedisca alle funzioni di scorrimento di agire sul secondario cursori). È forse possibile usare più cursori per avere il cursore principale in un buffer nascosto e il cursore effettivo è quello con cui effettuo la modifica? O forse qualche altro trucco intelligente? O forse il mio Googling mi ha deluso e questo è già possibile senza magia?

Uso i terminali emacs, quindi dovrebbe funzionare lì.


Tieni presente che tutto il pacchetto a cursori multipli è l'aggiunta di cursori falsi che non sono soggetti alle restrizioni di quello reale. Spero che ci sia una risposta basata sui suggerimenti della tua domanda precedente.
Wasamasa,

Suppongo che questo problema sia specifico dell'uso delle barre di scorrimento, giusto?
nispio,

1
Quindi quali comandi di scorrimento stai usando che ti aspetteresti di non portare con te il cursore? Nella mia esperienza il cursore ti segue in tutti gli editor quando usi PgUp / PgDn o i tasti freccia.
nispio,

4
@nispio forse scorrendo con la rotellina del mouse?
ffevotte,

2
Pagina su e Pagina giù (Cv e Mv) non spostano il cursore in emacs a meno che il cursore non si sposti dallo schermo. Lo scorrimento è diverso dallo spostamento (il cursore).
asmeurer,

Risposte:


11

C'è un nuovo pacchetto disponibile su GNU ELPA chiamato scroll-restoreche tenta di risolvere questo problema. Ci sono una manciata di comportamenti diversi tra cui scegliere, ma il modo in cui l'ho configurato per me stesso (vedi sotto) fa sì che il cursore diventi invisibile durante i comandi di scorrimento, quindi torna alla sua posizione originale quando ricomincio a digitare.

Finora ho riscontrato alcuni bug, ma il pacchetto sembra funzionare come pubblicizzato per la maggior parte. Puoi provarlo installandolo con

M-x package-install RET scroll-restore RET

Dopo aver installato il pacchetto, è possibile abilitare la modalità secondaria con

M-x scroll-restore-mode

Personalmente, lo sto legando alla Scroll Lockchiave perché sembra così incredibilmente a proposito! Questo è ciò che sto aggiungendo al mio file 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)

1
Se hai associato una chiave ad esso, suppongo che tu voglia disabilitarlo a volte. Questa modalità è fastidiosa per le normali modifiche?
T. Verron,

1
@ T.Verron Sembra piuttosto pieno di errori in questo momento, e una delle sue modalità di fallimento è "intrappolare" il cursore in un'area e non lasciarlo andare. L'unico modo in cui ho trovato di liberare di nuovo il cursore è disabilitare la modalità. Una volta risolti tutti i bug, non mi dispiacerebbe usarlo tutto il tempo.
nispio,

2
Come dovrebbe funzionare? Non riesco a convincerlo a fare nulla.
asmeurer,

5

Il metodo che uso sempre è quello di impostare il segno in cui voglio tornare indietro, e quindi quando ho finito di esaminare il buffer, apro il segno usando C-u C-SPC. Anche quando dimentico di lasciare il segno prima di vagare, trovo che schioccare il segno di solito mi porta abbastanza vicino da dove vengo. Ciò è dovuto in parte al fatto che alcuni comandi (come isearchad esempio) impostano il segno senza che te ne accorga. Quindi, nel corso della modifica, hai inavvertitamente lasciato una piccola traccia di pangrattato.

Dalla documentazione:

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

Non mi preoccupo quasi mai di impostare segnalibri o registri, ma riesco quasi sempre a tornare da dove vengo rapidamente usando C-u C-SPCo pop-global-mark.


Francamente, penso che il motivo principale per cui le persone vogliono che il cursore sia in grado di spostarsi fuori dallo schermo è perché sono abituati a editor che non hanno una cronologia corretta delle posizioni del cursore. Si potrebbe anche fare in modo che scroll-upe scroll-downautomaticamente impostato il marchio, in modo che C-u C-SPCsarebbe essere sicuri di farti tornare da dove sei venuto.
Radon Rosborough,

0

Il seguente codice è abbastanza buono per me per tornare indietro dopo lo scorrimento della rotellina 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.