emacs: Como retornar à última posição após rolar / página para cima / baixo?


14

Após a emissão scroll-upou scroll-downno emacs, existe uma maneira rápida de retornar o ponto à sua posição anterior (supondo que eu não lembrei de adicioná-lo ao anel da marca)?

Como alternativa, existe alguma maneira (sem interferir no anel da marca) de alterar o comportamento da rolagem, de modo que a rolagem para cima e a rolagem para baixo (ou vice-versa) retornem o ponto à sua posição original? (por exemplo, faça a rolagem mover o ponto exatamente x linhas onde x é a altura da tela)

Estou no processo de me acostumar com o emacs e esta é uma das situações mais comuns que provocam maldições: rolar para ver outra parte do meu código sem lembrar de adicionar minha linha ao anel de marcação e, depois, é doloroso tentar para realocar a linha de código em que estava trabalhando. Sendo assim, enquanto estou solicitando uma solução técnica, também estaria interessado em saber como usuários experientes evitam esse problema. Você se acostuma a lembrar de definir uma marca, dividir a janela para olhar em volta ou usar algum outro padrão?

obrigado

Respostas:


13
(setq scroll-preserve-screen-position t)

Com essa configuração , se você pagina para cima e para baixo, o cursor retorna à sua linha original. Ele também mantém sua coluna original no Emacs versão 23 ou mais recente.

Você pode ou não preferir

(setq scroll-preserve-screen-position 'always)

que sempre preserva a posição da tela do cursor ao rolar, em vez de preservar a posição do cursor no buffer, se a posição original ainda estiver visível.


2
Obrigado de mim também! Por (umm muitos!) Anos, eu digitei "<>" antes de rolar, apenas tenha um alvo de pesquisa para retornar.
JRobert 04/04

Para mim, isso faz com scroll-up-lineque (que é o que eu uso com minha roda de rolagem) faça o cursor avançar um caractere quando ele atingir a parte superior ou inferior da tela.
asmeurer 15/05

@asmeurer Não observo isso. Deve haver algo estranho no seu arquivo init ou um bug na sua versão do Emacs.
Gilles 'SO- stop be evil'

Sim, eu descobri isso depois de postar isso. Abri uma nova pergunta em emacs.stackexchange.com/questions/12439/… .
asmeurer 15/05

Eu acho que deveria ser (setq scroll-preserve-screen-position 'always). Caso contrário, C-v M-vnão pôs um ponto onde você começou (A segunda posição ponto é visível na primeira tela cheia de modo ponto de não se mover para trás.).
Wilfred Hughes

6

O que eu achei que funcionou bem é usar goto-last-change.el, o que leva você de volta ao local em que você fez uma edição pela última vez. Eu gosto da encadernação:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
Equivalentemente, sem a necessidade de um pacote adicional: C-_ C-f C-_(desfazer, mover, desfazer).
Gilles 'SO- stop be evil'

1
@ Gilles True, mas sua pilha de desfazer cresceu mais dois elementos. :)
Trey Jackson

1

Em resposta à sua pergunta sobre como evito o problema que você descreve (procurando em outro lugar no código e retornando ao ponto em que eu estava trabalhando) ...

Normalmente, dividirei a tela quando precisar procurar brevemente em outro lugar. Depois, posso voltar à tela original com C-x o, sem dividir C-x 1e voltei ao normal.

Eu também uso a pesquisa i para frente e para trás para localizar um ponto de interesse específico no código. Acho que é uma maneira bastante eficiente de navegar no código quando sei o que estou procurando.


0

Se eu estiver rolando apenas algumas linhas de onde estou atualmente, posso usá-lo para rolar a janela sem mover o ponto:

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

Se estou mudando para uma seção completamente diferente de um arquivo (ou para um arquivo completamente diferente), às vezes eu uso, breadcrumbembora existam muitos outros pacotes que fazem coisas semelhantes.

Se eu precisar visualizar visualmente duas áreas de código ao mesmo tempo, dividirei o quadro horizontalmente em duas janelas e descartarei a segunda janela quando terminar.

Principalmente, porém, eu apenas uso dois quadros, um sendo o meu quadro de trabalho atual e o outro é o meu quadro de referência, usado para pular o mesmo ou outros arquivos.


Se tudo o que você quer fazer é ver acima ou abaixo do ponto atual sem se mover para lá, você pode pedalar C-l.
asmeurer
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.