programa de buscapersonas como menos, capaz de repetir las líneas N superiores

15

¿Hay alguna forma de hacer que el lessprograma repita la primera línea (o las primeras 2 líneas) en cada página mostrada?

¿Hay algún otro programa de buscapersonas que pueda hacer esto?

Esto sería un asesino aplicación para la tabla de base de datos de navegación, pensar mysqlo psql, o gqlplus...

Para aquellos de ustedes que no tienen la idea, vea la captura de pantalla en la parte inferior de esta página . Quiero repetir la línea del encabezado + barra ascii horizontal.

filiprem
fuente
Oh chico, eso pide una extensión a menos, como un punto de congelación. Por ejemplo, --freeze-pane 10,2 mantendría 1 línea de encabezados de columna y 10 columnas de encabezado de fila. El desplazamiento horizontal y vertical preservaría los encabezados de fila y columna respectivamente. Sería genial usarlo para un buscapersonas psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Respuestas:

12

Hay una solución usando Vim.

Primero, necesitamos una macro Vim, que hará la mayor parte del trabajo, la guardo en ~/.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()

En segundo lugar, para emular un buscapersonas, necesito invocar vim para que:

  • leer entrada estándar
  • pero si el argumento se da en la línea de comando, lea lo que venga allí
  • trabajar en modo de solo lectura
  • omita todos los scripts de inicio, pero en su lugar ejecute Menos macro definida anteriormente

Puse esto junto como script de ayuda en ~/bin/vimpager:

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

Tercero, necesito anular la variable de entorno $ PAGER, pero solo para psql (agregue esto a mi ~/.bash_aliases):

if which vimpager &>/dev/null; then
  alias psql='PAGER=vimpager psql';
fi
filiprem
fuente
Esto es encantador, lo intenté. Ahora sería bueno si uno pudiera agregar encabezados de fila también, en lugar de estos números de fila.
Gunther Schadow
4

¿Has probado el modo SQL en Emacs / XEmacs?

Ciertamente, no es tan fácil de usar como moreo less, pero hace lo que está pidiendo, dejando una fila de encabezado mientras se desplazan los resultados vertical y horizontalmente.

bsd
fuente
Gracias, no conozco Emacs pero suena interesante. Eventualmente necesitaría un script de shell que: iniciar emacs, ejecutar psql allí (con parámetros de conexión dados), habilitar el modo sql y hacer lo que quiero (siempre congelar las 2 filas superiores cuando hay resultados de consulta más grandes que el tamaño de la pantalla) . alguna pista sobre eso?
filiprem
3

Esto toma mucho de la respuesta aceptada, pero agrega ...

  • Desplazamiento más rápido
  • No se puede desplazar accidentalmente al encabezado
  • Resaltado de sintaxis (algunos créditos pertenecen aquí )
    • Números positivos / negativos, fechas, horas, NULLVerdadero / Falso (y T / F, S / N, Sí / No)
    • Números de fila, si los tiene antes de una tubería char.
  • Texto de ayuda
  • Soporte para el Vim que se incluye con Git para Windows
  • No amenace con actualizar la vista si cambia el búfer stdin

Es posible que algunas partes tengan que ajustarse para su salida específica, ya que no las uso psql. También tengo funciones auxiliares ligeramente diferentes para mis propósitos, pero son similares a las de la respuesta aceptada.

Entrada de muestra

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

Código

" :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 - ¿Dónde está Clay Shirky?
fuente
2

Podrías usar múltiples 'regiones' en 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

Entonces solo necesita establecer la variable de entorno $ FILE:

$ FILE=$HOME/.bash_profile screen -mc screenrc.sql
Arcege
fuente
1
esto es casi lo que quería, pero (a) la ventana superior no se desplaza hacia la derecha, por lo que es inútil para tablas anchas
filiprem
No estoy seguro de lo que quiere decir con "inútil para tablas anchas"; la pantalla puede expandirse al tamaño del terminal (si no ejecuta elfit comando de pantalla). Pensé que no querías que la parte superior se desplazara. Cuando lo probé por mi cuenta, ambas ventanas se desplazan como deberían. La parte superior se desplaza dos líneas (1-2, 3-4, 5-6, etc.) y la parte inferior se desplaza según sea necesario. ¿Cuál es el comportamiento que estás viendo? /
Arcege
0

Puede agregar un número antes del 'avance' y desplazará N líneas, no una longitud completa. Entonces, si la ventana de su terminal tiene 40 líneas, escriba 38fpara comenzar a desplazarse solo 38 líneas, dejando las últimas 2 líneas de la última 'página'. Desde la página del 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
fuente
1
Necesito mantener primero , no las últimas N líneas. Como "congelar las N filas superiores" en la hoja de cálculo de Google.
filiprem
Oh, lo siento. No sé si una utilidad que haría eso. Entonces, lo que sugiero es: use screeno tmuxpara crear dos paneles, cambie el tamaño de la primera a dos líneas ( resize 2) y luego ejecute less, en el segundo panel, ejecute lessnormalmente. Puede configurar esto como un script con un archivo .screenrc específico. Ver respuesta alternativa.
Arcege