chương trình máy nhắn tin như ít hơn, có thể lặp lại N dòng hàng đầu


15

Có cách nào để làm cho lesschương trình lặp lại dòng đầu tiên (hoặc 2 dòng đầu tiên) trên mỗi trang được hiển thị không?

Có chương trình máy nhắn tin nào khác có thể làm điều này không?

Đây sẽ là một kẻ giết người ứng dụng cho cơ sở dữ liệu duyệt bảng, suy nghĩ mysqlhay psqlhay gqlplus...

Đối với những người bạn không có ý tưởng, xem ảnh chụp màn hình ở dưới cùng của trang này . Tôi muốn lặp lại dòng tiêu đề + thanh ascii ngang.


Oh boy, yêu cầu mở rộng ít hơn, như điểm Freeze Pane. Ví dụ: freefree-pane 10,2 sẽ giữ 1 dòng tiêu đề cột và tiêu đề hàng 10 cột. Cuộn ngang và dọc sẽ bảo toàn các tiêu đề hàng và cột tương ứng. Điều đó thật tuyệt khi sử dụng cho máy nhắn tin psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Câu trả lời:


12

Có một giải pháp sử dụng Vim.

Đầu tiên, chúng ta cần một macro Vim, sẽ thực hiện hầu hết công việc, tôi lưu nó vào ~/.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()

Thứ hai, để mô phỏng một máy nhắn tin, tôi cần phải gọi vim để nó sẽ:

  • đọc đầu vào tiêu chuẩn
  • nhưng nếu đối số được đưa ra trên dòng lệnh, hãy đọc bất cứ điều gì đến đó
  • làm việc ở chế độ chỉ đọc
  • bỏ qua tất cả các tập lệnh init, nhưng thay vào đó thực thi Ít macro được xác định ở trên

Tôi kết hợp điều này với nhau như kịch bản trợ giúp trong ~/bin/vimpager:

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

Thứ ba, tôi cần ghi đè biến môi trường $ PAGER, nhưng chỉ cho psql (thêm cái này vào của tôi ~/.bash_aliases):

if which vimpager &>/dev/null; then
  alias psql='PAGER=vimpager psql';
fi

Điều này thật đáng yêu, tôi đã thử nó. Bây giờ sẽ thật tuyệt nếu người ta cũng có thể thêm các tiêu đề hàng, thay vì các số hàng này.
Gunther Schadow

4

Bạn đã thử Chế độ SQL trong Emacs / XEmac chưa?

Đó chắc chắn không phải là đơn giản để sử dụng như là morehay less, nhưng nó làm những gì yêu cầu của bạn cho, để lại một dòng tiêu đề trong khi di chuyển kết quả theo chiều dọc và chiều ngang.


Cảm ơn, tôi không biết Emacs nhưng nghe có vẻ thú vị. Cuối cùng tôi sẽ cần một tập lệnh shell sẽ: bắt đầu emacs, chạy psql ở đó, (với thông số đã cho), bật chế độ sql và làm những gì tôi muốn (luôn đóng băng 2 hàng đầu khi có kết quả truy vấn lớn hơn kích thước màn hình) . bất kỳ gợi ý về điều đó?
filiprem

3

Điều này mượn rất nhiều từ câu trả lời được chấp nhận, nhưng thêm ...

  • Cuộn nhanh hơn
  • Không thể vô tình cuộn vào tiêu đề
  • Cú pháp tô sáng (một số tín dụng thuộc về đây )
    • Số dương / âm, ngày, thời gian, NULLĐúng / Sai (và T / F, Y / N, Có / Không)
    • Số hàng, nếu bạn có chúng trước một ống char.
  • Trợ giúp văn bản
  • Hỗ trợ cho Vim đi kèm với Git cho Windows
  • Không đe dọa cập nhật chế độ xem nếu bộ đệm stdin thay đổi

Một số phần có thể phải được điều chỉnh cho đầu ra cụ thể của bạn, vì tôi không sử dụng psql. Tôi cũng có các chức năng trợ giúp hơi khác nhau cho mục đích của mình, nhưng chúng tương tự như các chức năng trong câu trả lời được chấp nhận.

Đầu vào mẫu

  | 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

Bạn có thể sử dụng nhiều 'vùng' trong 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

Sau đó, bạn chỉ cần đặt biến môi trường $ FILE:

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

1
đây gần như là những gì tôi muốn, nhưng (a) cửa sổ trên cùng không cuộn sang phải, vì vậy nó vô dụng đối với các bảng rộng
filiprem

Không chắc chắn ý của bạn là 'vô dụng đối với các bảng rộng'; màn hình có thể mở rộng đến kích thước của thiết bị đầu cuối (nếu nó không chạy fitlệnh màn hình). Tôi đã nghĩ rằng bạn không muốn đầu cuộn. Khi tôi tự kiểm tra nó, cả hai cửa sổ sẽ cuộn theo ý muốn. Đầu cuộn hai dòng (1-2, 3-4, 5-6, v.v.) và cuộn dưới cùng nếu cần. Hành vi bạn đang nhìn thấy là gì /
Arcege

0

Bạn có thể thêm một số trước khi 'chuyển tiếp' và nó sẽ cuộn N dòng, không phải là toàn bộ chiều dài. Vì vậy, nếu cửa sổ đầu cuối của bạn là 40 dòng, hãy nhập 38fđể bắt đầu cuộn chỉ 38 dòng, để lại 2 dòng cuối cùng từ 'trang cuối cùng'. Từ trang hướng dẫn:

   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
Tôi cần phải giữ đầu tiên , không phải N dòng cuối cùng . Là "đóng băng N hàng đầu" trong Bảng tính Google.
filiprem

Ồ xin lỗi. Tôi không biết nếu một tiện ích sẽ làm điều đó. Sau đó, những gì tôi đề xuất là: sử dụng screenhoặc tmuxđể tạo hai bảng, thay đổi kích thước của dòng đầu tiên thành hai dòng ( resize 2) và sau đó chạy less, trong khung thứ hai, chạy lessbình thường. Bạn có thể thiết lập tập lệnh này dưới dạng tập lệnh với tệp .screenrc cụ thể. Xem câu trả lời thay thế.
Arcege
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.