Emacs: Mở một bộ đệm với tất cả các dòng giữa các dòng X đến Y từ một tệp lớn


10

Theo tinh thần tương tự như câu hỏi khác này: dòng mèo X đến dòng Y trên một tệp lớn :

Có cách nào để mở từ bên trong Emacs (và hiển thị trên bộ đệm) một tập hợp các dòng nhất định (ví dụ: tất cả các dòng giữa dòng XY) từ một tệp văn bản lớn?

Ví dụ: Mở và hiển thị trong bộ đệm tất cả các dòng giữa các dòng 57890000 và 57890010 từ tệp huge.txt

Cập nhật: Tôi quan tâm đến một giải pháp ít nhất có thể mở các dòng ở chế độ chỉ đọc (chỉ dành cho mục đích hiển thị), mặc dù sẽ rất tuyệt nếu tôi cũng có thể chỉnh sửa các dòng (và lưu vào tệp gốc).


Dou bạn chỉ muốn xem nó, hoặc thậm chí để chỉnh sửa nó?
choroba

1
Làm thế nào về từ bên trong ed? 57890000,57890010p
Kevin

Câu trả lời:


7

Nếu bạn muốn mở toàn bộ tệp (yêu cầu), nhưng chỉ hiển thị một phần của nó trong cửa sổ soạn thảo, hãy sử dụng thu hẹp . Chọn một phần của bộ đệm bạn muốn làm việc và nhấn C-x n n( narrow-to-region). Hãy nói ngay có nếu bạn nhận được lời nhắc về lệnh bị vô hiệu hóa. Nhấn C-x n w( widen) để xem lại toàn bộ bộ đệm. Nếu bạn lưu bộ đệm, tệp hoàn chỉnh được chọn: tất cả dữ liệu vẫn còn đó, thu hẹp chỉ giới hạn những gì bạn thấy.

Nếu bạn muốn xem một phần của một tập tin, bạn có thể chèn nó vào bộ đệm hiện với shell-commandvới một đối số tiền tố ( M-1 M-!); chạy lệnh thích hợp để trích xuất các dòng mong muốn , ví dụ <huge.txt tail -n +57890001 | head -n 11.

Ngoài ra còn có một hàm Lisp insert-file-contentscó thể lấy một phạm vi byte. Bạn có thể gọi nó bằng M-:( eval-expression):

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

Lưu ý rằng bạn có thể chạy vào giới hạn kích thước số nguyên (phụ thuộc vào phiên bản và nền tảng, kiểm tra giá trị của most-positive-fixnum).

Về lý thuyết, có thể viết chế độ Emacs tải và lưu các phần của tệp một cách trong suốt khi cần (mặc dù giới hạn về kích thước số nguyên sẽ khiến việc sử dụng các tệp 32 bit thực tế không thể thực hiện được trên các máy 32 bit). Nỗ lực duy nhất theo hướng mà tôi biết là VLF (liên kết GitHub ở đây ).


1

Bạn có thể thấy sự kết hợp perl và elisp này hữu ích. Nó cho phép bạn chuyển dữ liệu vào bộ đệm. Các yêu cầu tiếp theo sử dụng cùng tên bộ đệm sẽ nối các dòng mới vào cùng bộ đệm.

Bạn có thể "chỉnh sửa" bộ đệm , nhưng chỉnh sửa không phản ánh lại nguồn (đó là một đường ống ) ... Nó không hiển thị bất kỳ số dòng nào, mặc dù bạn có thể điều chỉnh đầu vào để bao gồm một tiền tố được đánh số cho mỗi hàng.

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

Trong bộ đệm:

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

Hoặc, với số dòng được thêm vào:

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

Trong bộ đệm:

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

Tôi đã tìm thấy điều này trên Q / A StackOverflow


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.