less –quit-if-one-screen без –no-init

Я на терминале, который поддерживает альтернативный экран, который используется less, vim и т. Д., Чтобы восстановить предыдущий экран после выхода. Это хорошая функция, но она действительно нарушает --quit-if-one-screen « --quit-if-one-screen поскольку в этом случае меньше переключений на альтернативный экран, отображает его данные, цифры показывают только один экран и выходят, принимая содержимое альтернативного экрана с ним.

Общепринятое решение обхода используется с помощью переключателя --no-init чтобы вообще не использовать альтернативный экран. Тем не менее, это несколько уродливо, потому что я хочу использовать его, если на самом деле он действует как пейджер. Поэтому я ищу решение для использования альтернативного экрана только в том случае, если меньше не заканчивается автоматически.

В основном я использую это как пейджер Git, поэтому сценарий оболочки оболочки, который работает только меньше, если будет достаточный выход, тоже будет хорошо. По крайней мере, если нет способа сделать это без него.

  • Разница между меньшими -r и меньше -R
  • Как сделать терминал без ключа независимым?
  • Как написать все строки от меньшего до файла?
  • Искать в меньшей степени с обтеканием в EOF
  • Как меньше показывать предыдущие строки при поиске?
  • Сделайте «меньше» точку перехода в центр результата поиска, а не вверх
  • Как вы уменьшаете отображение имени файла?
  • Принудительно отобразить файл в виде текста
  • 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 не ​​может использоваться независимо от длины файла.

    Linux и Unix - лучшая ОС в мире.