No mesmo espírito que essa outra pergunta: linha X para linha Y em um arquivo enorme :
Existe uma maneira de abrir no Emacs (e mostrar em um buffer) um determinado conjunto de linhas (por exemplo, todas as linhas entre linhas X
e Y
) a partir de um grande arquivo de texto?
Por exemplo, abra e mostre em um buffer todas as linhas entre as linhas 57890000 e 57890010 do arquivo huge.txt
Atualização: Estou interessado em uma solução que pelo menos possa abrir as linhas em somente leitura (apenas para fins de exibição), embora seja ótimo se eu também puder editar as linhas (e salvar no arquivo original).
emacs
large-files
Amelio Vazquez-Reina
fonte
fonte
ed
?57890000,57890010p
Respostas:
Se você deseja abrir o arquivo inteiro (o que requer), mas mostrar apenas parte dele na janela do editor, use estreitamento . Selecione a parte do buffer em que deseja trabalhar e pressione
C-x n n
(narrow-to-region
). Diga "sim" se você receber uma solicitação sobre um comando desativado. PressioneC-x n w
(widen
) para ver o buffer inteiro novamente. Se você salvar o buffer, o arquivo completo será selecionado: todos os dados ainda estarão lá, restringir apenas o que você vê.Se você deseja visualizar uma parte de um arquivo, pode inseri-lo no buffer atual com o
shell-command
argumento prefix (M-1 M-!
); execute o comando apropriado para extrair as linhas desejadas , por exemplo<huge.txt tail -n +57890001 | head -n 11
.Há também uma função Lisp
insert-file-contents
que pode levar um intervalo de bytes. Você pode invocá-lo comM-:
(eval-expression
):Observe que você pode executar o limite de tamanho inteiro (dependendo da versão e da plataforma, verifique o valor de
most-positive-fixnum
).Em teoria, seria possível escrever um modo Emacs que carrega e salva partes de arquivos de forma transparente conforme necessário (embora o limite de tamanhos inteiros tornasse impossível o uso de compensações de arquivos reais em máquinas de 32 bits). O único esforço nessa direção que conheço é o VLF (link do GitHub aqui ).
fonte
Você pode achar útil essa combinação de perl e elisp . Permite canalizar dados para um buffer. As invocações subsequentes usando o mesmo nome do buffer anexarão as novas linhas ao mesmo buffer.
Você pode "editar" o buffer , mas a edição não reflete de forma alguma a origem (que é um canal ) ... Ela não mostra nenhum número de linha, embora você possa ajustar a entrada para incluir um prefixo numerado para cada linha.
No buffer:
Ou, com os números de linha adicionados:
No buffer:
Encontrei isso em um StackOverflow Q / A
fonte
Você pode fazer isso com Exibir arquivos grandes , um modo menor do emacs projetado exatamente para este caso.
fonte