Program pager seperti kurang, mampu mengulangi baris N atas

15

Apakah ada cara untuk membuat lessprogram mengulangi baris pertama (atau 2 baris pertama) pada setiap halaman yang ditampilkan?

Apakah ada program pager lain yang bisa melakukan ini?

Ini akan menjadi aplikasi pembunuh untuk meramban tabel database, berpikir mysqlatau psqlatau gqlplus...

Bagi Anda yang tidak mendapatkan ide, lihat tangkapan layar di bagian bawah halaman ini . Saya ingin mengulangi baris tajuk + bilah ascii horizontal.

filiprem
sumber
Oh nak, itu meminta perpanjangan kurang, seperti titik Freeze Pane. Misalnya --freeze-pane 10,2 akan menjaga 1 baris tajuk kolom dan 10 tajuk baris kolom. Pengguliran horizontal dan vertikal masing-masing akan mempertahankan judul baris dan kolom. Itu akan sangat keren untuk digunakan untuk pager psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Jawaban:

12

Ada solusi menggunakan Vim.

Pertama, kita membutuhkan makro Vim, yang akan melakukan sebagian besar pekerjaan, saya simpan di ~/.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()

Kedua, untuk meniru pager, saya perlu memanggil vim agar:

  • baca input standar
  • tetapi jika argumen diberikan pada baris perintah, bacalah apa pun yang datang ke sana
  • bekerja dalam mode baca-saja
  • lewati semua skrip init, tetapi jalankan Kurang makro yang didefinisikan di atas

Saya menyatukan ini sebagai skrip pembantu di ~/bin/vimpager:

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

Ketiga, saya perlu mengganti variabel lingkungan $ PAGER, tetapi hanya untuk psql (tambahkan ini ke saya ~/.bash_aliases):

if which vimpager &>/dev/null; then
  alias psql='PAGER=vimpager psql';
fi
filiprem
sumber
Ini indah, saya mencobanya. Sekarang akan lebih baik jika seseorang dapat menambahkan tajuk baris juga, bukan nomor-nomor baris ini.
Gunther Schadow
4

Sudahkah Anda mencoba Mode SQL di Emacs / XEmacs?

Ini tentu tidak sesederhana untuk digunakan sebagai moreatau less, tetapi ia melakukan apa yang Anda minta, meninggalkan baris header sambil menggulir hasil secara vertikal dan horizontal.

bsd
sumber
Terima kasih, saya tidak tahu Emacs tetapi kedengarannya menarik. Saya akhirnya akan membutuhkan skrip shell yang akan: mulai emacs, jalankan psql di sana, (dengan par. Samb yang diberikan), aktifkan sql-mode dan lakukan apa yang saya inginkan (selalu bekukan 2 baris teratas ketika ada hasil kueri yang lebih besar daripada ukuran layar) . ada petunjuk tentang itu?
filiprem
3

Ini meminjam sangat banyak dari jawaban yang diterima, tetapi menambahkan ...

  • Scrolling lebih cepat
  • Tidak dapat secara tidak sengaja menggulir ke header
  • Penyorotan sintaksis (sebagian kredit ada di sini )
    • Bilangan positif / negatif, tanggal, waktu,, NULLBenar / Salah (dan T / F, Y / T, Ya / Tidak)
    • Nomor baris, jika Anda memilikinya sebelum char pipa.
  • Teks bantuan
  • Dukungan untuk Vim yang disertakan dengan Git untuk Windows
  • Jangan mengancam untuk memperbarui tampilan jika buffer stdin berubah

Beberapa bagian mungkin harus diubah untuk keluaran spesifik Anda, karena saya tidak menggunakannya psql. Saya juga memiliki fungsi pembantu yang sedikit berbeda untuk tujuan saya, tetapi mereka serupa dengan yang ada di jawaban yang diterima.

Input sampel

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

Kode

" :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()
Michael - Dimana Clay Shirky
sumber
2

Anda dapat menggunakan beberapa 'wilayah' di 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

Maka Anda hanya perlu mengatur variabel lingkungan $ FILE:

$ FILE=$HOME/.bash_profile screen -mc screenrc.sql
Arcege
sumber
1
ini hampir apa yang saya inginkan, tetapi (a) jendela atas tidak gulir ke kanan, jadi tidak ada gunanya untuk tabel lebar
filiprem
Tidak yakin apa yang Anda maksud dengan 'tidak berguna untuk tabel lebar'; layar dapat meluas ke ukuran terminal (jika tidak menjalankan fitperintah layar). Saya berpikir bahwa Anda tidak ingin bagian atas untuk menggulir. Ketika saya mengujinya sendiri, kedua jendela gulir seperti seharusnya. Bagian atas menggulir dua baris (1-2, 3-4, 5-6, dll.) Dan bagian bawah gulungan sesuai kebutuhan. Apa perilaku yang Anda lihat /
Arcege
0

Anda dapat menambahkan nomor sebelum 'maju' dan itu akan menggulirkan garis N, bukan panjang penuh. Jadi jika jendela terminal Anda adalah 40 baris, ketik 38funtuk mulai menggulir hanya 38 baris, meninggalkan 2 baris terakhir dari 'halaman' terakhir. Dari halaman manual:

   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.
Arcege
sumber
1
Saya harus tetap pertama , bukan baris N terakhir . Sebagai "membekukan baris N atas" di Google Spreadsheet.
filiprem
Ah maaf. Saya tidak tahu apakah utilitas itu akan melakukan itu. Lalu apa yang saya sarankan adalah: gunakan screenatau tmuxuntuk membuat dua panel, ubah ukuran dari satu menjadi dua baris ( resize 2) dan kemudian jalankan less, di panel kedua, jalankan secara lessnormal. Anda dapat mengatur ini sebagai skrip dengan file .screenrc tertentu. Lihat jawaban alternatif.
Arcege