Emacs:从一个巨大的文件打开一个缓冲区,其中X到Y行之间的所有行


10

本着与其他问题相同的精神:将X行的Y行指向一个大文件中的Y行

有没有一种方法可以从Emacs内部打开(并显示在缓冲区上)大型文本文件中的给定行集(例如line X和之间的所有行Y)?

例如,打开并在缓冲区中显示文件中第57890000行和57890010行之间的所有行 huge.txt

更新: 我对至少可以以只读方式打开行(仅出于显示目的)的解决方案感兴趣,尽管如果我还可以编辑行(并将其保存到原始文件中)将非常有用。


您只想看,甚至要编辑吗?
choroba 2012年

1
从内部ed怎么样?57890000,57890010p
凯文

Answers:


7

如果您想打开整个文件(需要),但只在编辑器窗口中显示其中一部分,请使用缩小。选择要使用的缓冲区部分,然后按C-x n nnarrow-to-region)。如果系统提示您禁用命令,请说“是”。按C-x n wwiden)再次查看整个缓冲区。如果保存缓冲区,则会选择完整的文件:所有数据仍然存在,缩小范围仅会限制您看到的内容。

如果要查看文件的一部分,可以将其插入shell-command带有前缀参数(M-1 M-!)的当前缓冲区中。运行适当的命令提取所需的行,例如<huge.txt tail -n +57890001 | head -n 11

还有一个Lisp函数insert-file-contents,它可以占用一个字节范围。您可以使用M-:eval-expression)调用它:

(insert-file-contents "huge.txt" nil 456789000 456791000)

请注意,您可能会遇到整数大小限制(取决于版本和平台,请检查的值most-positive-fixnum)。

从理论上讲,有可能编写一种Emacs模式,该模式根据需要透明地加载和保存文件的一部分(尽管整数大小的限制将使得在32位计算机上无法使用实际文件偏移量)。我所知道的唯一方向就是VLF此处为GitHub链接)。


1

您可能会发现此perl和elisp组合很有用。它允许您将数据通过管道传输到缓冲区。随后使用相同缓冲区名称的调用会将新行追加到相同缓冲区。

您可以“编辑” 缓冲区,但是编辑不会以任何方式反映回源(它是一个管道)...尽管可以调整输入以为每个输入包括带编号的前缀,但它不会显示任何行号。线。

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | e-sink.pl

在缓冲区中:

<<<<< start: 2012-09-09T01:39:49
1000000
VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
yQBTt LOic Ks sPXrq tty oy
dA8 SD BvO daZ KFPr44X
X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
we rm L9iD ugcJBND daS

7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
b0 1B ncr Db324 vwO Un34R
HDZS wq9zg W013 5JGly
kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.630s

或者,添加行号:

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | nl -v$from -ba -w${#to} | e-sink.pl

在缓冲区中:

<<<<< start: 2012-09-09T01:53:44
50000000    1000000
50000001    VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
50000002    yQBTt LOic Ks sPXrq tty oy
50000003    dA8 SD BvO daZ KFPr44X
50000004    X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
50000005    we rm L9iD ugcJBND daS
50000006    
50000007    7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
50000008    b0 1B ncr Db324 vwO Un34R
50000009    HDZS wq9zg W013 5JGly
50000010    kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.768s

我在StackOverflow Q / A上找到了这个


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.