วิธีการเลื่อนดาต้าไฟล์ขนาดใหญ่ในขณะที่รักษาส่วนหัว


19

สมมติว่าฉันมีดาต้าไฟล์ขนาดใหญ่ซึ่งล้นหน้าจอทั้งในแนวตั้งและแนวนอน ฉันจะเรียกดูไฟล์นี้ในขณะที่บรรทัดส่วนหัวอยู่บนหน้าจอได้อย่างไร

ในตอนนี้ฉันกำลังใช้less -Sงานอยู่เพื่อให้ฉันสามารถเลื่อนไฟล์ของฉันได้ทั้งแนวนอนและแนวตั้ง อย่างไรก็ตามเมื่อเลื่อนลงบรรทัดส่วนหัวจะหายไปอย่างเห็นได้ชัด มีวิธีที่จะทำให้สิ่งเหล่านี้ใช้น้อยลงหรือไม่?

ทางเลือกที่จะใช้ในโหมดแยกหน้าจอด้วยvim :set nowrapอย่างไรก็ตามตอนนี้ถ้าฉันเลื่อนในแนวนอนหน้าต่างด้านบนจะไม่เลื่อนในลักษณะเดียวกัน ( :windo set scrollbindใช้ได้กับการเลื่อนแนวตั้งเท่าที่ฉันรู้)


คุณหมายถึงอะไรโดยหัวยังคงมองเห็นในขณะที่ข้อมูลยังคงเลื่อน? คุณหมายความว่าคุณต้องการให้บรรทัดแรกที่มีชื่อคอลัมน์คงเดิมหรือไม่? เป็นเพียงไฟล์เดียวที่มีข้อมูลและข้อมูลนี้มีการเปลี่ยนแปลงอยู่ตลอดเวลาดังนั้นคุณจึงต้องการเห็นแถวที่เปลี่ยนแปลงเท่านั้น คุณต้องการเห็นแถว N แถวแรกหรือแถว N แถวสุดท้ายหรือไม่
polym

2
@polym: lessหรือtail -fว่าทำงานเหมือนปกติยกเว้นว่าบรรทัดแรกที่แสดงบนหน้าจอจะเป็นบรรทัดส่วนหัวเสมอ เช่นเดียวกับเว็บไซต์ (หรือ Excel) ที่มีส่วนหัวคงที่ แต่เป็นตัวเลื่อน
Mat

@polym ^ อะไรก็ตามที่เขาพูด!
Debanjan Basu

@polym ให้คิดวิธีที่คุณสามารถตรึงมุมมองแนวนอนและแนวตั้งในสเปรดชีต คอลัมน์ค้างอยู่ในตำแหน่งขณะเลื่อน
user208145

คำตอบ:


11

หากคุณคุ้นเคยกับเสียงเรียกเข้านี่อาจเป็นตัวเลือกที่ดีที่สุดสำหรับคุณ คุณสามารถเปิดใช้งาน horizontal-scroll-bind-only ได้โดยเปลี่ยน'scrollopt':

set scrollopt=hor

ดังนั้นด้วยvim -u NONEคุณจะได้รับพฤติกรรมที่ต้องการด้วย:

:set scrollopt=hor
:set nowrap
:1split
:windo set scrollbind

คุณอาจต้องการปรับ'sidescroll'และ'sidescrolloff'เปลี่ยนจำนวนคอลัมน์ที่ถูกข้ามและระยะห่างจากการข้ามขอบเริ่มต้นตามลำดับ


1
มีวิธีการทำเช่นนี้น้อยลงหรือไม่ โดยเฉพาะอย่างยิ่งเมื่อเลื่อนดูไฟล์ขนาดใหญ่ (ใหญ่เกินกว่าที่จะโหลดลงในหน่วยความจำ) ได้หรือไม่
NM

@NM: ดูคำตอบอื่น ๆ
Thor

ฉันลองแล้วและเมื่อฉันเลื่อนลงหน้าต่างด้านล่างหน้าต่างด้านบนก็เลื่อนลงมาด้วย
Daniel Serodio

@DanielSerodio: มีบางอย่างเปลี่ยนแปลงไป มันทำงานได้ถ้าคุณตั้งค่า scrollopt ไปhorดูคำตอบที่อัปเดต
ธ อร์

คำตอบที่ได้รับการอัปเดตใช้งานได้ตามที่คาดหวังขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว :)
Daniel Serodio

17

บนเทอร์มินัลที่รองรับการตั้งค่าขอบเขตการเลื่อน:

