less –quit-if-one-screen без –no-init
Я на терминале, который поддерживает альтернативный экран, который используется less, vim и т. Д., Чтобы восстановить предыдущий экран после выхода. Это хорошая функция, но она действительно нарушает --quit-if-one-screen
« --quit-if-one-screen
поскольку в этом случае меньше переключений на альтернативный экран, отображает его данные, цифры показывают только один экран и выходят, принимая содержимое альтернативного экрана с ним.
Общепринятое решение обхода используется с помощью переключателя --no-init
чтобы вообще не использовать альтернативный экран. Тем не менее, это несколько уродливо, потому что я хочу использовать его, если на самом деле он действует как пейджер. Поэтому я ищу решение для использования альтернативного экрана только в том случае, если меньше не заканчивается автоматически.
- меньше всегда без учета регистра
- показать цвета и отключить перенос строк
- меньше с несколькими файлами; команда для вывода имен файлов
- меньше команды, застрявшей в прямой прокрутке
- Не может быть дано указание свернуть блоки строк
В основном я использую это как пейджер Git, поэтому сценарий оболочки оболочки, который работает только меньше, если будет достаточный выход, тоже будет хорошо. По крайней мере, если нет способа сделать это без него.
3 Solutions collect form web for “less –quit-if-one-screen без –no-init”
Меньше приходится решать, использовать ли альтернативный экран при его запуске. Вы не можете отложить этот выбор до завершения.
Вы могли бы назвать меньше, позволить ему использовать альтернативный экран и котировать контент на основной экран, если оно меньше автоматически завершается. Однако я не знаю способа обнаружения автоматического завершения.
С другой стороны, не так сложно называть cat для коротких входов и меньше для больших входов, даже сохраняя буферизацию, так что вам не нужно ждать, пока весь ввод начнет видеть материал меньше (буфер может быть немного больше – вы ничего не увидите, пока не получите хотя бы один экран данных, но не намного больше).
#!/bin/sh n=3 # number of screen lines that should remain visible in addition to the content lines= newline=' ' case $LINES in ''|*[!0-9]*) exec less;; esac while [ $n -lt $LINES ] && IFS= read -r line; do lines="$lines$newline$line" done if [ $n -eq $LINES ]; then { printf %s "$lines"; exec cat; } | exec less else printf %s "$lines" fi
Возможно, вам захочется увидеть строки на главном экране, когда они входят, и переключиться на альтернативный экран, если линии вызовут прокрутку.
#!/bin/sh n=3 # number of screen lines that should remain visible in addition to the content beginning= newline=' ' # If we can't determine the terminal height, execute less directly [ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null case $LINES in ''|*[!0-9]*) exec less "$@";; esac # Read and display enough lines to fill most of the terminal while [ $n -lt $LINES ] && IFS= read -r line; do beginning="$beginning$newline$line" printf '%s\n' -- "$line" n=$((n + 1)) done # If the input is longer, run the pager if [ $n -eq $LINES ]; then { printf %s "$beginning"; exec cat; } | exec less "$@" fi
Для медленных входов, таких как git log -Gregex
, вы хотите:
A), чтобы появиться на главном экране по мере их поступления, затем переключитесь на альтернативный экран, когда требуется прокрутка (так что первые $LINES
вывода всегда будут отображаться в вашем прокрутке); если да, то идите со вторым ответом Жиля .
B), чтобы появиться на альтернативном экране, но выйдите из альтернативного экрана и распечатайте линии на главном экране, если прокрутка окажется ненужной (поэтому в прокрутке не появится вывод, если требуется прокрутка); если это так, используйте следующий скрипт:
Он tee
временный файл, а затем один раз он выдает его cat
временный файл, если он содержит меньше строк, чем высота экрана:
#!/bin/bash # Needed so less doesn't prevent trap from working. set -m # Keeps this script alive when Ctrl+C is pressed in less, # so we still cat and rm $TMPFILE afterwards. trap '' EXIT TXTFILE=$(mktemp 2>/dev/null || mktemp -t 'tmp') tee "$TXTFILE" | LESS=-FR command less "$@" [[ -n $LINES ]] || LINES=$(tput lines) [[ -n $COLUMNS ]] || COLUMNS=$(tput cols) # Wrap lines before counting, unless you pass --chop-long-lines to less # (the perl regex strips ANSI escapes). if (( $(perl -pe 's/\e\[?.*?[\@-~]//g' "$TXTFILE" | fold -w "$COLUMNS" | wc -l) < $LINES )); then cat "$TXTFILE" fi rm "$TXTFILE"
Используйте его с export PAGER='/path/to/script'
. Этого должно быть достаточно, чтобы git
использовал его, если вы уже не переопределили core.pager
.
Для возможных улучшений см. Также мою немного более сложную версию этого скрипта по адресу: https://github.com/johnmellor/scripts/blob/master/bin/least
Это давно разрешено в дистрибутивах Red Hat, изменяя поведение параметра -F в less
исходном коде: см. Этот патч от Fedora Project, чья первая версия датируется 2008 годом. Идея состоит в том, чтобы получить высоту терминал (т. е. максимальное количество строк, которое может отображаться одновременно) и опустить последовательности инициализации и деинициализации, когда файл соответствует одному экрану. Таким образом, никакая потребность в опции -X и -F не может использоваться независимо от длины файла.