Как использовать «less -F» без «-X», но отображать вывод только на одной странице?

11

Я настраиваю пейджер Git, но у меня есть некоторые проблемы с ним.

Что я хочу это:

  1. Всегда цветной вывод
  2. Прокрутка тачпадом или мышью
  3. Выход: если один-экран

И моя текущая конфигурация:

$ git config --global core.pager
less -+F -+X -+S

Это делает все, кроме последнего.

Но, если я уберу -+F, в случае одного экрана вывод не будет. Если я также удалю -+X, вывод вернется, но я не могу прокрутить с помощью сенсорной панели less.

Есть ли обходной путь, который может удовлетворить все требования выше?

Фредерик Чжан
источник
Это очень интересный вопрос. Когда я использую -F(выход, если один экран), я всегда делаю это в сочетании с -X(отключить termcap init и de-init), но, как вы говорите, это не позволит прокрутить мышью. (Я сомневаюсь, что прокрутка вообще возможна -X.) Я изменил название вопроса, но не стесняйтесь откатить его, если вы чувствуете, что он теряет слишком много значения. :)
Wildcard

Ответы:

8

ОБНОВИТЬ

Решение: обновить до 530

С http://www.greenwoodsoftware.com/less/news.530.html :

Не выводить последовательность инициализации терминала, если используется -F и файл помещается на одном экране.

Таким образом, с этим исправлением нам даже не нужно беспокоиться о том, стоит ли использовать -Xсамостоятельно, less -Fпросто позаботимся об этом.

PS. Некоторые другие менее конфиги, которые я использую:

export PAGER='less -F -S -R -M -i'
export MANPAGER='less -R -M -i +Gg'
git config --global core.pager 'less -F -S -R -i'
#alias less='less -F -S -R -M -i'

В конце концов я сам написал обертку.

#!/usr/local/bin/bash

# BSD/OSX compatibility
[[ $(type -p gsed) ]] && SED=$(type -p gsed) || SED=$(type -p sed)
CONTEXT=$(expand <&0)
[[ ${#CONTEXT} -eq 0 ]] && exit 0
CONTEXT_NONCOLOR=$( $SED -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" <<< "$CONTEXT")
LINE_COUNT=$( (fold -w $(tput cols) | wc -l) <<< "$CONTEXT_NONCOLOR" )

[[ $LINE_COUNT -ge $(tput lines) ]] && less -+X -+S -R <<< "$CONTEXT" || echo "$CONTEXT"

Пользователи BSD / OSX должны установить вручную gnu-sed. Удивительное регулярное выражение, которое помогает удалять цветовые коды, можно найти по адресу /programming//a/18000433/2487227.

Я сохранил этот скрипт, /usr/local/bin/pagerа затемgit config --global core.pager /usr/local/bin/pager

Лечение больных ОКР, ура!

Фредерик Чжан
источник
Это не будет работать, если в вашем файле есть переносимые строки.
Томас Дики
@ThomasDickey Я считаю, что это foldдолжно с этим справиться ... но, да, ошибки, может быть ... Не могли бы вы привести пример?
Фредерик Чжан
@ThomasDickey paste.kde.org/ph9vl7es5 это сработало для меня
Фредерик Чжан
foldне совсем понимает вкладки. Вы могли бы быть в состоянии исправить это, используя expand. Это все еще не будет обрабатывать встроенные escape-последовательности (которые часто запрашиваются в контексте git).
Томас Дики
1
Вкладки будут «работать» только тогда, когда ширина вашего терминала будет кратна табуляции. Когда я проверил это, я заметил, что foldне корректировал обернутые строки, используя пробелы, а просто нашел ближайшую точку для нарезки. Так что внешний вид будет вводить в заблуждение.
Томас Дики
0

Я использую следующую обертку в качестве моего пейджера. Это не так красиво, как другая обертка, показанная здесь (потому что она всегда использует less -Sобрезание длинных строк), но это чертовски просто. Кажется, работает довольно хорошо с iTerm2.

#!/bin/bash
set -e

text=$(</dev/stdin)
text_lines=$(echo "${text}" | wc -l)
term_lines=$(tput lines)

if [[ $text_lines -lt $term_lines ]]; then
    echo "${text}"
else
    echo "${text}" | less -S -R
fi
superbatfish
источник