програма пейджера, як менше, здатна повторювати вершини N рядків


15

Чи є спосіб змусити lessпрограму повторити перший рядок (або перші 2 рядки) на кожній відображеній сторінці?

Чи є якась інша програма пейджера, яка може це зробити?

Це було б кілер-додаток для перегляду таблиці бази даних, думає , mysqlчи , psqlабо gqlplus...

Дивіться скріншот у нижній частині цієї сторінки . Я хочу повторити рядок заголовка + горизонтальний рядок Ascii.


О, хлопче, що вимагає розширення до меншого, як точка Freeze Pane. Наприклад --Freeze-панель 10,2 міститиме 1 рядок заголовків стовпців та 10 рядків колонтитульних рядків. Горизонтальна та вертикальна прокрутка зберігала б заголовки рядків та стовпців відповідно. Це було б дуже здорово, щоб використовувати для пейджера psql (merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
Gunther Schadow

Відповіді:


12

Є рішення за допомогою Vim.

По-перше, вам потрібен макрос Vim, який зробить більшу частину роботи. Збережіть це у ~/.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()

По-друге, для емуляції пейджера вам потрібно викликати vim, щоб він:

  • читати стандартне введення
  • але якщо аргумент наведено в командному рядку, прочитайте все, що там приходить
  • працювати в режимі лише для читання
  • пропустити всі скрипти init, але замість цього виконати Менш макрос, визначений вище

Я поєднав це як помічний сценарій у ~/bin/vimpager:

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

Зробіть сценарій виконуваним за допомогою chmod +x ~/bin/vimpager.

По-третє, вам потрібно переосмислити програму пейджера для psql. Не встановлюйте змінну в PAGERусьому світі, оскільки це може вплинути на інші програми, не тільки на psql. Натомість додайте це у свій ~/.psqlrcфайл:

\setenv PAGER ~/bin/vimpager

Вуаля ! Після перезавантаження вашого профілю, ви можете насолоджуватися результатом, який повинен вести себе , як і очікувалося (стрілка клавіші служать як по вертикалі , так і по горизонталі) і виглядають наступним чином : vimpager у дії. Плюс уся сила Vim - саме там, якщо вам це потрібно.


Це прекрасно, я спробував це. Тепер було б добре, якби замість цих номерів рядків можна було також додати заголовки рядків.
Гюнтер Шадов

4

Ви пробували режим SQL в Emacs / XEmacs?

Це, звичайно , не такий простий у використанні , як moreі less, але це не те , що ваш просять, залишаючи рядок заголовка при прокручуванні результатів по вертикалі і по горизонталі.


Дякую, я не знаю Emacs, але це звучить цікаво. Зрештою, мені знадобиться скрипт оболонки, який би: запустив emacs, запустив psql там (із заданими параметрми conn.), Увімкнув sql-режим і зробив те, що я хочу (завжди заморожуйте верхні 2 ряди, коли результати запитів перевищують розмір екрану) . якісь натяки на це?
filiprem

3

Це дуже запозичується з прийнятої відповіді, але додає ...

  • Швидше прокручування
  • Неможливо випадково прокрутити до заголовка
  • Підсвічування синтаксису (деякий кредит належить тут )
    • Позитивні / негативні числа, дати, час NULL,, Істинно / Неправильно (і T / F, Y / N, Так / Ні)
    • Номери рядків, якщо вони є у вас перед знаком труби.
  • Текст довідки
  • Підтримка Vim, що входить до програми Git для Windows
  • Не погрожуйте оновити подання, якщо буфер stdin зміниться

Деякі частини, можливо, доведеться підробити для вашого конкретного виводу, оскільки я не використовую psql. У мене також є дещо інші функції помічників для моїх цілей, але вони схожі на ті, що прийняті у відповіді.

Зразок введення

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

Код

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

Ви можете використовувати кілька "регіонів" у 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

Тоді вам просто потрібно встановити змінну середовища $ FILE:

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

1
це майже те, що я хотів, але (а) верхнє вікно не прокручується праворуч, тому воно марне для широких столів
filiprem

Не впевнений, що ви маєте на увазі під "непотрібним для широких столів"; екран може розширитися до розміру терміналу (якщо він не виконує команду fitекрана). Я думав, що ти не хочеш, щоб верхівка прокручувалася. Коли я перевірив її самостійно, обидва вікна прокручуються як слід. У верхній частині прокручуються дві лінії (1-2, 3-4, 5-6 тощо), а нижня прокручується за потребою. Яку поведінку ти бачиш /
Arcege

0

Ви можете додати число перед "вперед", і воно прокрутить N рядків, а не повної довжини. Тож якщо у вашому вікні термінала 40 рядків, наберіть, 38fщоб почати прокручувати лише 38 рядків, залишаючи останній 2 рядок з останньої 'сторінки'. На сторінці сторінки:

   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
Мені потрібно дотримуватися перших , а не останніх N рядків. Як "заморозити верхні N рядків" в електронній таблиці Google.
filiprem

Ах, вибачте. Я не знаю, чи утиліта, яка б це зробила. Тоді, що я пропоную: використовувати screenабо tmuxстворити дві панелі, змінити розмір першого на два рядки ( resize 2), а потім виконати less, на другій області, запустити lessнормально. Ви можете налаштувати це як сценарій із конкретним .screenrc файлом. Дивіться альтернативну відповідь.
Арседж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.