Emacs: Buka buffer dengan semua garis antara garis X ke Y dari file besar

10

Dengan semangat yang sama dengan pertanyaan lain ini: cat baris X ke baris Y pada file besar :

Apakah ada cara untuk membuka dari dalam Emacs (dan menunjukkan pada buffer) satu set garis tertentu (misalnya semua garis antara garis Xdan Y) dari file teks besar?

Misalnya Buka dan tampilkan dalam buffer semua baris antara baris 57890000 dan 57890010 dari file huge.txt

Pembaruan: Saya tertarik pada solusi yang setidaknya dapat membuka baris dalam read-only (hanya untuk tujuan tampilan), meskipun akan lebih bagus jika saya juga dapat mengedit baris (dan menyimpan ke file asli).

Amelio Vazquez-Reina
sumber
Anda hanya ingin melihatnya, atau bahkan mengeditnya?
choroba
1
Bagaimana dari dalam ed? 57890000,57890010p
Kevin

Jawaban:

7

Jika Anda ingin membuka seluruh file (yang mengharuskan), tetapi hanya tampilkan sebagian saja di jendela editor, gunakan penyempitan . Pilih bagian buffer yang ingin Anda kerjakan dan tekan C-x n n( narrow-to-region). Katakan "ya" jika Anda mendapatkan prompt tentang perintah yang dinonaktifkan. Tekan C-x n w( widen) untuk melihat seluruh buffer lagi. Jika Anda menyimpan buffer, file lengkap dipilih: semua data masih ada, mempersempit hanya membatasi apa yang Anda lihat.

Jika Anda ingin melihat bagian file, Anda bisa memasukkannya ke buffer saat ini dengan shell-commandargumen awalan ( M-1 M-!); jalankan perintah yang sesuai untuk mengekstrak baris yang diinginkan , mis <huge.txt tail -n +57890001 | head -n 11.

Ada juga fungsi Lisp insert-file-contentsyang dapat mengambil rentang byte. Anda dapat memohonnya dengan M-:( eval-expression):

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

Perhatikan bahwa Anda mungkin mengalami batas ukuran integer (tergantung versi dan platform, periksa nilai most-positive-fixnum).

Secara teori dimungkinkan untuk menulis mode Emacs yang memuat dan menyimpan bagian-bagian file secara transparan sesuai kebutuhan (meskipun batas ukuran integer tidak memungkinkan untuk menggunakan offset file aktual pada mesin 32-bit). Satu-satunya upaya ke arah itu yang saya tahu adalah VLF (tautan GitHub di sini ).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Anda mungkin menganggap kombinasi perl dan elisp ini berguna. Ini memungkinkan Anda untuk menyalurkan data ke buffer. Doa selanjutnya menggunakan nama buffer yang sama akan menambahkan baris baru ke buffer yang sama.

Anda dapat "mengedit" buffer , tetapi hasil edit sama sekali tidak mencerminkan kembali ke sumber (yang merupakan pipa ) ... Itu tidak menunjukkan nomor baris, meskipun Anda dapat mengubah input untuk menyertakan awalan bernomor untuk setiap baris.

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

Dalam buffer:

<<<<< 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

Atau, dengan nomor baris ditambahkan:

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

Dalam buffer:

<<<<< 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

Saya menemukan ini di StackOverflow Q / A

Peter.O
sumber
1

Anda dapat melakukan ini dengan Lihat File Besar , mode minor emacs yang dirancang untuk kasus ini.

Echsecutor
sumber