Вопрос или проблема
Есть ли способ заставить программу less
повторять первую строку (или первые 2 строки) на каждой отображаемой странице?
Существует ли другая программа для просмотра, которая может это делать?
Это было бы потрясающим приложением для просмотра таблиц баз данных, таких как mysql
или psql
или gqlplus
…
Смотрите скриншот внизу этой страницы. Я хочу повторить заголовочную строку + горизонтальный ASCII-бар.
Существует решение с использованием Vim.
Во-первых, вам нужен макрос Vim, который выполнит основную часть работы. Сохраните его в файле ~/.vim/plugin/less.vim
:
" :Less
" превратить vim в средство просмотра для выровненных результатов psql
fun! Less()
set nocompatible
set nowrap
set scrollopt=hor
set scrollbind
set number
execute 'above split'
" изменить размер верхнего окна на одну строку; две строки не нужны, потому что vim добавляет разделительную линию
execute 'resize 1'
" перейти в нижнее окно и прокрутить на 2 строки вниз
wincmd j
execute 'norm! 2^E'
" скрыть строку состояния в нижнем окне
set laststatus=0
" скрыть содержимое верхней строки состояния. редактор: не удаляйте завершающие пробелы в следующей строке!
set statusline=\
" стрелки выполняют прокрутку вместо перемещения
nmap ^[OC zL
nmap ^[OB ^E
nmap ^[OD zH
nmap ^[OA ^Y
nmap <Space> <PageDown>
" быстрое завершение работы (я склонен забывать о верхней панели)
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
Вуаля! После перезагрузки вашего профиля вы сможете наслаждаться результатом, который должен работать как ожидается (стрелки перемещают как вертикально, так и горизонтально) и выглядеть вот так: . Плюс, вся мощь Vim доступна, если вам это нужно.
Вы пробовали режим SQL в Emacs/XEmacs?
Это определенно не так просто в использовании, как more
или less
, но он выполняет то, о чем вы просите, оставляя строку заголовка при прокрутке результатов вертикально и горизонтально.
Это заимствовано в значительной степени из принятого ответа, но добавляет…
- Более быстрая прокрутка
- Невозможно случайно прокрутить в заголовок
- Подсветка синтаксиса (авторство частично принадлежит сюда)
- Положительные/отрицательные числа, даты, время,
NULL
, True/False (и T/F, Y/N, Yes/No) - Номера строк, если они находятся перед символом вертикальной черты.
- Положительные/отрицательные числа, даты, время,
- Текст справки
- Поддержка 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
" Превратить vim в средство просмотра с заголовочной строкой
" Адаптировано из https://unix.stackexchange.com/a/27840/143088
fun! HeadPager()
" Если вы не получили три строки, выход
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
" Скрыть строку состояния в нижнем окне
set laststatus=0
" Объясните названные символы в строке состояния.
set statusline=\ \ \ Q\ для\ выхода\.\ Стрелки\ или\ колесо\ вправо\ для\ прокрутки\.\ (Команды\ Vim\ тоже\ работают\.)
" Удалить/копировать строки заголовка
silent execute '1,2d'
" Разделить экран с новым буфером (открывается вверху)
execute 'new'
" Переключиться на верхний разрез
wincmd k
" Вставить заголовок на пустую строку
execute 'norm! Vp'
" Подсветка заголовка
syn match Pipe "|"
hi def Pipe ctermfg=blue
syn match Any /[^|]\+/
hi def Any ctermfg=yellow
" Переключиться обратно на нижний разрез для прокрутки
wincmd j
" Установить высоту нижнего разреза на максимальную
execute "norm! \<c-W>_"
" Подсветка синтаксиса
syn cluster CellContents contains=None
syn match Pipe "|" contained nextgroup=@CellContents skipwhite
hi def Pipe ctermfg=blue
" Начать с новой строки или |. Закончить прямо перед следующим | или 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
" Стрелки выполняют прокрутку вместо перемещения
nmap <silent> <Up> 3<c-Y>
nmap <silent> <Down> 3<c-E>
nmap <silent> <Left> zH
nmap <silent> <Right> zL
nmap <Space> <PageDown>
" Быстрее выйти (я склонен забывать о верхней панели)
nmap <silent> q :qa!<c-M>
nmap <silent> Q :qa!<c-M>
" Игнорировать внешние обновления буфера
autocmd! FileChangedShell */fd/*
autocmd! FileChangedRO */fd/*
endfun
command! -nargs=0 HeadPager call HeadPager()
Вы могли бы использовать несколько “областей” в screen
:
$ cat screenrc.sql
escape ^aa # измените по мере необходимости
bind q quit # для быстрого выхода
screen 0 less ${FILE}
screen 1 less ${FILE}
split # создайте две области
focus top # начнем с верхней области
resize 4 # сделать четыре строки (одна для линии экрана, одна для подсказки less)
select 0 # отображать окно 0
focus bottom # в нижней области
select 1 # отображать окно 1 и сфокусироваться здесь
Затем вам просто нужно установить переменную среды $FILE:
$ FILE=$HOME/.bash_profile screen -mc screenrc.sql
Есть новая опция --header
, добавленная в less в версии 600 примерно в 2022 году, где можно заморозить верхний набор строк.
--header=L,C,N
Устанавливает количество строк и столбцов заголовка, отображаемых на экране. Количество строк заголовка устанавливается на L. Если L равно 0, строки заголовка отключены. Если L пусто или отсутствует, количество строк заголовка не меняется. Количество столбцов заголовка устанавливается на C. Если C равно 0, столбцы заголовка отключены. Если C пусто или отсутствует, количество столбцов заголовка не меняется. Первая строка заголовка устанавливается на номер строки N в файле. Если N пусто или отсутствует, считается, что это номер строки, который в данный момент отображается в первой строке экрана (если команда
--header
была выдана из less), или 1 (если опция--header
была указана в командной строке). Специальная форма “--header=-
” отключает строки заголовка и столбцы, и эквивалентна форме “--header=0,0
“.Когда L не равно нулю, первые L строки в верхней части экрана заменяются на L строк файла, начиная с строки N, независимо от того, какую часть файла просматривают. Когда строки заголовка отображаются, любые содержимое файла до строки заголовка не могут быть просмотрены. Когда C не равно нулю, первые C символов, отображаемых в начале каждой строки, заменяются первыми C символами строки, даже если остальная часть строки горизонтально прокручивается.
Кратко: L — это верхние строки, которые будут заморожены, C — это левые столбцы, которые будут заморожены, и N — это верхние строки, которые нужно пропустить перед началом строк L.
Вы можете добавить число перед командой ‘forward’, чтобы прокрутить на N строк, а не на всю длину. Так что если ваше окно терминала 40 строк, введите 38f
, чтобы начать прокрутку только на 38 строк, оставив последние 2 строки из последней “страницы”. Из руководства:
SPACE or ^V or f or ^F
Прокрутить вперед на N строк, по умолчанию на одно окно (см. опцию -z
ниже). Если N больше, чем размер экрана, отображается только конечный
экран. Внимание: некоторые системы используют ^V как специальный символ
для обратной записи.
z Как SPACE, но если указано N, оно становится новым размером окна.
b or ^B or ESC-v
Прокрутить назад на N строк, по умолчанию на одно окно (см. опцию -z
ниже). Если N больше, чем размер экрана, отображается только конечный
экран.
Ответ или решение
Вопрос, поставленный автором, касается необходимости удержания верхних строк текста при просмотре длинных списков данных, например, таблиц баз данных, с помощью программы-пейджера. Это может быть полезно для просмотра заголовков таблиц, чтобы всегда иметь их на виду, когда пролистываешь данные вниз. Оригинальный запрет предлагает использовать команду less
для этого, которая является стандартным инструментом для просмотра текстовых файлов в Unix-подобных системах. Однако напрямую она не поддерживает возможность фиксировать первые строки на экране.
Теория
Программы-пейджеры, такие как less
, предоставляют пользователям базовые возможности для просмотра файлов или ввода/вывода данных, что особенно полезно при работе с большими объемами текстовой информации. Они обычно поддерживают навигацию по тексту с помощью клавиатуры и предлагают базовые опции фильтрации и поиска. Однако их функциональность может быть ограничена.
В стандартной версии less
, до недавнего времени, не было встроенной возможности "закрепления" определенных строк на экране при пролистывании документа. Это вызывает затруднения при работе с табличными данными, так как видимость заголовков таблиц не поддерживается, когда вы прокручиваете содержимое вниз. Однако начиная с версии 600, в less
была добавлена опция --header
, позволяющая заморозить верхние строки.
Пример
Решение данной задачи с помощью less
возможно, если используется версия, поддерживающая опцию --header
. Эта опция позволяет пользователю определить количество строк, которые должны быть всегда видны на экране, независимо от того, насколько далеко содержимое прокручено. Например, если заголовок таблицы занимает две строки, можно использовать команду less --header=2
, чтобы гарантировать, что эти строки всегда будут отображаться.
Альтернативный подход включает использование редакторов, таких как Vim или Emacs, которые можно настроить для выполнения функций пейджера с расширенной функциональностью. В Vim, например, можно создать макрос, который разделяет экран на две области: верхнюю для отображения фиксированных заголовков и нижнюю для просмотра содержимого. Это требует определенной настройки, но в результате дает полный контроль над отображением и позволяет выделять синтаксис для лучшего восприятия данных.
Практическое применение
Решение данной задачи важно для профессионалов, работающих с базами данных, таких как администраторы СУБД или аналитики данных. Повседневные задачи таких специалистов включают просмотр и анализ значительных объемов таблиц, где наличие заголовка под рукой существенно упрощает понимание и анализ данных.
Для того чтобы использовать Vim в качестве пейджера, можно воспользоваться макросом, который описан выше. Скрипт vimpager
позволяет настроить Vim на режим только для чтения, чтобы сервер базы данных (например, PostgreSQL) использовал его как пейджер по умолчанию. Такой подход позволяет как удобно просматривать данные, так и в полной мере использовать мощь редактора Vim для дополнительных задач, таких как модификация текста, поиск и фильтрация.
Использование Emacs с включенным режимом SqlMode также предоставляет удобные возможности для работы с базами данных. Этот режим более сложный, но предоставляет мощные инструменты для обработки и обработки SQL-запросов прямо в редакторе.
Если рассматривать вариант с screen
, то он предоставляет возможность создания нескольких регионов на экране и может помочь в удержании отображения заголовка, создавая отдельное окно для его отображения.
Итог
Работа с табличными данными — это сложная и часто трудоемкая задача, и выбор правильного инструмента может значительно повысить производительность. Использование less
с поддержкой новых функций или более тяжелые решения типа Vim/Emacs дают пользователям больше контроля и гибкости, но требуют некоторой настройки и навыков работы с Unix-системами и текстовыми редакторами. Участие новых функций в таких утилитах показывает, как развиваются инструменты для удовлетворения потребностей пользователей, и иллюстрирует, как интеграция этих возможностей может повысить эффективность работы с данными.