কম --quit-if-one-স্ক্রিন --no-init ছাড়াই


31

আমি এমন টার্মিনালে আছি যা বিকল্প স্ক্রিনকে সমর্থন করে যা প্রস্থান করার পরে পূর্ববর্তী প্রদর্শনটি পুনরুদ্ধার করতে কম, ভিম ইত্যাদি ব্যবহার করে। যে একটি চমৎকার বৈশিষ্ট্য, কিন্তু এটা সত্যিই ভঙ্গ --quit-if-one-screenএর সুইচ lessযে ক্ষেত্রে কম যেহেতু বিকল্প পর্দায় পরিবর্তন, প্রদর্শন, তার ডেটা পরিসংখ্যান শুধুমাত্র একটি পর্দা আছে আউট করে প্রস্থান করে তার সাথে বিকল্প স্ক্রীনের সামগ্রীগুলি গ্রহণ।

সাধারণভাবে প্রস্তাবিত ওয়ার্কআরাউন্ড --no-initবিকল্প পর্দা পুরোপুরি ব্যবহার এড়াতে স্যুইচটি ব্যবহার করছে। তবে এটি কিছুটা কুৎসিত কারণ আমি যদি এটির তুলনায় কম পেজার হিসাবে কাজ করি তবে এটি ব্যবহার করতে চাই। অতএব আমি বিকল্প স্ক্রিনটি কেবলমাত্র যদি কম স্বয়ংক্রিয়ভাবে শেষ না হয় তবে এটি ব্যবহার করার সমাধান খুঁজছি।

আমি এটি বেশিরভাগই গিটের পেজার হিসাবে ব্যবহার করব, সুতরাং একটি আড়ম্বর শেল স্ক্রিপ্ট যা যথেষ্ট পরিমাণে আউটপুট থাকার ক্ষেত্রে কেবল কম চালায় তাও ঠিক আছে। এটি ছাড়া কোনও উপায় না থাকলে কমপক্ষে।


এই ক্ষেত্রে আপনি কীভাবে বিকল্প স্ক্রিনটি সংজ্ঞায়িত করবেন? আমি কিছু ট্যাগ পরিষ্কার করার চেষ্টা করি এবং আমি এখানে সত্যিই অর্থ পাই না
কিউই

উত্তর:


14

যেহেতু 530 কম (ডিসেম্বর 2017 এ প্রকাশিত হয়েছে), less --quit-if-one-screenএকের চেয়ে কম স্ক্রিনফুল পড়লে বিকল্প স্ক্রিনে স্যুইচ হয় না। সুতরাং আপনার কম সংস্করণটি সাম্প্রতিক হলে আপনার সমস্যা হবে না this

পূর্ববর্তী সংস্করণগুলিতে, বিকল্প স্ক্রিনটি শুরু হওয়ার পরে ব্যবহার করবেন কিনা তা কম সিদ্ধান্ত নিতে হবে। আপনি যে পছন্দটি স্থগিত করবেন তার সাথে স্থগিত করতে পারবেন না।

আপনি কম কল করতে পারেন, এটি বিকল্প স্ক্রিনটি ব্যবহার করতে দিন এবং যদি কম স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় তবে প্রাথমিক স্ক্রিনে সামগ্রীটি বিড়াল করুন। তবে আমি স্বয়ংক্রিয় সমাপ্তি সনাক্ত করার কোনও উপায় জানি না।

অন্যদিকে, সংক্ষিপ্ত ইনপুটগুলির জন্য বিড়ালকে কল করা এবং বৃহত ইনপুটগুলির জন্য কম কল করা এতটা কঠিন নয়, এমনকি বাফারিং সংরক্ষণ করাও যাতে কম পরিমাণে স্টাফ দেখা শুরু করতে আপনাকে পুরো ইনপুটটির জন্য অপেক্ষা করতে না হয় (বাফার হতে পারে কিছুটা বড় - আপনি কমপক্ষে একটি স্ক্রিনফুল ডেটা না পাওয়া পর্যন্ত আপনি কিছুই দেখতে পাবেন না - তবে বেশি কিছু নয়)।

#!/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
"বিকল্প স্ক্রিনটি শুরু হওয়ার পরে ব্যবহার করা হবে কিনা তা কম সিদ্ধান্ত নিতে হবে it এটি শেষ হয়ে গেলে আপনি সেই পছন্দটি স্থগিত করতে পারবেন না।" - যদিও এটি দৃশ্যত এটি করে না, তবে এক্স লাইন না পাওয়া পর্যন্ত এটি কোনও আউটপুট (যেমন টার্মিনাল ইনিশিয়ালাইজেশন কমান্ড বা প্রকৃত ডেটা) স্থির করতে পারেনি। এক্স <টার্মিনাল_লাইনস এর সময় যদি স্টিডিন ক্লান্ত হয়ে পড়ে তবে স্ট্যান্ডআউট এবং প্রস্থান করার সময় এটি সবকিছু ফেলে দেয়, অন্যথায় এটি বিকল্প স্ক্রিনটি আরম্ভ করবে এবং এটি যা করার কথা তা করবে
চোরমাস্টার

