Como rolar arquivos de dados grandes enquanto mantém o cabeçalho

18

Suponha que eu tenha algum arquivo de dados grande, que transborda a tela na direção vertical e horizontal. Como posso navegar neste arquivo, enquanto as linhas de cabeçalho permanecem na tela?

No momento, estou usando less -S , para que eu possa rolar muito bem meu arquivo horizontalmente e verticalmente. No entanto, quando rolando para baixo, as linhas de cabeçalho obviamente desaparecem. Existe uma maneira de mantê-los usando menos?

Uma alternativa é usar vim no modo de tela dividida com :set nowrap . No entanto, agora, se eu rolar horizontalmente, a janela superior não rola da mesma maneira ( :windo set scrollbind só funciona para rolagem vertical, tanto quanto eu sei).

    
por Bernhard 07.01.2013 / 10:22

5 respostas

9

Se você estiver familiarizado com o vim, esta é provavelmente a melhor opção para você. Você pode habilitar somente o link-scroll-bind alterando 'scrollopt' :

set scrollopt=hor

Portanto, com vim -u NONE , você obtém o comportamento desejado com:

:set scrollopt=hor
:set nowrap
:1split
:windo set scrollbind

Você pode querer ajustar 'sidescroll' e 'sidescrolloff' para alterar quantas colunas são ignoradas e a distância entre as que estão sendo ignoradas.

    
por 07.01.2013 / 10:59
16

Em terminais que suportam a configuração da região de rolagem:

tailf() ( # args: <file> [<number-of-header-lines>]
  trap 'tput csr 0 "$((LINES-1))"' INT
  tput csr "$((1+${2-1}))" "$((LINES-1))"
  tput clear
  {
    head -n"${2-1}"
    printf "%${COLUMNS}s\n" "" | tr ' ' =
    tail -n "$((LINES-1-${2-1}))" -f
  } < "$1"
)

(assume um shell como zsh ou bash que define as variáveis $COLUMNS e $LINES com base no tamanho do terminal).

    
por 06.08.2014 / 18:31
6

Tente isso (você precisará instalar multitail ):

multitail -du -t "$(head -n 1 filename)" filename

ou, para cabeçalhos maiores que uma linha:

multitail -wh 2 -l "head -n 2 filename" filename

Se você quiser seguir a saída do comando em vez de um arquivo:

multitail -wh 2 -l "command | head -n 2" -l command

ou use -t conforme apropriado. Note que você pode precisar usar unbuffer para que a saída do seu comando apareça imediatamente.

Você pode usar -D para desativar a exibição de linhas de status para os formulários -wh (isso frustraria a finalidade do formulário -t ).

    
por 06.08.2014 / 23:50
2

A resposta de Thor não mencionou a desativação do "scrollopt" vertical, o que faz com que ambas as janelas rolem verticalmente. Então, para mim, a solução completa está colando isso no vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
    
por 14.02.2016 / 00:30
0

Isso é o máximo que eu consegui com tmux :

#!/bin/bash

tmux new-session -s main -n 'w1' -d
tmux send-keys -t main:w1.0 "tail -f <(head -n1 $1)" C-j
tmux split-window -v
tmux resize-pane -t 0 -y 2
tmux send-keys -t 1 "tail -n+2 $1|less -S" C-j
tmux attach -t main

É uma extensão de resposta do user80519 para a divisão da janela tmux . Salvar como hless.sh , torná-lo executável e usá-lo como

hless.sh file
    
por 23.11.2015 / 20:58