менше --quit-if-one-screen без --no-init


31

Я на терміналі, який підтримує альтернативний екран, який використовується меншим, vim тощо, щоб відновити попередній дисплей після виходу. Це приємна особливість, але вона дійсно порушує --quit-if-one-screenперемикання, lessоскільки в цьому випадку менше перемикається на альтернативний екран, відображає його дані, з'ясовує, що існує лише один екран, і виходить, беручи вміст альтернативного екрана.

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

Я здебільшого використовую це як пейджер Git, тому сценарій оболонки оболонки, який працює лише менше у випадку, якщо є достатня кількість результатів, теж буде добре. Принаймні, якщо немає способу обійтися без одного.


@thieMaster в цьому випадку як ви визначаєте альтернативний екран? Я намагаюся очистити деякі теги, і я дійсно не знаходжу тут сенсу
Kiwy

Відповіді:


14

Оскільки менше 530 (випущено в грудні 2017 року), less --quit-if-one-screenвін не переходить на альтернативний екран, якщо він читає менше, ніж один екран. Таким чином, у вас не буде цієї проблеми, якщо ваша версія менше буде нещодавно нещодавнішою.

У попередніх версіях менше доводиться вирішувати, чи використовувати альтернативний екран під час його запуску. Ви не можете відкласти цей вибір, коли він закінчується.

Ви можете зателефонувати менше, дозвольте йому використовувати альтернативний екран і перенести вміст на основний екран, якщо менше закінчується автоматично. Однак я не знаю способу виявлення автоматичного припинення.

З іншого боку, не так складно викликати кішку для коротких входів і менше для великих входів, навіть зберігаючи буферизацію, щоб вам не довелося чекати, щоб весь вхід почав бачити менше матеріалів (буфер може бути трохи більше - ви нічого не побачите, доки не будете мати хоча б один скріншот даних - але не набагато більше).

#!/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

5
"Менше доводиться вирішувати, чи використовувати альтернативний екран під час його запуску. Ви не можете відкладати цей вибір, коли він закінчується." - хоча це, мабуть, не робить, але не міг би просто відкласти будь-який вихід (наприклад, команди ініціалізації терміналу або фактичні дані), поки він не отримає X рядків. Якщо stdin вичерпується під час X <TERMINAL_LINES, він просто скидає все на stdout та exit, інакше він ініціалізує альтернативний екран і зробить те, що він повинен робити
ThiefMaster

1
Я в кінцевому підсумку скористався модифікованою версією вашого першого прикладу коду: gist.github.com/TentistMaster/8331024 ($ LINES порожній, коли його викликали як git-пейджер, і я думаю, ви забули збільшення $n)
ThiefMaster

@TentistMaster Дякую за відгук. Зауважте, що ви повинні ввести #!/bin/bashсвій сценарій, оскільки ви використовуєте специфічну для bash конструкцію, оскільки ваш сценарій не буде працювати в системах (таких як Ubuntu), де /bin/shне bash.
Жил "ТАК - перестань бути злим"

3
Мені дуже сподобалась ця ідея, і я розвинув її трохи далі (з додатковими можливостями): github.com/stefanheule/smartless
stefan

1
@TentistMaster: lessможе також (але не має) необов'язкового способу виходу з місця, де він друкує поточний вміст екрана після відправлення рядка un-init. Таким чином, ви можете скористатися альтернативним екраном, не захаращуючи прокрутки, але все ж залиште відповідну частину довідкової сторінки або будь-якого іншого на терміналі після виходу.
Пітер Кордес

9

GNU менше v. 530 включає в себе патч Fedora, на який посилається @ paul-antoine-arras, і більше не виводить послідовність ініціалізації терміналів при --quit-if-one-screenвикористанні, а вхід підходить на одному екрані.


4
Користувачі домашніх програм на Mac OS можуть негайно отримати таку поведінку, запустивши brew install lessта переконайтесь, що $LESSмає F та опускає X.
Райан Паттерсон

Це моя улюблена відповідь. Я одразу завантажив Менше 5.3.0 з GNU і скомпілював його сам. Чудовий натяк!
iBug

5

Для повільних входів, наприклад git log -Gregex, ви хочете:

A) рядки, що з’являються на головному екрані, коли вони входять, а потім перейдіть на альтернативний екран, коли потрібна прокрутка (тому перший $LINESз результатів завжди з’явиться у вашому прокрутку); якщо так, то перейдіть з другими відповідями Гілла .

B) рядки, які відображатимуться на альтернативному екрані, але вийдіть із альтернативного екрана та надрукуйте рядки на головному екрані, якщо прокрутка виявиться непотрібною (тому жоден вихід не з’явиться у вашому зворотному прокрутку, якщо прокрутка потрібна); якщо так, скористайтеся сценарієм нижче:

Це teeвхід до тимчасового файлу, а потім один раз lessвиходить 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


3

Це вже давно вирішено в дистрибутивах на основі Red Hat, змінивши поведінку параметра -F у lessвихідному коді: дивіться цей патч від проекту Fedora, перша версія якого починається з 2008 року. Ідея полягає у тому, щоб досягти висоти термінал (тобто максимальна кількість рядків, які можна відобразити одразу) і опускати послідовності ініціалізації та деініціалізації, коли файл вміщується на одному екрані. Таким чином, немає необхідності в опції -X і -F можна використовувати послідовно незалежно від довжини файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.