2013-04-09 8 views
15

È 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 utilizzo Emacs su qualsiasi editor GUI. Quando si scorre verso il basso, il cursore viene "spinto in avanti" dalla parte superiore del buffer.Consenti a Emacs di spostare il cursore fuori dallo schermo

Avevo pensato che fosse completamente impossibile, perché questo è cablato nell'architettura di Emacs, ma poi ho visto multiple-cursors, che fa esattamente questo per i cursori secondari (supponendo che si impedisca alle funzioni di scorrimento di agire su i cursori secondari). È forse possibile utilizzare cursori multipli per avere il cursore principale in un buffer nascosto e il cursore effettivo con ciò che effettivamente modificherò? O forse qualche altro trucco intelligente? O forse il mio googling mi ha deluso e questo è davvero possibile senza alcuna magia?

+0

Probabilmente. Questo è il più vicino che posso consigliare: http://superuser.com/questions/184340/emacs-how-to-return-to-last-position-after-scroll-page-up-down – Dmitry

+0

Nota che puoi sempre andare torna a ** qualsiasi ** posizione del cursore precedente con 'Cu C-space' (cioè scorri fino a dove devi scorrere, e ritorna ovunque dovessi essere originariamente con questo comando) –

risposta

2

Strettamente parlando, non è possibile spostare il cursore fuori dallo schermo, perché il codice C sottostante non ti consente di farlo.

Detto ciò, sospetto che il problema possa essere risolto. Fondamentalmente, ci sono 2 aspetti:

  • non ti piace il modo in cui le cose appaiono quando "il cursore viene spinto in avanti". Puoi ovviare a ciò rendendo (temporaneamente) invisibile il cursore.
  • si desidera "saltare indietro" alla posizione di pre-scorrimento non appena si emette un comando di non scorrimento. Probabilmente c'è qualche pacchetto che lo fa per te, ma puoi farlo da solo con un po 'di hacking pre-command-hook.

BTW, gradirei le patch in Emacs che forniscono alcune di queste funzionalità. Odio il comportamento di "auto jump-back" di altri editor, ma sarebbe bene registrare la posizione di "pre-scorrimento" e quindi offrire un modo per tornare ad esso.

+0

Sì, penso che una combinazione di quei due punti elenco sarebbe dammi esattamente quello che voglio – asmeurer

+0

C'è un modo per agganciare le funzioni che spostano il cursore durante lo scorrimento? In particolare, c'è un hook che potrebbe notificarmi * prima * la posizione di 'point' viene modificata da un comando di scorrimento? Inoltre, in quali file C dalla sorgente di Emacs posso trovare il codice che definisce questo comportamento? – nispio

+0

@nispio: Non penso che ci sia ancora un tale aggancio. IIRC nel momento in cui Emacs decide che quel punto deve essere spostato per rimanere sullo schermo, non possiamo facilmente eseguire il codice Elisp, ma probabilmente potremmo nascondere la posizione del punto da qualche parte. Potresti 'M-x report-emacs-bug' richiedere tale caratteristica? – Stefan

2

A giudicare dal contesto e dalla descrizione del problema, sembra che si desideri esplorare il buffer preservando il luogo di modifica. Ci sono almeno due trucchi per questo scopo: segni/registri e suddivisione in due finestre.

https://stackoverflow.com/a/3777598/308668 descrive i registri di Emacs che fungono da segni di Vim. Puoi controllare nel tuo posto nel file con la chiave C-x r SPC a (a essere una lettera di tua scelta) e puoi sempre tornare con C-x r j a.

Una sorta di automazione è ottenuta da uno script esterno (goto-last-change.el), descritto qui: https://superuser.com/a/184402/49046.

In alternativa, dividere la finestra in due con C-x 2. Le finestre appena divise mostrano entrambe la stessa posizione e puoi usare l'altra per esplorare. C-x 0 chiude una finestra quando hai finito.

+0

'goto-last-change' sembra una soluzione ragionevole. – asmeurer

6

C'è un nuovo pacchetto disponibile su GNU ELPA chiamato scroll-restore che tenta di risolvere questo problema. Finora, ho riscontrato alcuni bug, ma il pacchetto sembra funzionare come pubblicizzato per la maggior parte.

È possibile verificare il lavoro svolto con l'installazione con

M-x package-install RET scroll-restore RET 

Dopo aver installato il pacchetto, è possibile attivare la modalità di minore con

M-x scroll-restore-mode 

Personalmente, sto legandolo al Scroll Lock chiave perché sembra così incredibilmente a proposito! Questo è quello 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) 

Questa è una copia diretta di una risposta postato qui: https://emacs.stackexchange.com/a/2273/93

non
+0

Richiede 24.4? Non è comparso nell'elenco quando stavo usando 24.3. – asmeurer

+0

Lo sto eseguendo su 24.3. Il pacchetto è stato appena rilasciato per la prima volta il 2014-10-16, quindi è necessario assicurarsi di aggiornare l'elenco dei pacchetti. Non so come funziona l'ELPA, ma se usa specchi, è possibile che il pacchetto non abbia raggiunto tutto il mirror. Puoi anche scaricare ['scroll-restore.el'] (http://elpa.gnu.org/packages/scroll-restore-1.0.el) dal sito web di GNU ELPA e aggiungerlo al tuo sito-lisp. – nispio

+0

il mio cursore non torna a essere visibile. Eventuali suggerimenti? –