Vejo um desempenho extremamente variado, dependendo de quantas novas linhas existem no arquivo que estou visitando.
Aqui está um exemplo. Eu tenho dois arquivos JSON:
$ wget https://github.com/Wilfred/ReVo-utilities/blob/a4bdc40dd2656c496defc461fc19c403c8306d9f/revo-export/dictionary.json?raw=true -O one_line.json
$ python -m json.tool <one_line.json >pretty_printed.json
Estes são dois arquivos JSON com o mesmo conteúdo. one_line.json
tem 18MiB de JSON sem novas linhas. pretty_printed.json
adicionou novas linhas e espaços em branco, tornando-o 41MiB.
No entanto, o arquivo maior dividido em muitas linhas é muito mais rápido para abrir no Emacs, tanto no modo Javascript quanto no modo Fundamental.
Por que o Emacs tem um desempenho tão ruim com longas filas, já que na verdade são menos bytes? Há algo que eu possa fazer para melhorar o desempenho sem reformatar os dados fora do Emacs?
line-break
performance
Wilfred Hughes
fonte
fonte
View Large Files
(vlf) é um modo secundário que visa ajudar na edição de arquivos grandes, carregando-os em lotes . Isenção de responsabilidade: nunca usei e não sei se também lida com longas filas em lotes .$ tail -f /some/file | fold -s
em um buffer de shell. Obviamente, isso não é bom para edição, mas ajuda muito na leitura.Respostas:
O manuseio de linhas longas da Emacs não é muito bem otimizado. Para várias operações, o Emacs precisa varrer toda a linha repetidamente. Por exemplo, para exibir uma linha, o Emacs precisa descobrir a altura da linha, o que requer a varredura de toda a linha para encontrar o glifo mais alto. Além disso, a digitalização para exibição bidirecional consome muito tempo. Você pode obter algumas informações adicionais, por exemplo, na sequência de documentos de
cache-long-line-scans
(renomeadacache-long-scans
em 24.4).Você pode tentar e ver se a configuração
bidi-paragraph-direction
paraleft-to-right
melhora a velocidade para você [definindobidi-display-reordering
anil
, faz mais ou menos o mesmo, mas destina-se apenas para fins / depuração internas]. Isso remove um colaborador significativo das varreduras de linha, mas infelizmente não é o único.A melhor opção é adicionar novas linhas. Você pode canalizar um arquivo JSON, por exemplo,
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
para adicionar novas linhas e melhorar a legibilidade em geral.fonte
(setq-default bidi-display-reordering nil)
- alguns usuários podem não perceber que essa é uma variável local do buffer, que pode precisar de uma configuração padrão na medida em que um usuário deseja que isso seja global. Eu gostaria de ter acrescentado isso aos meusinit.el
anos atrás ... mas pelo menos está lá agora. Muito obrigado !!!bidi-display-reordering
: "Um comentário que tenho é que desabilitar a reordenação de exibição de bidi ... coloca o mecanismo de exibição em um estado que não está sendo testado e pode causar inconsistências. e até erros (porque algumas partes do código foram escritas sob a suposição de que essa variável nunca é nula) ".Fiz algumas breves experiências com isso usando uma cópia minificada do jquery.
font-lock-mode
eflycheck-mode
ambos contribuíram para a lentidão, como fizeramjs2-mode
, eprettify-symbols-mode
.line-number-mode
ecolumn-number-mode
teve efeito menor. Uma vez eu desliguei todos os modos diferentes, embora o desempenho fosse relativamente rápido. Use C-h me comece a desativar os diferentes modos que estão habilitados ou tente apenas mudar parafundamental-mode
.Curiosamente,
hexl-mode
eu poderia voar através do arquivo sem nenhum problema, embora obviamente as colunas fossem bem curtas. Infelizmente,visual-line-mode
realmente diminuiu as coisas.Meu palpite é que a tabela de sintaxe fica feliz em parar o processamento nas terminações de linha e, quando tudo está em uma linha, ele deve revisar tudo a cada atualização.
fonte
Fiz upload de http://www.emacswiki.org/emacs/OverLongLineMode
Essa biblioteca permite definir limites simples de comprimento de linha além dos quais uma variante de
fundamental-mode
será usada para um arquivo em vez de seu modo normal (apenas para modos de programação).Potencialmente, algo nesse sentido poderia ser adicionado ao Emacs por padrão, mas isso pode ser uma solução provisória para o problema principal do Emacs que fica lento ao rastrear ao encontrar esse arquivo.
Nota: isso é uma melhoria no código que eu postei inicialmente nesta resposta, mas ainda é um trabalho em andamento. Os testes foram mínimos. Comentários são bem-vindos.
Sugestões para outros (além
css-mode
)prog-mode
modos principais não derivados para suporte por padrão também são bem-vindas.fonte
so-long.el
active abriu o arquivo em menos de 2 segundos. A edição do arquivo ainda é extremamente problemática (por exemplo, tentar passar para a 'próxima linha' levará um tempo extremamente longo), mas, no entanto, isso restaura minha fé na utilidade da biblioteca que escrevi, por isso devo retomar meus planos para adicione-o ao GNU ELPA ...so-long.el
(com inúmeras melhorias) está incluída nas versões atuais de desenvolvimento do Emacs 27 e estará disponível (para versões anteriores do Emacs) via GNU ELPA em algum momento no futuro próximo.Espero que você descubra que a diferença se deve a isso
font-lock
. Quando a fonte é executada no subconjunto do arquivo visível na janela, ela prossegue estendendo primeiro a região da fonte, de forma a incluir unidades semânticas completas. Veja ofont-lock-extend-region-functions
código para isso. É comum que isso inclua a extensão da região para incluir linhas completas. Quando as linhas são extremamente longas, isso pode fazer com que a fonte seja executada em um pedaço de conteúdo muito maior do que é realmente visível.Além disso, quando as novas linhas possuem informações semânticas, sua ausência às vezes pode significar que os padrões de expressão regular para bloqueio de fonte precisam ser varridos ainda mais para determinar se são correspondentes ou não.
fonte
Normalmente, desenrolo linhas longas e recuo por tags (como HTML, XML, JSON).
Para possibilitar essa operação, adiciono:
Eu dividir linha de regex, para XML-lo:
C-M-% >< RET >NL< RET !
.Depois que o Emacs divide as linhas longas - é possível ativar muitos
*-modes
e re-recuar o código.Nota: Como evitar a desaceleração quando um processo inferior gera longas filas?
fonte
Criei minha própria solução para esse problema aqui: https://github.com/rakete/too-long-lines-mode
Eu não estava satisfeito com a solução phils, que alterna um buffer com linhas muito longas para o modo fundamental; queria uma solução que me permitisse manter o destaque da sintaxe e outros recursos do modo principal. Então, criei um modo menor que usa sobreposições para ocultar a maioria dos caracteres de linhas muito longas.
Isso soluciona o problema e torna o emacs utilizável mesmo em buffers com linhas muito longas, sem precisar voltar ao modo fundamental.
fonte
Na minha configuração do Emacs, eu tenho um modo com fonte personalizada, ou seja, onde eu configuro
font-lock-defaults
. Uma única página para baixo usaria 30 segundos para exibir parte da linha de 30000 caracteres. Esse lentidão foi corrigido através da redução do retorno do regexp. Ao invés de:fazem isto
fonte
font-lock-defaults
correspondência ou regexp.Nos meus buffers de modo shell (shell Mx), eu me pego tentando
sed -r 's/(.{2000}).*/\1/' -u
evitar longas filas.fonte
Eu uso a seguinte função para abrir
dired-mode
arquivos grandes com linhas longas:fonte
Aqui está uma solução alternativa, retirada do emacs-devel :
fonte
longlines-mode
foi marcado como obsoleto porvisual-line-mode
.visual-line-mode
não ajudam com o problema em questão, enquanto olonglines-mode
fazem. Por esse motivo, espero que longlines.el seja restaurado para um status não obsoleto.