tailf() ( # args: <file> [<number-of-header-lines>]
  trap 'tput csr 0 "$((LINES-1))"' INT
  tput csr "$((1+${2-1}))" "$((LINES-1))"
  tput clear
  {
    head -n"${2-1}"
    printf "%${COLUMNS}s\n" "" | tr ' ' =
    tail -n "$((LINES-1-${2-1}))" -f
  } < "$1"
)

(สมมติว่าเชลล์ชอบzshหรือbashที่ตั้งค่า$COLUMNSและ$LINESตัวแปรตามขนาดของเทอร์มินัล)


1
เพื่อน! นั่นคือพระเจ้า! ขออภัยควบคุมตัวเองไม่ได้ คุณช่วยพาฉันไปที่เว็บเพจหรือคำสั่งหรือตัวแปรเพื่อใช้งานฟังก์ชั่นต่อไปนี้ได้หรือไม่?
Debanjan Basu

1. ออกด้วยq 2. เลื่อนลงupและdownปุ่ม
Debanjan Basu

มันเป็นไปได้ที่จะ piggyback กับlessตัวเองโดยไม่ต้องใช้headและtailวาดหน้าจอใหม่ทุกครั้งหรือไม่ ฉันยังคง <3 วิธีแก้ปัญหาของคุณ btw ฉันไม่ได้ทำเครื่องหมายถูกต้องเพราะคุณดูเหมือนจะแก้ไขและฉันไม่ต้องการให้คุณพึงพอใจ; อิ่มเอมใจเป็นนักฆ่าที่มีความคิดสร้างสรรค์ :)
Debanjan Basu

@DebanjanBasu คุณสามารถใช้less -Xแทนตำแหน่งtail -n ...ด้านบน แต่คีย์ "up" จะลบส่วนหัวที่นั่น
Stéphane Chazelas

เช่นเดียวกับที่ฉันพูดถ้าคุณมีความคิดที่ดีกว่านี้เพียงแค่ชี้ฉันไปที่หรือยังดีกว่าโปรดปรับคำตอบของคุณเพิ่มเติม ผมต้องทำเครื่องหมายว่าถูกต้องเพราะคุณได้ตอบคำถามที่ผมเริ่มถาม ความคิดคือการมีlessสภาพแวดล้อมที่คั่นกลางระหว่างส่วนหัวและส่วนท้ายเพื่อให้เป็นเครื่องมือทั่วไปมากขึ้น
Debanjan Basu

6

ลองนี้ (คุณจะต้องติดตั้งmultitail):

multitail -du -t "$(head -n 1 filename)" filename

หรือสำหรับส่วนหัวที่ยาวกว่าหนึ่งบรรทัด:

multitail -wh 2 -l "head -n 2 filename" filename

หากคุณต้องการติดตามผลลัพธ์คำสั่งแทนไฟล์:

multitail -wh 2 -l "command | head -n 2" -l command

หรือใช้-tตามความเหมาะสม โปรดทราบว่าคุณอาจจำเป็นต้องใช้unbufferเพื่อให้ผลลัพธ์คำสั่งของคุณปรากฏขึ้นทันที

คุณสามารถใช้-Dเพื่อปิดการแสดงบรรทัดสถานะสำหรับ-whแบบฟอร์ม (ซึ่งจะเอาชนะวัตถุประสงค์ของ-tแบบฟอร์ม)


2

คำตอบของ Thor ไม่ได้กล่าวถึงการปิดใช้งาน "scrollopt" ในแนวตั้งซึ่งทำให้หน้าต่างทั้งสองเลื่อนในแนวตั้ง ดังนั้นสำหรับฉันทางออกที่สมบูรณ์คือการวางลงในกลุ่ม:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind

คุณสามารถตั้งค่าscrolloptโดยตรงกับ:scrollopt=horหรือ:scrollopt=hor,jumpขึ้นอยู่กับความต้องการของคุณ นี่คือ VimDocscrolloptสำหรับ
Michael

1

นี่คือเท่าที่ฉันได้ด้วยtmux:

#!/bin/bash

tmux new-session -s main -n 'w1' -d
tmux send-keys -t main:w1.0 "tail -f <(head -n1 $1)" C-j
tmux split-window -v
tmux resize-pane -t 0 -y 2
tmux send-keys -t 1 "tail -n+2 $1|less -S" C-j
tmux attach -t main

เป็นส่วนขยายของคำตอบของผู้ใช้ 80519สำหรับการtmuxแยกหน้าต่าง บันทึกเป็นhless.shทำให้ใช้งานได้และใช้งานได้ตามต้องการ

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