더 적은 pager 프로그램으로 상위 N 줄 반복 가능


15

less표시된 모든 페이지에서 프로그램이 첫 번째 줄 (또는 처음 두 줄)을 반복 하도록하는 방법이 있습니까?

이 작업을 수행 할 수있는 다른 호출기 프로그램이 있습니까?

이것은 데이터베이스 테이블 탐색, 생각 mysql또는 psql또는 gqlplus...에 대한 킬러 응용 프로그램입니다

아이디어를 얻지 못한 분은 이 페이지 하단의 스크린 샷을 참조하십시오 . 헤더 라인 + 가로 ASCII 막대를 반복하고 싶습니다.


오 소년, 그것은 Freeze Pane 포인트와 같이 적은 확장을 요구합니다. 예를 들어 --freeze-pane 10,2는 한 줄의 열 머리글과 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을 호출하여 다음을 수행해야합니다.

  • 표준 입력을 읽으십시오
  • 그러나 명령 줄에 인수가 주어지면 거기에 오는 것을 읽으십시오.
  • 읽기 전용 모드로 작업
  • 모든 초기화 스크립트를 건너 뛰고 대신 위에 정의 된 Less macro를 실행하십시오.

이것을 도우미 스크립트로 정리했습니다 ~/bin/vimpager.

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

셋째, 환경 변수 $ PAGER을 재정의해야하지만 psql에 대해서만 (내 추가 ~/.bash_aliases) :

if which vimpager &>/dev/null; then
  alias psql='PAGER=vimpager psql';
fi

이것은 사랑스럽고 시도했습니다. 이제이 행 번호 대신 행 헤더를 추가 할 수 있다면 좋을 것입니다.
Gunther Schadow

4

Emacs / XEmacs에서 SQL 모드 를 사용해 보셨습니까 ?

확실히 as more또는 을 사용 less하는 것은 아니지만 원하는 결과를 수행하여 결과를 세로 및 가로로 스크롤하면서 헤더 행을 남겨 둡니다.


고마워, 나는 Emacs를 모른다. 그러나 그것은 흥미있는 것처럼 들린다. 나는 결국 emacs를 시작하고 psql을 (conn. params와 함께) 실행하고 sql-mode를 활성화하고 원하는 것을 수행하는 쉘 스크립트가 필요하다. . 그것에 대한 힌트가 있습니까?
filiprem

3

이것은 허용 된 답변 에서 매우 많이 차용 하지만 추가합니다 ...

  • 빠른 스크롤
  • 실수로 헤더로 스크롤 할 수 없습니다
  • 구문 강조 (일부 크레딧 은 여기에 속함 )
    • 양수 / 음수, 날짜, 시간, NULLTrue / False (및 T / F, Y / N, 예 / 아니오)
    • 파이프 문자 앞에 행 번호가있는 경우 행 번호
  • 도움말 텍스트
  • Git for Windows에 포함 된 Vim 지원
  • 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
이것은 내가 원하지만 넓은 테이블 쓸모가 있도록 (A) 상단 창, 오른쪽으로 스크롤하지 않는 것을 거의이다
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 줄이 아니라 먼저 유지해야합니다 . Google 스프레드 시트에서 '상위 N 개 행 고정'으로
filiprem

아 죄송합니다 유틸리티가 그런 것인지 모르겠습니다. 그런 다음 제안하는 것은 두 개의 창을 사용 screen하거나 tmux생성하여 첫 번째 한 줄에서 두 줄의 크기를 조정 resize 2한 다음 less두 번째 창에서을 실행하여 less정상적으로 실행 하는 것입니다. 특정 .screenrc 파일을 사용하여 스크립트로 설정할 수 있습니다. 다른 답변을 참조하십시오.
Arcege
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.