कम --क्विट-इफ-वन-स्क्रीन विदाउट -नो-इनिट


31

मैं एक टर्मिनल पर हूं जो वैकल्पिक स्क्रीन का समर्थन करता है जो बाहर निकलने के बाद पिछले प्रदर्शन को पुनर्स्थापित करने के लिए कम, विम, आदि द्वारा उपयोग किया जाता है। यह एक अच्छी विशेषता है, लेकिन यह वास्तव --quit-if-one-screenमें lessतब से स्विच को तोड़ता है क्योंकि उस मामले में वैकल्पिक स्क्रीन पर कम स्विच होता है, अपने डेटा को प्रदर्शित करता है, आंकड़े केवल एक स्क्रीन है, और बाहर निकलता है, वैकल्पिक स्क्रीन की सामग्री को इसके साथ ले जाता है।

वैकल्पिक रूप से सुझाए गए वैकल्पिक हल --no-initपूरी तरह से वैकल्पिक स्क्रीन का उपयोग करने से बचने के लिए स्विच का उपयोग कर रहे हैं। हालाँकि, यह कुछ हद तक बदसूरत है क्योंकि मैं इसका इस्तेमाल कम मामले में वास्तव में पेजर के रूप में करना चाहता हूं । इसलिए मैं वैकल्पिक स्क्रीन का उपयोग करने के लिए एक समाधान की तलाश कर रहा हूं यदि कम स्वचालित रूप से समाप्त नहीं होता है।

मैं ज्यादातर इसे Git के पेजर के रूप में उपयोग करूँगा, इसलिए एक आवरण खोल स्क्रिप्ट जो केवल कम चलती है अगर पर्याप्त आउटपुट ठीक होगा, भी। कम से कम अगर वहाँ एक के बिना यह करने के लिए कोई रास्ता नहीं है।


@thieMaster इस मामले में आप वैकल्पिक स्क्रीन को कैसे परिभाषित करते हैं? मैं कुछ टैग्स को साफ करने की कोशिश करता हूं और मुझे वास्तव में यहां कोई मतलब नहीं है
किवी

जवाबों:


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 <TERMINAL_LINES के दौरान स्टड समाप्त हो जाता है, तो यह बस स्टडआउट और बाहर निकलने पर सब कुछ डंप कर देगा, अन्यथा यह वैकल्पिक स्क्रीन को इनिशियलाइज़ करेगा और वही करेगा जो करना चाहिए
ThiefMaster

1
मैंने आपके पहले कोड उदाहरण के संशोधित संस्करण का उपयोग करके समाप्त किया: gist.github.com/ThiefMaster/8331024 ($ LINES तब खाली था, जब गिट-पेजर के रूप में कहा जाता था और मुझे लगता है कि आप वेतन वृद्धि भूल गए थे $n)
ThiefMaster

@ThiefMaster प्रतिक्रिया के लिए धन्यवाद। ध्यान दें कि आपको #!/bin/bashअपनी स्क्रिप्ट में तब से डालना चाहिए जब आप bash-specific निर्माण का उपयोग कर रहे हैं, क्योंकि यह आपकी स्क्रिप्ट सिस्टम (जैसे Ubuntu) पर काम नहीं करेगा जहाँ /bin/shbash नहीं है।
गाइल्स का SO- बुराई पर रोक '17

3
मुझे वास्तव में यह विचार पसंद आया, और इसे थोड़ा और विकसित किया (अधिक विशेषताओं के साथ): github.com/stefanheule/smartless
stefan

1
@ThiefMaster: lessयह भी छोड़ सकता है, लेकिन अन-इनिट स्ट्रिंग भेजने के बाद यह स्क्रीन की वर्तमान सामग्री को प्रिंट करने के लिए एक वैकल्पिक तरीका नहीं है । तो आप वैकल्पिक स्क्रीन का लाभ स्क्रॉलबैक को अव्यवस्थित नहीं कर सकते थे, लेकिन फिर भी बाहर निकलने के बाद मैन-पेज या टर्मिनल पर जो कुछ भी हो, उसके संबंधित भाग को छोड़ दें।
पीटर कॉर्डेस

9

GNU कम v। 530 में @ paul-antoine-arras द्वारा संदर्भित फेडोरा-पैच शामिल है और अब टर्मिनल इनिशियलाइज़ेशन अनुक्रम --quit-if-one-screenका उपयोग नहीं करेगा और जब एक स्क्रीन पर इनपुट फिट बैठता है।


4
Mac OS पर Homebrew उपयोगकर्ता इस व्यवहार को तुरंत चलाकर प्राप्त कर सकते हैं brew install less, और सुनिश्चित कर सकते हैं कि $LESSF और omits X है।
रयान पैटरसन

यह मेरा पसंदीदा उत्तर है। मैंने तुरंत GNU से कम 5.3.0 डाउनलोड किया और इसे स्वयं संकलित किया। महान संकेत!
iBug

5

धीमी इनपुट के लिए, जैसे git log -Gregex, क्या आप चाहते हैं:

A) मुख्य स्क्रीन पर आने वाली लाइनें, जैसे ही वे आती हैं, तब स्क्रॉल करने की आवश्यकता होने पर वैकल्पिक स्क्रीन पर स्विच करें (इसलिए $LINESआउटपुट का पहला हिस्सा हमेशा आपके स्क्रॉलबैक में दिखाई देगा); यदि हां, तो गिल्स के जवाब के 2 के साथ जाएं ।

बी) वैकल्पिक स्क्रीन पर दिखाई देने वाली लाइनें, लेकिन वैकल्पिक स्क्रीन को छोड़ दें और मुख्य स्क्रीन पर लाइनों को प्रिंट करें यदि स्क्रॉल अनावश्यक हो जाता है (तो स्क्रॉलिंग की आवश्यकता होने पर आपके स्क्रॉलबैक में कोई आउटपुट नहीं दिखाई देगा); यदि हां, तो नीचे दी गई स्क्रिप्ट का उपयोग करें:

यह 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

संभव एन्हांसमेंट के लिए, इस स्क्रिप्ट का मेरा थोड़ा और अधिक fleshed संस्करण भी देखें: https://github.com/johnmellor/scripts/blob/master/bin/least


3

lessस्रोत कोड में -F विकल्प के व्यवहार को संशोधित करके रेड हैट-आधारित डिस्ट्रोस में इसे लंबे समय से हल किया गया है : फेडोरा प्रोजेक्ट से इस पैच को देखें , जिसका पहला संस्करण 2008 से शुरू होता है। विचार बस ऊंचाई पाने के लिए है। टर्मिनल (यानी एक बार में प्रदर्शित की जा सकने वाली अधिकतम पंक्तियाँ) और जब एक स्क्रीन में फ़ाइल फिट होती है तो इनिशियलाइज़ेशन और डीइनैस्टिटलाइज़ेशन सीक्वेंस को छोड़ना पड़ता है। इस प्रकार, -X विकल्प और -F के लिए कोई ज़रूरत नहीं है जो फ़ाइल की लंबाई का लगातार उपयोग किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.