โปรแกรมวิทยุติดตามตัวเช่นน้อยสามารถทำซ้ำบรรทัดบนสุด N


15

มีวิธีใดบ้างที่จะทำให้lessโปรแกรมทำซ้ำบรรทัดแรก (หรือ 2 บรรทัดแรก) ในทุกหน้าที่แสดง?

มีโปรแกรมเพจเจอร์อื่น ๆ ที่สามารถทำได้หรือไม่?

นี่จะเป็นแอพนักฆ่าสำหรับการค้นหาตารางฐานข้อมูลคิดmysqlหรือpsqlหรือgqlplus...

ดูภาพหน้าจอที่ด้านล่างของหน้านี้ ฉันต้องการทำซ้ำบรรทัดส่วนหัว + แถบ ascii แนวนอน


โอ้เด็กชายคนนั้นขอให้ส่วนขยายลดน้อยลงเหมือนจุดตรึง ตัวอย่างเช่น --freeze-บานหน้าต่าง 10,2 จะเก็บส่วนหัวของคอลัมน์ 1 บรรทัดและส่วนหัวของแถว 10 คอลัมน์ การเลื่อนในแนวนอนและแนวตั้งจะคงไว้ซึ่งส่วนหัวของแถวและคอลัมน์ตามลำดับ นั่นจะเจ๋งจริงๆที่จะใช้สำหรับเพจเจอร์ psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

คำตอบ:


12

มีวิธีแก้ปัญหาการใช้เป็นกลุ่ม

ขั้นแรกคุณต้องมีแมโคร Vim ซึ่งจะทำงานได้เกือบทั้งหมด บันทึกไว้ใน~/.vim/plugin/less.vim:

