Emacs:巨大なファイルから行Xから行Yまでのすべての行でバッファを開く


10

この他の質問と同じ精神で:巨大なファイルで猫行Xから行Yへ

オープンする方法があるのEmacs内からライン(線との間などのすべての行の特定のセット(およびバッファに表示)XY巨大なテキストファイルからの)?

たとえば、ファイルの行57890000と57890010の間のすべての行を開いてバッファに表示します huge.txt

更新: 行を編集(および元のファイルに保存)することもできれば素晴らしいのですが、少なくとも行を読み取り専用(表示目的のみ)で開くことができるソリューションに興味があります。


見たいだけですか、それとも編集したいですか?
チョロバ2012

1
内からはedどうですか?57890000,57890010p
ケビン

回答:


7

ファイル全体(を必要とする)を開き、その一部のみをエディターウィンドウに表示する場合は、ナローイングを使用します。作業するバッファの部分を選択して、C-x n nnarrow-to-region)を押します。無効化されたコマンドに関するプロンプトが表示されたら、「はい」と言ってください。C-x n wwiden)を押すと、バッファー全体が再び表示されます。バッファを保存すると、完全なファイルが選択されます。すべてのデータがそこにあり、狭めることで表示されるものだけが制限されます。

ファイルの一部を表示したい場合shell-commandは、プレフィックス引数(M-1 M-!)を付けて現在のバッファーに挿入できます。実行したい行を抽出するために、適切なコマンドをたとえば、<huge.txt tail -n +57890001 | head -n 11

insert-file-contentsバイト範囲を取ることができるLisp関数もあります。M-:eval-expression)で呼び出すことができます:

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

整数のサイズ制限に遭遇する可能性があることに注意してください(バージョンとプラットフォームに依存、の値を確認してくださいmost-positive-fixnum)。

理論的には、必要に応じてファイルの一部を透過的にロードおよび保存するEmacsモードを作成することが可能です(ただし、整数サイズの制限により、32ビットマシンでは実際のファイルオフセットを使用できなくなります)。私が知っているその方向での唯一の努力はVLF(GitHubリンクはこちら)です。


1

このperlとelispの組み合わせが役立つ場合があります。パイプでデータをバッファに送ることができます。同じbuffer-nameを使用して後続の呼び出しを行うと、新しい行が同じバッファーに追加されます。

バッファーを「編集」することはできますが、編集はソース(パイプ)に反映されません。行番号は表示されませんが、入力を微調整してそれぞれに番号付きのプレフィックスを含めることができます。ライン。

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でこれを見つけまし


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.