Como rolar linha por linha no GNU Emacs?


87

Para simplificar, estou tentando fazer a rolagem no emacs como no vim e na maioria dos outros editores; quando estou por exemplo, duas linhas a partir da parte inferior / superior, e eu pressionar para cima / baixo ( Ctrl- p, n, , ) ele vai apenas uma linha para cima ou para baixo, não a metade da tela.


5
Estou convencido de que isso nunca será consertado. Era uma deficiência nos últimos 90 e ainda está quebrada aqui em 2010.
Steve Kuo

12
@Steve Kuo: Saia do bashing - funciona como planejado , mas pode ser alterado (ou "consertado") com uma configuração simples.
Teddy

17
@Teddy e o que é essa "configuração simples"?
Steve Kuo

1
@Teddy sim, o que é?
Scooter de

@Rook: Na verdade, eu recomendaria usar o z.vim com mais frequência para ter a sensação do Emacs ;-) Pode ser incomum, mas na verdade é mais útil do que rolar linha por linha IMHO.
U. Windl

Respostas:


51

Veja algumas das sugestões no EmacsWIki:

(setq scroll-step 1
      rolar conservadoramente 10000)

3
Vi, na verdade - ambas as respostas, a sua e a de jrockway, mas na Wiki ambas não são recomendadas. Infelizmente, as razões para isso não estão claramente explicadas. É por isso que postei a pergunta, esperando que alguém tenha encontrado um método que funcione sem falhas.
Torre de