" :Less
" turn vim into a pager for psql aligned results 
fun! Less()
  set nocompatible
  set nowrap
  set scrollopt=hor
  set scrollbind
  set number
  execute 'above split'
  " resize upper window to one line; two lines are not needed because vim adds separating line
  execute 'resize 1'
  " switch to lower window and scroll 2 lines down 
  wincmd j
  execute 'norm! 2^E'
  " hide statusline in lower window
  set laststatus=0
  " hide contents of upper statusline. editor note: do not remove trailing spaces in next line!
  set statusline=\  
  " arrows do scrolling instead of moving
  nmap ^[OC zL
  nmap ^[OB ^E
  nmap ^[OD zH
  nmap ^[OA ^Y
  nmap <Space> <PageDown>
  " faster quit (I tend to forget about the upper panel)
  nmap q :qa^M
  nmap Q :qa^M
endfun
command! -nargs=0 Less call Less()

ประการที่สองเพื่อจำลองเพจเจอร์คุณต้องเรียกใช้กลุ่มเพื่อที่จะ:

  • อ่านอินพุตมาตรฐาน
  • แต่ถ้ามีการให้อาร์กิวเมนต์บนบรรทัดคำสั่ง
  • ทำงานในโหมดอ่านอย่างเดียว
  • ข้ามสคริปต์เริ่มต้นทั้งหมด แต่เรียกใช้แมโครที่กำหนดไว้ด้านบนแทน

ฉันรวบรวมมันเป็นสคริปต์ผู้ช่วยใน~/bin/vimpager:

#!/bin/bash
what=-
test "$@" && what="$@"
exec vim -u NONE -R -S ~/.vim/plugin/less.vim -c Less $what

chmod +x ~/bin/vimpagerทำให้ปฏิบัติการสคริปต์ด้วย

ประการที่สามคุณต้องแทนที่โปรแกรมเพจเจอร์สำหรับ psql อย่าตั้งค่าตัวแปรแบบPAGERโกลบอลเนื่องจากอาจส่งผลกระทบต่อโปรแกรมอื่นไม่เพียง แต่ psql ให้เพิ่มสิ่งนี้ลงใน~/.psqlrcไฟล์ของคุณแทน:

\setenv PAGER ~/bin/vimpager

Voila ! หลังจากโหลดโปรไฟล์ของคุณคุณสามารถเพลิดเพลินไปกับผลที่ควรประพฤติตามที่คาดไว้ (ปุ่มลูกศรดูได้ทั้งแนวตั้งและแนวนอน) vimpager ในการดำเนินการและมีลักษณะเช่นนี้ นอกจากนี้พลังทั้งหมดของ Vim จะอยู่ตรงนั้นหากคุณต้องการ


น่ารักฉันลองแล้ว ตอนนี้มันจะดีถ้าใครสามารถเพิ่มส่วนหัวของแถวด้วยแทนที่จะเป็นจำนวนแถวเหล่านี้
Gunther Schadow

4

คุณได้ลองใช้โหมด SQLใน Emacs / XEmacs หรือไม่?

แน่นอนว่าไม่ใช่เรื่องง่ายที่จะใช้เป็นmoreหรือlessแต่มันทำสิ่งที่คุณขอออกจากแถวส่วนหัวในขณะที่เลื่อนผลลัพธ์ในแนวตั้งและแนวนอน


ขอบคุณฉันไม่รู้จัก Emacs แต่มันฟังดูน่าสนใจ ในที่สุดฉันก็ต้องใช้เชลล์สคริปซึ่งจะ: เริ่มต้น emacs, รัน psql ที่นั่น, (ด้วย conn. params ที่กำหนดไว้), เปิดใช้งาน sql-mode และทำในสิ่งที่ฉันต้องการ (ตรึง 2 แถวด้านบนเสมอ . คำใบ้ใด ๆ
filiprem

3

สิ่งนี้ยืมมาอย่างมากจากคำตอบที่ยอมรับแต่เพิ่ม ...

  • เลื่อนเร็วขึ้น
  • ไม่สามารถเลื่อนไปที่ส่วนหัวโดยไม่ได้ตั้งใจ
  • การเน้นไวยากรณ์ (เครดิตอยู่ที่นี่ )
    • ตัวเลขบวก / ลบ, วันที่, เวลา, NULLจริง / เท็จ (และ T / F, Y / N, ใช่ / ไม่)
    • หมายเลขแถวถ้าคุณมีพวกเขาก่อนถ่านไป
  • ข้อความช่วยเหลือ
  • รองรับ Vim ที่มาพร้อมกับGit สำหรับ Windows
  • อย่าคุกคามเพื่ออัพเดตมุมมองหาก stdin buffer เปลี่ยน

psqlส่วนบางคนอาจจะต้องมีการเอ็นดูสำหรับการส่งออกของคุณโดยเฉพาะตั้งแต่ฉันไม่ได้ใช้ ฉันยังมีฟังก์ชั่นช่วยที่แตกต่างกันเล็กน้อยเพื่อฉัน แต่พวกเขามีความคล้ายคลึงกับผู้ที่อยู่ในคำตอบที่ได้รับการยอมรับ

ตัวอย่างอินพุต

  | ID |   First   |     Last     | Member | Balance |
--+----+-----------+--------------+--------+---------+
 1|  4 | Tom       | Hanks        | False  |    0.00 |
 2| 12 | Susan     | Patterson    | True   |   10.00 |
 3| 23 | Harriet   | Langford-Wat | False  |    0.00 |
 4|  8 | Jerry     |     NULL     | True   | -382.94 |
[… More rows …]
10| 87 | Horace    | Weaver       | False  |   47.52 |

รหัส

" :HeadPager
" Turn vim into a pager with a header row
" Adapted from /unix//a/27840/143088
fun! HeadPager()
    " If you didn't get three lines, shortcut out
    if line('$') < 3
        set nocompatible
        nmap <silent> q :qa!<c-M>
        nmap <silent> Q :qa!<c-M>
        return
    endif

    set noswapfile
    set nocompatible
    set nowrap
    set scrollopt=hor
    set scrollbind

    " Hide statusline in lower window
    set laststatus=0
    " Explain mapped chars in status line.
    set statusline=\ \ \ Q\ to\ quit\.\ Arrows\ or\ mousewheel\ to\ scroll\.\ \(Vim\ commands\ work\,\ too\.\)

    " Delete/copy header lines
    silent execute '1,2d'

    " Split screen with new buffer (opens at top)
    execute 'new'

    " Switch to upper split
    wincmd k

    " Paste the header over the blank line
    execute 'norm! Vp'

    " Header highlighting
    syn match Pipe "|"
    hi def Pipe ctermfg=blue
    syn match Any /[^|]\+/
    hi def Any ctermfg=yellow

    " Switch back to lower split for scrolling
    wincmd j

    " Set lower split height to maximum
    execute "norm! \<c-W>_"

    " Syntax highlighting
    syn cluster CellContents contains=None
    syn match Pipe "|" contained nextgroup=@CellContents skipwhite
    hi def Pipe ctermfg=blue

    " Start with newline or |. End right before next | or EOL
    syn region Cell start=/\v(^|\|)\s*/ end=/\v(\||$)\@=/ contains=LineNumber,Pipe

    syn match NumPos /\v\+?\d+(,?\d{3})*\.?\d*\ze *(\||$)\@=/ contained
    syn match NumNeg   /\v-\d+(,?\d{3})*\.?\d*\ze *(\||$)\@=/ contained
    syn match NumZero         /\v[+-]?0+\.?0*\ze *(\||$)\@=/  contained
    hi def NumPos ctermfg=cyan
    hi def NumNeg ctermfg=red
    hi def NumZero ctermfg=NONE
    syn cluster CellContents add=NumPos,NumNeg,NumZero

    syn match DateVal /\v\d{4}-\d{2}-\d{2}/ contained nextgroup=TimeVal skipwhite
    syn match TimeVal /\v\d{1,2}:\d{2}(:\d{2})?(\.\d+)?(Z| ?\c[AP]M)?\ze *(\||$)\@=/ contained
    hi def DateVal ctermfg=magenta
    hi def TimeVal ctermfg=magenta
    syn cluster CellContents add=DateVal,TimeVal

    syn match TrueVal /\v\c(t(rue)?|y(es)?)\ze *(\||$)\@=/ contained
    syn match FalseVal /\v\c(f(alse)?|no?)\ze *(\||$)\@=/ contained
    hi def TrueVal ctermfg=green
    hi def FalseVal ctermfg=red
    syn match NullVal /\v\cnull?\ze *(\||$)\@=/ contained
    hi def NullVal ctermbg=gray ctermfg=black
    syn cluster CellContents add=TrueVal,FalseVal,NullVal

    syn match LineNumber /^ *\d\+/ contained
    hi def LineNumber ctermfg=yellow

    " Arrows do scrolling instead of moving
    nmap <silent> <Up> 3<c-Y>
    nmap <silent> <Down> 3<c-E>
    nmap <silent> <Left> zH
    nmap <silent> <Right> zL
    nmap <Space> <PageDown>
    " Faster quit (I tend to forget about the upper panel)
    nmap <silent> q :qa!<c-M>
    nmap <silent> Q :qa!<c-M>

    " Ignore external updates to the buffer
    autocmd! FileChangedShell */fd/*
    autocmd! FileChangedRO */fd/*
endfun
command! -nargs=0 HeadPager call HeadPager()

2

คุณสามารถใช้หลาย 'ภูมิภาค' ในscreen:

$ cat screenrc.sql
escape ^aa  # adjust as needed
bind q quit # to quickly exit
screen 0 less ${FILE}
screen 1 less ${FILE}
split  # create two regions
focus top # starting with the top region
resize 4  # make it four lines (one for screen line, one for less prompt)
select 0  # display window 0
focus bottom  # in the bottom region
select 1  # display window 1 and focus here

จากนั้นคุณเพียงแค่ต้องตั้งค่าตัวแปรสภาพแวดล้อม $ FILE:

$ FILE=$HOME/.bash_profile screen -mc screenrc.sql

1
นี่เป็นสิ่งที่ฉันต้องการ แต่ (a) หน้าต่างด้านบนเลื่อนไม่ถูกต้องดังนั้นจึงไม่มีประโยชน์สำหรับตารางที่กว้าง
filiprem

ไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย 'ไร้ประโยชน์สำหรับตารางกว้าง'; หน้าจอสามารถขยายขนาดของเทอร์มินัลได้ (หากไม่ได้รันfitคำสั่งหน้าจอ) ฉันคิดว่าคุณไม่ต้องการให้เลื่อนด้านบน เมื่อฉันทดสอบด้วยตนเองหน้าต่างทั้งสองเลื่อนตามที่ควร ด้านบนเลื่อนสองบรรทัด (1-2, 3-4, 5-6 และอื่น ๆ ) และเลื่อนด้านล่างตามต้องการ พฤติกรรมที่คุณเห็นคืออะไร /
Arcege

0

คุณสามารถเพิ่มหมายเลขก่อนหน้า 'forward' และมันจะเลื่อน N บรรทัดไม่ใช่ความยาวเต็ม ดังนั้นหากหน้าต่างเทอร์มินัลของคุณคือ 40 บรรทัดให้พิมพ์38fเพื่อเริ่มเลื่อนเพียง 38 บรรทัดโดยเว้น 2 บรรทัดสุดท้ายจากหน้า 'สุดท้าย' จาก manpage:

   SPACE or ^V or f or ^F
          Scroll forward N  lines,  default  one  window  (see  option  -z
          below).   If  N  is  more  than  the screen size, only the final
          screenful is displayed.  Warning: some systems use ^V as a  spe‐
          cial literalization character.

   z      Like  SPACE,  but  if  N is specified, it becomes the new window
          size.

   b or ^B or ESC-v
          Scroll backward N lines,  default  one  window  (see  option  -z
          below).   If  N  is  more  than  the screen size, only the final
          screenful is displayed.

1
ฉันต้องเก็บก่อนไม่ใช่บรรทัดสุดท้าย เป็น "ตรึง N แถวบน" ใน Google Spreadsheet
filiprem

ขอโทษด้วย ฉันไม่รู้ว่ายูทิลิตี้ที่จะทำเช่นนั้น จากนั้นสิ่งที่ฉันแนะนำคือ: ใช้screenหรือtmuxเพื่อสร้างบานหน้าต่างสองบานปรับขนาดหนึ่งถึงสองบรรทัดแรก ( resize 2) จากนั้นเรียกใช้lessในบานหน้าต่างที่สองให้เรียกใช้lessตามปกติ คุณสามารถตั้งค่านี้เป็นสคริปต์ด้วยไฟล์. screenrc ที่ระบุ ดูคำตอบอื่น
Arcege
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.