En az N satırı tekrar edebilen daha az gibi çağrı programı


15

lessProgramın görüntülenen her sayfada ilk satırı (veya ilk 2 satırı) tekrar etmesinin bir yolu var mı ?

Bunu yapabilen başka bir çağrı programı var mı?

Bu veritabanı tablo tarama, düşünmek mysqlya psqlda ya da bir katil-app olurdu gqlplus...

Bu sayfanın altındaki ekran görüntüsüne bakın . Başlık satırı + yatay ascii çubuğunu tekrarlamak istiyorum.


Oh oğlum, bu bir Donma Bölmesi noktası gibi daha az bir uzama ister. Örneğin - dondurma bölmesi 10,2, 1 satır sütun başlığı ve 10 sütun satır başlığı tutar. Yatay ve dikey kaydırma sırasıyla satır ve sütun başlıklarını korur. Bir psql çağrı cihazı için kullanmak gerçekten harika olurdu (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Yanıtlar:


12

Vim kullanan bir çözüm var.

İlk olarak, işin çoğunu yapacak bir Vim makrosuna ihtiyacınız var. Şuraya kaydedin ~/.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()

İkincisi, bir çağrı cihazını taklit etmek için vim'i çağırmanız gerekir, böylece:

  • standart girişi oku
  • ancak komut satırında argüman verilirse, oraya gelenleri okuyun
  • salt okunur modda çalış
  • tüm başlangıç ​​komut dosyalarını atla, bunun yerine yukarıda tanımlanan Daha az makro çalıştır

Bunu yardımcı komut dosyası olarak bir araya getirdim ~/bin/vimpager:

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

Komut dosyasını ile çalıştırılabilir yapın chmod +x ~/bin/vimpager.

Üçüncü olarak, psql için çağrı programını geçersiz kılmanız gerekir. Değişkeni PAGERglobal olarak ayarlamayın , yalnızca psql'i değil diğer programları da etkileyebilir. Bunun yerine bunu ~/.psqlrcdosyanıza ekleyin :

\setenv PAGER ~/bin/vimpager

Voila ! Profilinizi yeniden sonra, böyle (hem dikey hem de yatay olarak göz tuşları ok) ve göz beklendiği gibi davranması gerektiği, hangi sonucu keyfini: vimpager eylem. Ayrıca, ihtiyacınız olduğunda Vim'in tüm gücü tam orada.


Bu çok hoş, denedim. Şimdi bu satır numaraları yerine satır üstbilgileri ekleyebilirseniz iyi olurdu.
Gunther Schadow

4

Emacs / XEmacs'da SQL Modunu denediniz mi?

Kesinlikle moreya da kullanmak o kadar kolay değildir less, ancak sonuçları dikey ve yatay olarak kaydırırken bir başlık satırı bırakarak istediğinizi yapar.


Teşekkürler, Emacs'ı tanımıyorum ama kulağa ilginç geliyor. Sonunda hangi bir kabuk komut dosyası gerekir: emacs başlatmak, orada psql çalıştırmak, (verilen bağlantı params ile), sql modunu etkinleştirmek ve istediğimi yapmak (her zaman ekran boyutundan daha büyük sorgu sonuçları olduğunda üst 2 satır dondur) . bununla ilgili ipuçları var mı?
filiprem

3

Bu , kabul edilen cevaptan çok ağır ödünç alıyor , ancak ekliyor ...

  • Daha hızlı kaydırma
  • Yanlışlıkla başlığa kaydırılamıyor
  • Sözdizimi vurgulama (bazı krediler buraya aittir )
    • Pozitif / negatif sayılar, tarihler, saatler, NULLDoğru / Yanlış (ve T / F, E / H, Evet / Hayır)
    • Bir satır karakterinden önce varsa satır numaraları.
  • Yardım Metni
  • Windows için Git'in içerdiği Vim desteği
  • Stdin arabelleği değişirse görünümü güncellemekle tehdit etmeyin

Kullanmadığım için bazı bölümlerin özel çıktınız için ayarlanması gerekebilir psql. Ayrıca, amaçlarım için biraz farklı yardımcı işlevlerim var, ancak kabul edilen cevaptaki işlevlere benziyorlar .

Örnek giriş

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

kod

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

Birden fazla 'bölge' kullanabilirsiniz 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

Sonra sadece $ FILE ortam değişkenini ayarlamanız gerekir:

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

1
bu neredeyse istediğim şeydi, ama (a) üst pencere sağa
kaymıyor

Ne demek istediğini emin değil 'geniş tablolar için işe yaramaz'; ekranı terminalin boyutuna genişleyebilir ( fitekran komutunu çalıştırmazsa ). Tepenin kaymasını istemediğini düşünmüştüm. Kendi başıma test ettiğimde, her iki pencere de olması gerektiği gibi kaydırılıyor. Üst kısım iki satırı (1-2, 3-4, 5-6 vb.) Kaydırır ve alt kısım gerektiği gibi kaydırır. Gördüğünüz davranış nedir /
Arcege

0

'İleri' ifadesinden önce bir sayı ekleyebilirsiniz ve tam satır değil, N satır kaydırılır. Terminal pencereniz 40 satırsa, 38fson 38 sayfadan son 'sayfadan çıkarak yalnızca 38 satır kaydırmaya başlamak için yazın . Manpage'den:

   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
Ben tutmak için gereken ilk değil, son N satırları. Google E-Tablo'da "ilk N satırı dondur" olarak.
filiprem

Ah Üzgünüm. Bunu yapacak bir yardımcı program olup olmadığını bilmiyorum. Sonra ne önermek: iki bölme oluşturmak için screenveya tmuxkullanın, ilk bir iki satır yeniden boyutlandırma ( resize 2) ve sonra lessikinci bölmede, lessnormal olarak çalıştırın . Bunu belirli bir .screenrc dosyası içeren bir komut dosyası olarak ayarlayabilirsiniz. Alternatif cevaba bakınız.
Arcege
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.