Emacs: เปิดบัฟเฟอร์ที่มีทุกบรรทัดระหว่างบรรทัด X ถึง Y จากไฟล์ขนาดใหญ่


10

ในจิตวิญญาณเดียวกันกับคำถามอื่น ๆ นี้: cat line X ถึง line Y ในไฟล์ขนาดใหญ่ :

มีวิธีการเปิดจากภายใน Emacs (และแสดงบนบัฟเฟอร์) ชุดของบรรทัดที่กำหนด (เช่นทุกบรรทัดระหว่างบรรทัดXและY) จากไฟล์ข้อความขนาดใหญ่หรือไม่?

เช่นเปิดและแสดงในบัฟเฟอร์ทุกบรรทัดระหว่างบรรทัด 57890000 และ 57890010 จากไฟล์ huge.txt

อัปเดต: ฉันสนใจโซลูชันที่อย่างน้อยสามารถเปิดบรรทัดเป็นแบบอ่านอย่างเดียว (สำหรับจุดประสงค์ในการแสดงผล) แม้ว่าจะเป็นการดีถ้าฉันสามารถแก้ไขบรรทัด (และบันทึกลงในไฟล์ต้นฉบับ)


คุณต้องการที่จะเห็นมันหรือแม้กระทั่งการแก้ไขเท่านั้น
choroba

1
จากภายในedล่ะ 57890000,57890010p
เควิน

คำตอบ:


7

หากคุณต้องการที่จะเปิดไฟล์ทั้งหมด (ซึ่งต้องใช้) แต่แสดงเฉพาะส่วนหนึ่งของมันในหน้าต่างแก้ไขให้ใช้การกวดขัน เลือกส่วนของบัฟเฟอร์ที่คุณต้องการใช้งานแล้วกดC-x n n( narrow-to-region) พูดว่า“ ใช่” หากคุณได้รับพรอมต์เกี่ยวกับคำสั่งที่ถูกปิดใช้งาน กดC-x n w( widen) เพื่อดูบัฟเฟอร์ทั้งหมดอีกครั้ง หากคุณบันทึกบัฟเฟอร์ไฟล์ทั้งหมดจะถูกเลือก: ข้อมูลทั้งหมดยังคงอยู่ที่นั่นการ จำกัด ให้แคบจะ จำกัด เฉพาะสิ่งที่คุณเห็น

หากคุณต้องการดูบางส่วนของไฟล์คุณสามารถแทรกลงในบัฟเฟอร์ปัจจุบันshell-commandด้วยอาร์กิวเมนต์นำหน้า ( M-1 M-!); เรียกใช้คำสั่งที่เหมาะสมที่จะดึงสายที่ต้องการ<huge.txt tail -n +57890001 | head -n 11เช่น

นอกจากนี้ยังมีฟังก์ชั่นเสียงกระเพื่อม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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.