Pager-Programm wie weniger, in der Lage, Top-N-Zeilen zu wiederholen

15

Gibt es eine Möglichkeit, das lessProgramm auf jeder angezeigten Seite die erste Zeile (oder die ersten beiden Zeilen) wiederholen zu lassen ?

Gibt es ein anderes Pager-Programm, das das kann?

Dies wäre eine Killer-App zum Durchsuchen von Datenbanktabellen, zum Nachdenken mysqloder psqloder gqlplus...

Diejenigen unter Ihnen, die keine Ahnung haben, finden den Screenshot unten auf dieser Seite . Ich möchte die Kopfzeile + horizontale ASCII-Leiste wiederholen.

filiprem
quelle
Oh Mann, das verlangt eine Erweiterung auf weniger, wie ein Freeze Pane-Punkt. Zum Beispiel würde --freeze-pane 10,2 1 Zeile Spaltenüberschriften und 10 Spaltenzeilenüberschriften enthalten. Durch horizontales und vertikales Scrollen werden die Zeilen- und Spaltenüberschriften beibehalten. Das wäre wirklich cool für einen psql-Pager (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow vor

Antworten:

12

Es gibt eine Lösung mit Vim.

Zuerst brauchen wir ein Vim-Makro, das den größten Teil der Arbeit erledigt. Ich speichere es in ~/.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()

Zweitens, um einen Pager zu emulieren, muss ich vim aufrufen, damit es:

  • Standardeingabe lesen
  • Wenn jedoch ein Argument in der Befehlszeile angegeben wird, lesen Sie, was auch immer dort ankommt
  • schreibgeschützt arbeiten
  • überspringe alle Init-Skripte, führe stattdessen das oben definierte Less-Makro aus

Ich habe dies als Hilfsskript zusammengestellt in ~/bin/vimpager:

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

Drittens muss ich die Umgebungsvariable $ PAGER überschreiben, aber nur für psql (füge dies zu meiner hinzu ~/.bash_aliases):

if which vimpager &>/dev/null; then
  alias psql='PAGER=vimpager psql';
fi
filiprem
quelle
Das ist schön, ich habe es versucht. Nun wäre es schön, wenn man anstelle dieser Zeilennummern auch Zeilenköpfe hinzufügen könnte.
Gunther Schadow vor
4

Haben Sie den SQL-Modus in Emacs / XEmacs ausprobiert ?

Es ist sicherlich nicht so einfach zu bedienen wie moreoder less, aber es macht das, wonach Sie gefragt haben, indem es beim vertikalen und horizontalen Scrollen eine Kopfzeile hinterlässt.

bsd
quelle
Danke, ich kenne Emacs nicht, aber es klingt interessant. Ich würde irgendwann ein Shell-Skript brauchen, das: Emacs startet, dort psql ausführt (mit vorgegebenen Verbindungsparametern), den SQL-Modus aktiviert und das macht, was ich will (die obersten 2 Zeilen immer einfrieren, wenn die Abfrageergebnisse größer als der Bildschirm sind). . irgendwelche Hinweise dazu?
Filiprem
3

Dies lehnt sich sehr stark an die akzeptierte Antwort an, fügt aber hinzu ...

  • Schnelleres Scrollen
  • Kann nicht versehentlich in die Kopfzeile scrollen
  • Syntax-Hervorhebung (etwas Gutschrift gehört hierher )
    • Positive / negative Zahlen, Datumsangaben, Uhrzeiten, NULLWahr / Falsch (und T / F, J / N, Ja / Nein)
    • Zeilennummern, wenn Sie diese vor einem Pipe Char haben.
  • Hilfstext
  • Unterstützung für das in Git for Windows enthaltene Vim
  • Drohen Sie nicht, die Ansicht zu aktualisieren, wenn sich der Standardpuffer ändert

Einige Teile müssen möglicherweise für Ihre spezifische Ausgabe optimiert werden, da ich sie nicht verwende psql. Ich habe auch etwas andere Hilfsfunktionen für meine Zwecke, aber sie ähneln denen in der akzeptierten Antwort.

Probeneingabe

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

Code

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

Sie können mehrere "Regionen" verwenden in 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

Dann müssen Sie nur noch die Umgebungsvariable $ FILE setzen:

$ FILE=$HOME/.bash_profile screen -mc screenrc.sql
Arcege
quelle
1
Das ist fast das, was ich wollte, aber (a) das obere Fenster
scrollt
Ich bin mir nicht sicher, was Sie unter "nutzlos für breite Tische" verstehen. screen kann auf die Größe des Terminals erweitert werden (wenn der fitBefehl screen nicht ausgeführt wird ). Ich hatte gedacht, Sie wollten nicht, dass oben gescrollt wird. Als ich es alleine getestet habe, scrollen beide Fenster so, wie sie sollten. Mit der oberen Taste werden zwei Zeilen (1-2, 3-4, 5-6 usw.) und mit der unteren Taste nach Bedarf gescrollt. Was ist das Verhalten, das Sie sehen /
Arcege
0

Sie können eine Zahl vor dem 'Vorwärts' einfügen und es werden N Zeilen gescrollt, nicht eine volle Länge. Wenn Ihr Terminalfenster also 40 Zeilen hat, geben Sie Folgendes ein 38f, um nur 38 Zeilen zu scrollen und die letzten 2 Zeilen der letzten "Seite" zu belassen. Aus der 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.
Arcege
quelle
1
Ich muss die ersten und nicht die letzten N Zeilen behalten . Als "Top-N-Zeilen einfrieren" in der Google-Tabelle.
Filiprem
Oh, tut mir leid. Ich weiß nicht, ob ein Dienstprogramm das tun würde. Was ich dann vorschlage, ist: Verwenden Sie screenoder tmux, um zwei Fenster zu erstellen, ändern Sie die Größe der ersten bis zwei Zeilen ( resize 2) und führen Sie dann lessim zweiten Fenster die lessnormale Ausführung aus . Sie können dies als Skript mit einer bestimmten .screenrc-Datei einrichten. Siehe alternative Antwort.
Arcege