emacs: Como retornar para a última posição após o scroll / page up / down?

13

Depois de emitir scroll-up ou scroll-down no 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 de marca)?

Alternativamente, existe alguma maneira (sem interferir com o anel de marca) para alterar o comportamento de rolagem, de modo que a rolagem para cima e depois para baixo (ou vice-versa) retorne o ponto à sua posição original? (por exemplo, fazer 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 de provocação: eu rodo para ver outra parte do meu código sem me lembrar de adicionar minha linha ao anel de marca e então é Foi doloroso tentar relocar a linha de código em que estava trabalhando. Por isso, enquanto peço uma solução técnica, também gostaria de saber como usuários experientes evitam esse problema. Você acabou de se acostumar a lembrar de definir uma marca, dividir a janela para olhar em volta ou usar algum outro padrão?

Obrigado

    
por Ian Mackinnon 03.09.2010 / 18:31

4 respostas

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

Com essa configuração , se você criar uma página 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.

    
por 03.09.2010 / 21:17
6

O que encontrei para funcionar bem é usar goto-last-change.el , que te leva de volta ao local onde você fez a última edição. Eu gosto da ligação:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\") 'goto-last-change)
    
por 03.09.2010 / 20:46
1

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

Normalmente, vou dividir a tela quando preciso procurar brevemente em outro lugar. Então eu posso voltar para a tela original com C-x o , desmembrar com C-x 1 e voltar ao normal.

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

    
por 03.09.2010 / 19:39
0

Se eu estiver apenas rolando algumas linhas de onde estou atualmente, posso usar isso 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 eu estou indo para uma seção completamente diferente de um arquivo (ou para um arquivo diferente), às vezes eu uso breadcrumb embora 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 depois descartarei a segunda janela quando terminar.

Na maioria das vezes, eu uso apenas dois quadros, sendo um deles o meu quadro de trabalho atual e o outro é o meu quadro de referência, usado para pular os mesmos arquivos ou outros arquivos.

    
por 04.09.2010 / 20:15