Bagaimana cara menggunakan "less -F" tanpa "-X", tetapi masih menampilkan output jika hanya satu halaman?

11

Saya mengutak-atik pager dari Git, tapi saya punya beberapa masalah dengannya.

Yang saya inginkan adalah:

  1. Output selalu berwarna
  2. Menggulir dengan touchpad atau mouse
  3. Keluar-jika-satu-layar

Dan konfigurasi saya saat ini adalah:

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

Ini melakukan segalanya kecuali yang terakhir.

Tapi, jika saya hapus -+F, tidak akan ada output dalam hal satu layar. Jika saya menghapus -+Xjuga, output kembali tetapi saya tidak dapat menggulir dengan touchpad less.

Apakah ada solusi yang dapat memenuhi semua persyaratan di atas?

Frederick Zhang
sumber
Ini pertanyaan yang sangat menarik. Ketika saya menggunakan -F(keluar jika satu layar) saya selalu melakukannya bersama -X(menonaktifkan termcap init dan de-init), tetapi seperti yang Anda katakan, itu tidak akan memungkinkan menggulir dengan mouse. (Saya ragu bergulir mungkin dilakukan dengan -X.) Saya telah memodifikasi judul pertanyaan, tetapi merasa ragu untuk memutar kembali jika Anda merasa kehilangan terlalu banyak artinya. :)
Wildcard

Jawaban:

8

MEMPERBARUI

tl; dr Solusi: tingkatkan ke kurang 530

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

Jangan tampilkan urutan terminal init jika menggunakan -F dan file cocok pada satu layar.

Jadi dengan perbaikan ini kita bahkan tidak perlu repot menentukan apakah akan digunakan -Xsendiri, less -Fcukup urus saja.

PS. Beberapa konfigurasi lain yang kurang saya gunakan:

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'

Saya akhirnya berakhir dengan menulis bungkus sendiri.

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

Pengguna BSD / OSX harus menginstal secara manual gnu-sed. Regexp yang luar biasa, yang membantu menghilangkan kode warna, berasal dari /programming//a/18000433/2487227

Saya telah menyimpan skrip ini /usr/local/bin/pagerlalugit config --global core.pager /usr/local/bin/pager

Perawatan untuk pasien OCD, hore!

Frederick Zhang
sumber
Ini tidak akan berfungsi jika file Anda memiliki garis yang dibungkus.
Thomas Dickey
@ThomasDickey saya anggap foldharus menangani itu ... tapi, ya, bug mungkin ... bisakah Anda tolong berikan contoh?
Frederick Zhang
@ThomasDickey paste.kde.org/ph9vl7es5 ini bekerja untuk saya
Frederick Zhang
foldtidak begitu mengerti tab. Anda mungkin dapat memperbaikinya menggunakan expand. Itu masih tidak akan menangani urutan melarikan diri tertanam (yang sering diminta-dalam konteks git).
Thomas Dickey
1
tab hanya akan "bekerja" ketika lebar terminal Anda adalah kelipatan dari tab-stops. Ketika saya menguji ini, saya perhatikan bahwa foldtidak menyesuaikan garis terbungkus menggunakan spasi, tetapi hanya menemukan titik terdekat untuk memotong. Jadi penampilannya akan menyesatkan.
Thomas Dickey
0

Saya menggunakan pembungkus berikut sebagai pager saya. Ini tidak semewah bungkus lainnya yang ditampilkan di sini (karena selalu digunakan less -Suntuk memotong garis panjang), tetapi sangat sederhana. Tampaknya bekerja cukup baik dengan 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
ikan yang luar biasa
sumber