1
আমি আপনার প্রথম কোড উদাহরণটির একটি পরিবর্তিত সংস্করণ ব্যবহার করে শেষ করেছি: gist.github.com/ThiefMaster/8331024 ( it লাইনগুলি যখন গিট-পেজার বলে ডাকা হত এবং আমি মনে করি আপনি বৃদ্ধি বৃদ্ধি ভুলে গেছেন $n)
থিফমাস্টার

@ থিফমাস্টার মতামতের জন্য ধন্যবাদ। মনে রাখবেন যে আপনি #!/bin/bashআপনার স্ক্রিপ্টে রাখবেন যেহেতু আপনি বাশ-নির্দিষ্ট নির্মাণ ব্যবহার করছেন কারণ এটি আপনার স্ক্রিপ্ট যেখানে সিস্টেমে /bin/shবাশ নয় এমন সিস্টেমে (যেমন উবুন্টু) কাজ করবে না ।
গিলস

3
আমি এই ধারণাটি সত্যিই পছন্দ করেছি এবং এটি আরও কিছুটা বিকাশ করেছি (আরও বৈশিষ্ট্য সহ): github.com/stefanheule/smartless
স্টিফান

1
@ থিফমাস্টার: আন-ইন স্ট্রিং প্রেরণের পরেless স্ক্রিনের বর্তমান বিষয়বস্তুগুলি মুদ্রণ করে এমনটি বন্ধ করার একটি বিকল্প উপায়ও (তবে তা নয়) থাকতে পারে । সুতরাং আপনি বিকল্প স্ক্রিনটি স্ক্রোলব্যাকটি নাড়তে না পারার সুবিধা পেতে পারেন তবে ম্যান-পৃষ্ঠার প্রাসঙ্গিক অংশটি বা টার্মিনালে যা প্রস্থান করার পরে ছেড়ে যান।
পিটার কর্ডস

9

জিএনইউ কম কম v। 530 ফেডোরা-প্যাচটি @ পল-এন্টোইন-অ্যারা দ্বারা উল্লিখিত অন্তর্ভুক্ত করেছে --quit-if-one-screenএবং ব্যবহারের পরে টার্মিনাল আরম্ভের ক্রমটি আউটপুট দেয় না এবং ইনপুটটি একটি স্ক্রিনে ফিট করে।


4
ম্যাক ওএসের হোমব্রু ব্যবহারকারীরা দৌড়ঝাঁপ করে তাড়াতাড়ি এই আচরণটি পেতে পারে brew install lessএবং $LESSএফ নিশ্চিত করে এবং এক্সকে বাদ দেয়
রায়ান প্যাটারসন

এটি আমার প্রিয় উত্তর। আমি সঙ্গে সঙ্গে জিএনইউ থেকে কম 5.3.0 ডাউনলোড করেছি এবং এটি নিজেই সংকলন করেছি। দুর্দান্ত ইঙ্গিত!
iBug

5

ধীর ইনপুটগুলির জন্য git log -Gregex, আপনি কি চান:

ক) লাইনগুলি আসার সাথে সাথে মূল স্ক্রিনে উপস্থিত হওয়ার জন্য, একবার স্ক্রোলিংয়ের প্রয়োজন হলে বিকল্প স্ক্রিনে স্যুইচ করুন (যাতে $LINESআউটপুট প্রথম সর্বদা আপনার স্ক্রোলব্যাকে প্রদর্শিত হবে); যদি তা হয় তবে গিলসের ২ য় উত্তর নিয়ে যান

খ) বিকল্প স্ক্রিনে উপস্থিত হওয়ার জন্য লাইনগুলি, তবে বিকল্প স্ক্রীনটি ছেড়ে দিন এবং স্ক্রোলিং অপ্রয়োজনীয় হয়ে উঠলে লাইনগুলি মুখ্য স্ক্রিনে মুদ্রণ করুন (যাতে স্ক্রোলিংয়ের প্রয়োজন হলে কোনও আউটপুট আপনার স্ক্রোলব্যাকে প্রদর্শিত হবে না); যদি তা হয় তবে নীচের স্ক্রিপ্টটি ব্যবহার করুন:

এটি 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/scriptts/blob/master/bin/least


3

এটি lessসোর্স কোড -F বিকল্পের আচরণটি পরিবর্তন করে রেড হ্যাট-ভিত্তিক ডিস্ট্রোজে দীর্ঘকাল সমাধান করা হয়েছে : ফেডোরা প্রকল্পের এই প্যাচটি দেখুন , যার প্রথম সংস্করণটি ২০০৮ সাল থেকে এসেছে The ধারণাটি কেবল উচ্চতা পাওয়ার জন্য টার্মিনাল (অর্থাত্‍ একবারে প্রদর্শিত হতে পারে এমন সর্বাধিক সংখ্যক লাইন) এবং যখন ফাইলটি একটি স্ক্রিনে ফিট হয় তখন আরম্ভ এবং ডিনিটালাইজেশন ক্রমগুলি বাদ দিতে। সুতরাং, -X বিকল্পের প্রয়োজন নেই এবং -F ফাইলের দৈর্ঘ্য যাই হোক না কেন ধারাবাহিকভাবে ব্যবহার করা যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.