Come scorrere riga per riga in GNU Emacs?


87

Per dirla semplicemente, sto cercando di far scorrere in emacs come in vim e nella maggior parte degli altri editor; quando sono per esempio, due linee dal basso / alto, e premere verso il basso / alto ( Ctrl- p, n, , ) va solo una riga su o giù, non metà dello schermo.


5
Sono convinto che questo non verrà mai risolto. Era una carenza negli ultimi anni '90 ed è ancora rotta qui nel 2010.
Steve Kuo

12
@Steve Kuo: Esci dal picchiare: funziona come previsto, ma può essere modificato (o "corretto") con una semplice impostazione.
Teddy

17
@ Teddy e cos'è questa "impostazione semplice"?
Steve Kuo

1
@ Teddy sì, che cos'è?
Scooter

@Rook: In realtà consiglierei di usare z.in vim più frequentemente per ottenere la sensazione di Emacs ;-) Può essere insolito, ma in realtà è più utile dello scorrimento riga per riga IMHO.
U. Windl

Risposte:


51

Vedi alcuni dei suggerimenti su EmacsWIki:

(setq scroll-passo 1
      scorrere conservativamente 10000)

3
Visto, in realtà - entrambe le risposte, la tua e quella di jrockway, ma su Wiki non sono entrambe consigliate. Sfortunatamente, le ragioni di ciò non sono chiaramente spiegate. Ecco perché ho postato la domanda, sperando che qualcuno abbia trovato un metodo che funziona senza difetti.
Rook

1
Non riesco a capire perché questo non è raccomandato. Ho utilizzato una configurazione simile e ha funzionato abbastanza bene. Per assicurarti ulteriormente, guarda questo documento di scroll-step (nota l'ultima frase): * Il numero di righe per provare a scorrere una finestra quando il punto si sposta. Se ciò non riesce a riportare il punto sul frame, il punto viene invece centrato. Se questo è zero, il punto è sempre centrato dopo che si sposta fuori dal riquadro. Se vuoi che lo scorrimento sia sempre una riga alla volta, dovresti impostare `scroll-conservively 'su un valore elevato piuttosto che impostarlo su 1.
an0

Sì, guardandomi un po 'di più non vedo molto di più per sostenere quella nota cautelativa sul wiki. Ad esempio, il passaggio di scorrimento sembra essere abbastanza comune in più file .emacs tramite una ricerca su Google. Forse l'autore del wiki si riferisce a una vecchia versione di emacs?
ars

Non ho mai avuto problemi con scroll-conservatively. Gli avvertimenti contro questo sono un po 'strani: se causa problemi, è abbastanza facile rimuovere la riga dal tuo init.el!
dbr

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… quindi con emacs <23.1 e file di grandi dimensioni, a volte potrebbe saltare il cursore al centro, il che non sembra il problema più grande
dbr

51

Se vuoi posizionare esattamente lo schermo, puoi usare Ctrl-L.

  • Per impostazione predefinita, posiziona la riga corrente al centro dello schermo.

  • ESC 0 Ctrl-L posiziona la riga corrente in alto.


14
Non fraintendetelo, ma cosa ha a che fare con lo scorrimento riga per riga? (ovvero la domanda)
Rook

9
È ragionevole offrire un flusso di lavoro alternativo che sia (secondo l'autore) più naturale con lo strumento a portata di mano. Ma dovresti premerlo con una dichiarazione di non responsabilità in tal senso e spiegare perché questo approccio è "migliore", se possibile.
dmckee --- ex moderatore gattino

2
@ dmckee - Ho usato vim ... uhmm, molto tempo. Molto bene con esso. Tuttavia, dato che sto facendo qualcosa con lisp, ho iniziato a sforzarmi di fare almeno i conti con emacs, e questo modo "alternativo" di muovermi è troppo per me al momento. Leggi il tutorial, sappilo ... ma è troppo strano, imho. Non naturale.
Rook

1
@ Idigas: certo. È giusto, e non è necessario seguire il consiglio di Starblue. Ma penso che questo tipo di risposta possa essere utile se è chiaro e include una spiegazione convincente.
dmckee --- gattino ex moderatore

1
Sì, questo fa il lavoro in un paio di sequenze di tasti. (Ho cercato su Google "come scorrere riga per riga" solo perché mi sembrava un modo utile per cercare "come far andare il codice dove voglio".) Grazie!
Ennael

42

Sono un po 'in ritardo per la festa, ma se non ti dispiace installare un pacchetto , lo scorrimento fluido ( github , disponibile anche in MELPA ) potrebbe essere quello che stai cercando - sicuramente funziona per me.

Una volta installato, puoi inserire quanto segue nel tuo init.el:

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

L'ultima riga è facoltativa; inizia a scorrere vicino al bordo dello schermo anziché su di esso, quindi hai sempre un po 'di contesto attorno al punto. Regolate a piacere.


7
Sono scoppiato a piangere quando ho letto questo. Abbastanza sicuro che questa sia la risposta alla domanda.
Eric Brown,

3
Sì, come utente Vim che prova Emacs, questo è esattamente quello che stavo cercando.
juanjux

ho usato sia questa soluzione che la soluzione a scorrimento, la combinazione è affascinante quando mi sposto sulla sesta riga dal basso e premo verso il basso per scorrere una riga, e lo stesso dall'alto.
Emad Elsaid

Purtroppo, lo scorrimento fluido ora fallisce abbastanza spesso quando si salta intorno al file utilizzando, ad esempio, la modalità si verifica o la ricerca: entrambi possono portare il punto fuori dallo schermo e devi premere CL per visualizzare il risultato.
Erik Knowles

27

La mia soluzione non è cambiare lo scorrimento predefinito di Emac, ma piuttosto creare un comando di sequenza di tasti da una macro. In questo modo hai un modo conveniente per scorrere una riga alla volta quando vuoi. Non ideale, ma facilissimo. Succede solo che M- (↓) e M- (↑) siano disponibili, quindi è quello che ho usato.

Ecco come l'ho fatto. Innanzitutto, è necessario registrare una macro per gli scroll di una riga, su e giù.

Inizia la macro

C-x ( 

Scorri uno verso il basso

C-u 1 C-v

Ferma macro

C-x )

Per scorrere verso l'alto, usa

C-u 1 M-v

Successivamente è necessario assegnare un nome alla macro.

M-x name-last-kbd-macro

Dagli un nome quando richiesto come:

down-one-line

Quindi utilizzare quanto segue per associare una sequenza di tasti a quel nome di comando:

M-x global-set-key

E su richiesta, usa qualcosa come:

M-(down arrow)

Quindi ti chiederà quale comando vuoi associare e dovresti dargli il nome che hai inventato in precedenza, ad esempio, down-one-line.

Qui è dove ho ottenuto queste informazioni. Puoi anche trovare le istruzioni di seguito e altrove sull'aggiunta della tua macro al file .emacs.

Qui per la spiegazione della definizione della macro

Qui per come controllare lo scorrimento


22

Li uso nel mio .emacsfile dal 2000.

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

In questo modo, posso mantenere il comportamento predefinito di Emacs e scorrere una riga alla volta, a seconda di cosa sto facendo.

Questo ha funzionato almeno fino a GNU Emacs 22. Recentemente ho aggiornato a Emacs 24 e l'ho scoperto View-scroll-line-forwarde View-scroll-line-backwardnon sono più disponibile. Dopo un po 'di ricerche, ho scoperto che lo scorrimento verso l'alto e lo scorrimento verso il basso funzionano. Quindi se stai usando Emacs 24, puoi usare questo.

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

Per lo più ho saltato Emacs 23, quindi se questa è la versione che stai usando, puoi sperimentare entrambi i precedenti.

Nota: in scroll-up-linerealtà scorre una riga verso il basso , perché il buffer viene spostato di una riga verso l'alto.


Grazie, questo funziona ... ma mi ha colpito un altro problema che ho chiesto qui: stackoverflow.com/questions/19256551/...
scorpiodawg

13

Ricollego i miei tasti freccia per eseguire operazioni di scorrimento.

(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)))

