Como evitar a rolagem com arquivos grandes pendurados por curtos períodos de tempo? (mantendo pressionadas as teclas da página, por exemplo)

9

Mesmo usando as configurações padrão ( emacs -Q), descobri que arquivos C grandes podem demorar para rolar com o Emacs.

Se, por exemplo, eu abrir um arquivo grande e segure Page-Down. Ele rolará 1-2 páginas para baixo e, em seguida, travará por um ou dois segundos. Ao liberar o documento, rolará muitas páginas para baixo (20 páginas ou mais). *

Eu sei que o Emacs é capaz de comportamento menos irregular, porque, se eu tocar rapidamente page down, ele conseguirá acompanhar e não ficará travado como antes.

É possível que o Emacs não tente manipular vários eventos ao mesmo tempo e, em vez disso, redesenhe entre os eventos?

Ou, de alguma forma, tornar-se mais responsivo em vez de travar enquanto ele tenta processar muitos eventos?


* A desaceleração real nesse caso é causada pelo realce da sintaxe, pois se eu rolar o documento inteiro uma vez, a rolagem é rápida. Analisei as diferentes opções relacionadas ao bloqueio de fontes e concluí que os padrões de bloqueio de fontes são razoáveis ​​e ajustá-los não resolve o problema, mencionando isso, já que eu já investiguei isso e não acho que seja uma parte importante disso. questão.

ideasman42
fonte
11
Isso não parece normal. Você já fez algum teste para descobrir qual é a causa? Pode estar relacionado à configuração do seu emacs (teste emacs -Qpara descartar isso), ou pode ser que seu disco esteja muito lento. Você também pode tentar desativar o realce da sintaxe ou outro comportamento útil (coloque o buffer no modo fundamental).
db48x
11
Por configurações padrão, eu quis dizer emacs -Q, pergunta editada. A desaceleração é definitivamente o destaque da sintaxe. No entanto, a situação piorou com o emacs tentando lidar com todos os eventos antes de redesenhar.
ideasman42

Respostas:

10

Como você notou, isso acontece basicamente quando a exibição é lenta demais por algum motivo. Não há muito que possamos fazer no caso geral (quando é "muito lento"), mas quando é "um pouco lento demais", você pode tentar um deles (ou ambos, embora provavelmente não faça nada além de apenas um dos dois):

(setq jit-lock-defer-time 0)
(setq fast-but-imprecise-scrolling t)

Observe que os dois são novos no Emacs-25.

Stefan
fonte
2
A sequência de documentos da variável fast-but-imprecise-scrollingdeclara " Quando não nulo, acelere as operações de rolagem " . Talvez o exemplo deva refletir um valor não nulo, pois isso aceleraria a rolagem.
lawlist
2
  1. Uma coisa que você pode fazer é passar um argumento de prefixo numérico para o comando de rolagem, em vez de apenas pressionar e manter pressionada a tecla para invocá-lo repetidamente.

    Por exemplo, se você estiver usando a <next>chave (aka PageDown), o comando que ela chama é scroll-up-command. E C-h f scroll-up-commanddiz que um prefixo numérico arg diz para rolar tantas linhas.

    Por exemplo: Suponha que seu buffer possua 50.000 linhas e o cursor esteja na parte superior (na primeira linha). Se você o fizer C-u 25000 <next>, ele rolará até a metade do buffer (25.000 linhas).

    Ainda haverá uma pausa, mas será um pouco menor.

  2. Outra possibilidade é diminuir um certo número de coisinhas grandes do Emacs. Se o seu buffer separar seções de texto usando caracteres ^L(Control-L, feed de formulário), você poderá usar os comandos de navegação da página, como forward-page, ao qual está vinculado C-x ]. Novamente, você pode passar um argumento de prefixo numérico para avançar tantas páginas ao mesmo tempo. Se não houver ^Lcaracteres, você poderá usar forward-paragraph( C-<down>) forward-lineou outro comando de movimento com o prefixo arg.

  3. Da mesma forma, você pode usar o comando goto-line( M-g M-g) para ir para um número de linha específico. (Escolha um número grande.) O comando what-lineinforma qual é o número da linha atual (você também pode exibi-lo na linha de modo). ( M->leva você até o final do buffer, onde M-x what-linevocê informa quantas linhas existem no total.)

  4. (Adicionado após o seu comentário sobre deslizar até você ver isso ou aquilo.) Use a pesquisa incremental para navegação. Procure em frente algo próximo do local em que deseja rolar, usando C-sou (para pesquisa regexp) C-M-s.

    Se você usar a biblioteca Isearch + , também poderá incorporar predicados arbitrários em sua pesquisa, em tempo real.

    Ou seja, você não precisa pesquisar usando apenas a correspondência de padrões. Você pode, por exemplo, procurar (1) corresponder a um padrão que seleciona um bloco de comentários inteiro ou uma switchdeclaração completa e (2) exigir que a correspondência tenha um determinado tamanho (número de caracteres).

    O Isearch + também permite procurar correspondências para vários padrões ou procurar uma correspondência para um padrão dentro de uma determinada distância para ("próximo") uma correspondência para outro padrão (onde a distância é medida em caracteres, palavras, sexps, listas, frases). ..)

Desenhou
fonte
11
Estou familiarizado com as formas de pular o documento, colocar a página para baixo ou usar a roda do mouse, principalmente para ler rapidamente um arquivo (você pode rolar rapidamente para baixo até encontrar um grande bloco de comentários de uma declaração de chave grande, por exemplo, o equivalente digital de folhear um livro :)) .
ideasman42
1

Publicando isso, pois é uma solução fraca , mas melhor que nada.

Em vez de alterar todo o comportamento do emacs, é possível escrever funções que são redesenhadas após cada operação, o que evita interrupções e torna a rolagem mais responsiva à página para cima / baixo e roda do mouse.

(global-set-key [next]
 (lambda () (interactive)
   (condition-case nil (scroll-up)
     (end-of-buffer (goto-char (point-max))))
   (redisplay)))

(global-set-key [prior]
 (lambda () (interactive)
   (condition-case nil (scroll-down)
     (beginning-of-buffer (goto-char (point-min))))
   (redisplay)))

(global-set-key (kbd "<mouse-4>")
 (lambda () (interactive) (scroll-down mouse-wheel-scroll-amount) (redisplay)))
(global-set-key (kbd "<mouse-5>")
 (lambda () (interactive) (scroll-up mouse-wheel-scroll-amount) (redisplay)))
ideasman42
fonte
Note-se que esta tenderá a fazer Emacs lag atrás de sua chave de repetição, por isso, quando você solta a tecla, o deslocamento continua indo mais longe do que você pensou :-(
Stefan
Certo, na prática, não considero esse problema tão comum, porque normalmente me seguro por um curto período de tempo.
ideasman42