less
표시된 모든 페이지에서 프로그램이 첫 번째 줄 (또는 처음 두 줄)을 반복 하도록하는 방법이 있습니까?
이 작업을 수행 할 수있는 다른 호출기 프로그램이 있습니까?
이것은 데이터베이스 테이블 탐색, 생각 mysql
또는 psql
또는 gqlplus
...에 대한 킬러 응용 프로그램입니다
아이디어를 얻지 못한 분은 이 페이지 하단의 스크린 샷을 참조하십시오 . 헤더 라인 + 가로 ASCII 막대를 반복하고 싶습니다.
less
표시된 모든 페이지에서 프로그램이 첫 번째 줄 (또는 처음 두 줄)을 반복 하도록하는 방법이 있습니까?
이 작업을 수행 할 수있는 다른 호출기 프로그램이 있습니까?
이것은 데이터베이스 테이블 탐색, 생각 mysql
또는 psql
또는 gqlplus
...에 대한 킬러 응용 프로그램입니다
아이디어를 얻지 못한 분은 이 페이지 하단의 스크린 샷을 참조하십시오 . 헤더 라인 + 가로 ASCII 막대를 반복하고 싶습니다.
답변:
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을 호출하여 다음을 수행해야합니다.
이것을 도우미 스크립트로 정리했습니다 ~/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
이것은 허용 된 답변 에서 매우 많이 차용 하지만 추가합니다 ...
NULL
True / False (및 T / F, Y / N, 예 / 아니오)사용하지 않기 때문에 일부 출력은 특정 출력에 맞게 조정해야 할 수도 있습니다 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()
다음에서 여러 '지역'을 사용할 수 있습니다 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
fit
화면 명령을 실행하지 않는 경우 ). 나는 당신이 상단을 스크롤하고 싶지 않다고 생각했습니다. 내가 직접 테스트했을 때 두 창은 모두 스크롤됩니다. 상단은 두 줄 (1-2, 3-4, 5-6 등)을 스크롤하고 하단은 필요에 따라 스크롤합니다. 당신이보고있는 행동은 무엇입니까 /
'앞으로'앞에 숫자를 추가하면 전체 길이가 아니라 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.
screen
하거나 tmux
생성하여 첫 번째 한 줄에서 두 줄의 크기를 조정 resize 2
한 다음 less
두 번째 창에서을 실행하여 less
정상적으로 실행 하는 것입니다. 특정 .screenrc 파일을 사용하여 스크립트로 설정할 수 있습니다. 다른 답변을 참조하십시오.