2
Questo non è esattamente quello che stavo cercando. Non voglio che lo schermo scorra (come vorrebbe che il blocco dello scorrimento fosse abilitato), ma che lo schermo si "muova" ... oh, ... come fa il blocco note :)
Rook

12

I semplici fanno questo:

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

quindi il meta cursore su si sposta in alto e il meta cursore in basso si sposta in basso.

QED. Non sono sicuro di cosa stessero fumando tutte le persone di cui sopra!


Oppure, come ho appena postato, puoi usare lo scorrimento verso l'alto e lo scorrimento verso il basso.
Rajesh J Advani

5

Ho quanto segue nel mio file .emacs per abilitare un bel comportamento di scorrimento ctrl-up, ctrl-down. Lo uso anche per la rotellina 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)

L'ho appena provato, ma non è il comportamento che stavo cercando. Ti permette di andare fino all'ultima riga sullo schermo, ma cliccando in basso continuerà a "far scattare lo schermo di diverse righe in alto" ... non so come spiegarlo meglio.
Rook

Mi piace l'idea di mappare la rotellina del mouse. Ma non funzionerebbero le funzioni View-scroll-line-forward e View-scroll-line-backward (o le più recenti scroll-up-line e scroll-down-line), invece di definire le proprie funzioni?
Rajesh J Advani

2

Per fare in modo che lo scorrimento "vim" inserisca questo nel file .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)

@ Matt lo fa per me
jjpikoov

2

Dal momento che può essere fastidioso utilizzare il M-up, M-downperché interferisce con la modalità org che sovraccarica questi comandi. Per evitare questo problema io personalmente uso quei comandi che combinano M-page-up M-page-down". Qui ho definito lo scorrimento su e giù fino a 1 riga.

;;;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))))

1

M-x customize-variable scroll-conservatively

Impostalo su 1.

Non vuoi davvero farlo, però.


5
Visto, in realtà - entrambe le risposte, la tua e quella di ars, ma su Wiki non sono entrambe consigliate. Sfortunatamente, le ragioni di ciò non sono chiaramente spiegate. Ecco perché ho postato la domanda, sperando che qualcuno abbia trovato un metodo che funziona senza difetti.
Rook

3
sarebbe utile se tu potessi spiegare a noi niubbi perché questa non è una buona idea.
Daniel

L'unico motivo per cui posso pensare perché questa non è una buona idea è che lo scorrimento diventa lento: dovrai sempre scorrere di una riga alla volta, invece del mezzo schermo predefinito. (Immagino?)
ShreevatsaR

1

Se stai cercando un modo rapido per creare un effetto simile allo scorrimento, inserisci C-ne in C-lsequenza che sposta il cursore verso il basso e quindi lo centra.


0

Se avvii emacs in .xsession, nel mio caso l'impostazione dello scroll conservativo su 100+ non funzionerà, né lo scroll-step 1. Ma se avvii emacs dopo X, funziona.


0

Se non ti dispiace usare il mouse e hai una rotellina di scorrimento, puoi personalizzare la quantità variabile di scorrimento della rotellina del mouse in uno dei seguenti modi:

Ch v mouse-wheel-scroll-amount (fai clic su personalizza, cambia il valore in "Numero di righe specifico" 1, Applica e salva.)

oppure aggiungi a .emacs la riga: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Ci sono molte possibilità elencate su https://www.emacswiki.org/emacs/Scrolling

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.