较少的寻呼机程序,能够重复前N行


15

有什么方法可以使less程序在每个显示的页面上重复第一行(或前两行)?

还有其他的寻呼机程序可以做到这一点吗?

这将是一个杀手级应用程序内的数据库表的浏览,认为mysqlpsqlgqlplus...

请参阅此页面底部的屏幕截图。我想重复标题行+水平的ASCII栏。


噢,男孩,这要求扩展到更少,例如“冻结窗格”点。例如,--freeze-pane 10,2将保留1行列标题和10列行标题。水平和垂直滚动将分别保留行标题和​​列标题。这将是真正冷静地用一个PSQL寻呼机(merlinmoncure.blogspot.com/2007/10/better-psql-with-less.html)
冈瑟沙多

Answers:


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宏

我把它作为辅助脚本放在一起~/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的所有功能都在那里。


这很可爱,我尝试过。现在,如果还可以添加行标题而不是这些行号,那就太好了。
Gunther Schadow

4

您是否在Emacs / XEmacs中尝试过SQL模式

这当然不是那么简单,使用moreless,但它确实你问什么,留下了标题行,而垂直和水平滚动的结果。


谢谢,我不知道Emacs,但这听起来很有趣。我最终将需要一个shell脚本,该脚本将:启动emacs,在其中运行psql(使用给定的conn。params),启用sql-mode并执行我想要的操作(当查询结果大于屏幕大小时,总是冻结前2行) 。有什么暗示吗?
filiprem 2011年

3

这是从公认的答案中大量借用的但是增加了...

  • 快速滚动
  • 不能意外滚动到标题
  • 语法突出显示(一些功劳归于此
    • 正数/负数,日期,时间,NULL真/假(以及T / F,Y / N,是/否)
    • 行号(如果在管道字符前有行号)。
  • 帮助文字
  • 支持Windows版Git随附的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 2011年

不确定“对宽桌毫无用处”的含义;屏幕可以扩展到终端的大小(如果不运行fitscreen命令)。我以为您不希望顶部滚动。当我自己进行测试时,两个窗口都将按其原样滚动。顶部滚动两行(1-2、3-4、5-6等),底部滚动根据需要。您看到的是什么行为
Arcege 2011年

0

您可以在“前进”之前添加一个数字,它将滚动N行,而不是全长。因此,如果您的终端窗口是40行,请键入38f以开始仅滚动38行,而从最后一个“页面”保留最后两行。从联机帮助页:

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

啊对不起 我不知道是否有实用程序可以做到这一点。然后我建议是:使用screentmux创建两个窗格,将第一个窗格的大小调整为两行(resize 2),然后运行less,在第二个窗格中,less正常运行。您可以将其设置为带有特定.screenrc文件的脚本。请参阅替代答案。
Arcege 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.