1
Não consigo ver por que isso não é recomendado. Tenho usado uma configuração semelhante e tem funcionado muito bem. Para garantir a você ainda mais, consulte este documento de scroll-step (observe a última frase): * O número de linhas para tentar rolar uma janela quando o ponto sair. Se isso falhar em trazer o ponto de volta ao quadro, o ponto será centralizado. Se for zero, o ponto estará sempre centralizado depois de sair do quadro. Se você quiser que a rolagem seja sempre uma linha de cada vez, você deve definir `scroll-conservatory 'para um valor grande ao invés de definir isso para 1.
an0

Sim, olhando em volta um pouco mais, não vejo muito mais para fazer o backup dessa nota de advertência no wiki. Por exemplo, scroll-step parece ser bastante comum em vários arquivos .emacs por meio de uma pesquisa no Google. Talvez o autor do wiki esteja se referindo a uma versão antiga do emacs?
ars

Nunca tive problemas com scroll-conservatively. Os avisos contra isso são um pouco estranhos - se causar problemas, é fácil remover a linha de seu init.el!
dbr

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… então, com emacs <23.1 e arquivos grandes, às vezes pode pular o cursor para o meio, o que não parece ser o maior problema
dbr

51

Se você deseja posicionar a tela exatamente, você pode usar Ctrl-L.

  • Por padrão, ele posiciona a linha atual no meio da tela.

  • ESC 0 Ctrl-L posiciona a linha atual no topo.


14
Não me leve a mal, mas o que isso tem a ver com rolar linha por linha? (ou seja, a pergunta)
Rook

9
É razoável oferecer um fluxo de trabalho alternativo (na opinião do autor) mais natural com a ferramenta disponível. Mas você deve começar com uma isenção de responsabilidade e explicar por que essa abordagem é "melhor", se possível.
dmckee --- ex-moderador gatinho

2
@dmckee - Eu uso o vim ... uhmm, há muito tempo. Muito bem com isso. No entanto, como estou fazendo algo com ceceio, comecei a me forçar a pelo menos me familiarizar com o emacs de novo, e essa maneira "alternativa" de me mover é demais para mim no momento. Leia o tutorial, saiba ... mas, é muito estranho, imho. Não natural.
Rook

1
@Idigas: Claro. Isso é justo, e você não precisa seguir o conselho de starblue. Mas acho que esse tipo de resposta pode ser útil se for direto e incluir uma explicação convincente.
dmckee --- ex-moderador gatinho

1
Yay, isso faz o trabalho em algumas teclas. (Eu pesquisei "como rolar linha por linha" no Google apenas porque parecia uma maneira útil de pesquisar "como fazer o código ir para onde eu queria".) Obrigado!
Ennael

42

Estou um pouco atrasado para a festa, mas se você não se importa em instalar um pacote, então o smooth-scrolling ( github , também disponível na MELPA ) pode ser o que você está procurando - certamente funciona para mim.

Depois de instalado, você pode inserir o seguinte em seu init.el:

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

A última linha é opcional; ele começa a rolar próximo à borda da tela, em vez de nela, então você sempre tem um pouco de contexto em torno do ponto. Ajuste a gosto.


7
Eu comecei a chorar quando li isso. Tenho certeza de que esta é a resposta à pergunta.
Eric Brown,

3
Sim, como um usuário Vim tentando Emacs, isso é exatamente o que eu estava procurando.
juanjux,

Eu usei essa solução e a solução de scroll-step, a combinação é fascinante quando eu movo para a 6ª linha de baixo e pressiono para baixo, ele vai rolar uma linha, e o mesmo de cima.
Emad Elsaid

Infelizmente, a rolagem suave agora falha com frequência quando você está pulando em seu arquivo usando, por exemplo, modo de ocorrência ou pesquisa: ambos podem trazer o ponto para fora da tela e você precisa pressionar CL para exibir o resultado.
Erik Knowles

27

Minha solução não é mudar a rolagem padrão do Emac, mas sim criar um comando de sequência de teclas a partir de uma macro. Desta forma, você tem uma maneira conveniente de rolar uma linha por vez quando quiser. Não é o ideal, mas é super fácil. Acontece que M- (↓) e M- (↑) estão disponíveis, então foi o que usei.

É assim que eu fiz. Primeiro, você precisa gravar uma macro para rolagens de uma linha, para cima e para baixo.

Começar macro

C-x ( 

Role para baixo um

C-u 1 C-v

Macro de parada

C-x )

Para rolar para cima, use

C-u 1 M-v

Em seguida, você precisa nomear a macro.

M-x name-last-kbd-macro

Dê a ele um nome quando solicitado como:

down-one-line

Em seguida, use o seguinte para vincular uma sequência de teclas a esse nome de comando:

M-x global-set-key

E ao solicitar, use algo como:

M-(down arrow)

Em seguida, ele perguntará qual comando você deseja vincular, e você deve dar a ele o nome que inventou anteriormente, por exemplo, down-one-line.

Aqui é onde obtive essas informações. Você também pode encontrar instruções abaixo e em outros lugares sobre como adicionar sua macro ao arquivo .emacs.

Aqui para uma explicação de definição de macro

Aqui, como controlar a rolagem


22

Tenho usado isso em meu .emacsarquivo desde 2000.

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

Dessa forma, posso manter o comportamento padrão do Emacs, bem como rolar uma linha por vez, dependendo do que estou fazendo.

Isso funcionou até pelo menos GNU Emacs 22. Eu recentemente atualizado para Emacs 24 e descobriu que View-scroll-line-forwarde View-scroll-line-backwardnão estão mais disponíveis. Depois de alguma caça, descobri que a linha de rolagem para cima e a linha de rolagem para baixo funcionam. Então, se você estiver usando o Emacs 24, você pode usar isso.

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

Eu geralmente pulei o Emacs 23, então se essa é a versão que você está usando, você pode experimentar os dois acima.

Nota: scroll-up-linena verdade rola uma linha para baixo , porque o buffer está sendo movido uma linha para cima.


Obrigado, isso funciona ... mas encontrei outro problema sobre o qual perguntei aqui: stackoverflow.com/questions/19256551/…
scorpiodawg

13

Eu religo minhas teclas de seta para realizar operações de rolagem.

(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
Não era exatamente isso que eu procurava. Não quero que a tela role (como gostaria que o scroll-lock estivesse habilitado), mas que a tela "se mova" ... ah, ... como o notepad faz :)
Rook

12

Simplesmente faça isso:

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

em seguida, o meta cursor para cima move para cima e o meta cursor para baixo move para baixo.

QED. Não tenho certeza do que todas as pessoas acima estavam fumando!


Ou, como acabei de postar, você pode usar a linha de rolagem para cima e a linha de rolagem para baixo.
Rajesh J Advani

5

Eu tenho o seguinte em meu arquivo .emacs para permitir um bom comportamento de rolagem ctrl-up e ctrl-down. Eu também uso isso para a roda do 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)

Acabei de tentar isso, mas não é o comportamento que estava procurando. Ele permite que você desça até a última linha da tela, mas ao clicar nele ainda vai "puxar a tela várias linhas para cima" ... não sei como explicar melhor.
Torre de

Gosto da ideia de mapear a roda do mouse. Mas as funções embutidas View-scroll-line-forward e View-scroll-line-backward (ou as novas linhas de rolagem para cima e para baixo) não funcionariam, em vez de definir suas próprias funções?
Rajesh J Advani

2

Para que a rolagem "vim" coloque isso em seu arquivo .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 faz por mim
jjpikoov

2

Uma vez que pode ser irritante usar o M-up, M-downporque interfere com o modo org que sobrecarrega esses comandos. Para evitar esse problema, eu pessoalmente uso aqueles comandos que combinam M-page-up M-page-down". Aqui eu defini a rolagem para cima e para baixo em 1 linha.

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

Defina-o como 1.

Você realmente não quer fazer isso, no entanto.


5
Vi, na verdade - ambas as respostas, a sua e a de ars, mas na Wiki ambas não são recomendadas. Infelizmente, as razões para isso não estão claramente explicadas. É por isso que postei a pergunta, esperando que alguém tenha encontrado um método que funcione sem falhas.
Torre de

3
seria útil se você pudesse explicar para nós, novatos, por que isso não é uma boa ideia.
Daniel de

A única razão pela qual posso pensar que isso não é uma boa ideia é que a rolagem fica lenta: você sempre terá que rolar uma linha por vez, em vez da meia tela padrão. (Eu acho?)
ShreevatsaR

1

Se você está procurando uma maneira rápida de criar um efeito de rolagem, entre em C-ne C-lsequencialmente que move o cursor para baixo e depois o centraliza.


0

Se você iniciar o emacs em .xsession, no meu caso definir scroll-conservively para 100+ não funcionará, nem scroll-step 1. Mas se você iniciar o emacs após X, ele funcionará.


0

Se você não se importa em usar o mouse e possui uma roda de rolagem, pode personalizar a variável mouse-wheel-scroll-amount:

Ch v mouse-wheel-scroll-amount (clique em personalizar, altere o valor para "Número específico de linhas" 1, ApplyAndSave.)

ou adicione a .emacs a linha: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((controle). escala de texto)))

Existem muitas possibilidades listadas em https://www.emacswiki.org/emacs/Scrolling

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.