program pagera jak mniej, zdolny do powtarzania górnych N linii


15

Czy jest jakiś sposób, aby lessprogram powtarzał pierwszy wiersz (lub pierwsze 2 wiersze) na każdej wyświetlanej stronie?

Czy jest jakiś inny program pager, który może to zrobić?

Byłby to killer-app do przeglądania tabeli bazy danych, myśleć mysqllub psqlczy gqlplus...

Zobacz zrzut ekranu na dole tej strony . Chcę powtórzyć linię nagłówka + poziomy pasek ascii.


Och, chłopcze, to prosi o rozszerzenie na mniej, jak punkt Mrozu. Na przykład --freeze-pane 10,2 zachowałby 1 linię nagłówków kolumn i 10 nagłówków wierszy. Przewijanie w poziomie i pionie zachowałoby odpowiednio nagłówki wierszy i kolumn. To byłoby naprawdę fajne w przypadku pagera psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Odpowiedzi:


12

Istnieje rozwiązanie wykorzystujące Vima.

Po pierwsze potrzebujesz makra Vima, które wykona większość pracy. Zapisz w ~/.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()

Po drugie, aby emulować pager, musisz wywołać vim, aby:

  • przeczytaj standardowe wejście
  • ale jeśli argument zostanie podany w wierszu poleceń, przeczytaj wszystko, co się tam pojawi
  • praca w trybie tylko do odczytu
  • pomiń wszystkie skrypty inicjujące, ale zamiast tego uruchom mniej zdefiniowane powyżej makro

Złożyłem to jako skrypt pomocniczy w ~/bin/vimpager:

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

Spraw, aby skrypt był wykonywalny za pomocą chmod +x ~/bin/vimpager.

Po trzecie, musisz zastąpić program pager dla psql. Nie ustawiaj zmiennej PAGERglobalnie, ponieważ może to wpływać na inne programy, nie tylko psql. Zamiast tego dodaj to do ~/.psqlrcpliku:

\setenv PAGER ~/bin/vimpager

Voila ! Po przeładunku swój profil, można cieszyć się wynik, który powinien zachowywać się zgodnie z oczekiwaniami (strzałek przeglądania zarówno pionowo i poziomo) i wyglądać tak: vimpager w akcji. Dodatkowo, cała moc Vima jest tam, gdzie jej potrzebujesz.


To jest piękne, próbowałem. Byłoby miło, gdyby można było dodać również nagłówki wierszy zamiast tych numerów wierszy.
Gunther Schadow

4

Czy próbowałeś Trybu SQL w Emacs / XEmacs?

Z pewnością nie jest tak prosty w użyciu jak morelub less, ale robi to, o co prosisz, pozostawiając wiersz nagłówka podczas przewijania wyników w pionie i poziomie.


Dzięki, nie znam Emacsa, ale brzmi interesująco. W końcu będę potrzebował skryptu powłoki, który: uruchomi emacsa, uruchom tam psql (z podanymi parametrami połączenia), włączy tryb sql i zrobię, co chcę (zawsze zamrażaj górne 2 wiersze, gdy wyniki zapytania są większe niż rozmiar ekranu) . jakieś wskazówki na ten temat?
filiprem

3

Pożycza to bardzo mocno od przyjętej odpowiedzi, ale dodaje ...

  • Szybsze przewijanie
  • Nie można przypadkowo przewinąć do nagłówka
  • Podświetlanie składni ( tutaj należy napisać )
    • Liczby dodatnie / ujemne, daty, godziny, NULLprawda / fałsz (i T / F, T / N, tak / nie)
    • Numery wierszy, jeśli masz je przed znakiem potoku.
  • Tekst pomocy
  • Obsługa Vima zawartego w Git dla Windows
  • Nie grozi zaktualizowaniem widoku, jeśli zmieni się bufor stdin

Niektóre porcje mogą wymagać dostosowania do konkretnych wyników, ponieważ nie używam psql. Mam również nieco inne funkcje pomocnicze dla moich celów, ale są one podobne do tych w zaakceptowanej odpowiedzi.

Przykładowe dane wejściowe

  | 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

Możesz użyć wielu „regionów” w 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

Następnie wystarczy ustawić zmienną środowiskową $ FILE:

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

1
to jest prawie to, czego chciałem, ale (a) górne okno nie przewija się w prawo, więc jest bezużyteczne w przypadku szerokich stołów
filiprem

Nie jestem pewien, co rozumiesz przez „bezużyteczne dla szerokich stołów”; screen może rozwinąć się do rozmiaru terminala (jeśli nie uruchamia fitpolecenia screen). Myślałem, że nie chcesz, aby góra się przewijała. Kiedy przetestowałem to sam, oba okna przewijają się tak, jak powinny. Góra przewija dwie linie (1-2, 3-4, 5-6 itp.), A dolna przewija w razie potrzeby. Jakie jest zachowanie, które widzisz /
Arcege

0

Możesz dodać liczbę przed „naprzód”, a przewinie ona N wierszy, a nie pełnej długości. Jeśli więc okno terminala ma 40 linii, wpisz, 38faby rozpocząć przewijanie tylko 38 linii, pozostawiając 2 ostatnie linie z ostatniej „strony”. Z strony podręcznika:

   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
Muszę zachować pierwszą , a nie ostatnią N linii. Jako „zamrażaj górne N wierszy” w arkuszu kalkulacyjnym Google.
filiprem

O przepraszam. Nie wiem czy narzędzie, które by to zrobiło. Następnie sugeruję: użyj screenlub, tmuxaby utworzyć dwa panele, zmień rozmiar pierwszej z dwóch linii ( resize 2), a następnie uruchom lessw drugim okienku, uruchom lessnormalnie. Możesz ustawić to jako skrypt z określonym plikiem .screenrc. Zobacz alternatywną odpowiedź.
Arcege
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.