मैं शेल कमांड के माध्यम से टर्मिनल में स्क्रॉलबैक कैसे रीसेट करूं?


41

Terminal.app का उपयोग करते समय, आप शेल बिलिन का उपयोग करके clearया ^+ L(नियंत्रण-एल) दबाकर स्क्रीन को साफ कर सकते हैं ।

हालांकि, यह सब वर्तमान स्क्रीन सामग्री को एक स्क्रीन ऊंचाई पर वापस धकेल देता है और पहली पंक्ति में कर्सर / इनपुट को रीसेट करता है। मतलब आप अभी भी वापस स्क्रॉल कर देख सकते हैं।

आप जो करने में सक्षम हैं, वह + K(कमांड-के) दबाकर अपने पूरे स्क्रॉलबैक को रीसेट कर देता है ।

ऐसा करने के बाद, आप वापस स्क्रॉल नहीं कर सकते।

कुछ स्थितियों में (विशेष रूप से, चलने से पहले screenया vim), मैं वास्तव में कमांड निष्पादित होने से पहले वापस स्क्रॉल को रीसेट करना चाहूंगा।

क्या कोई आदेश (जैसे clear) है जो ओएस एक्स में लागू किया गया है जो मुझे ऐसा करने की अनुमति देता है? के अस्तित्व को देखते हुए pbcopyऔर pbpaste, मैं सोच रहा हूं कि कुछ ऐसा ही हो सकता है जो मुझे ऐसा करने की अनुमति देगा।


जैसा कि क्रिस पेज का जवाब टर्मिनल उपयोग कमांड में कहता है: clear && printf '\e[3J' (आपने गलत उत्तर को सही उत्तर के रूप में चुना है!)
साइबोर्ग

जवाबों:


57

टर्मिनल स्क्रॉल-बैक को मिटाने के लिए ED (Erase in Display) एस्केप सीक्वेंस के विस्तार का समर्थन करता है। यह भी xterm द्वारा समर्थित है। VT100 मैनुअल में वर्णित ED कमांड, Ps पैरामीटर के लिए इन मानों को स्वीकार करता है:

ईएससी [पीएस जे

पैरामीटर पैरामीटर अर्थ

0 सक्रिय स्थिति से स्क्रीन के अंत तक मिटा दें
1 स्क्रीन की शुरुआत से सक्रिय स्थिति तक मिटाएं
2 सभी डिस्प्ले को मिटा दें

टर्मिनल ( और xterm ) कहते हैं:

3 स्क्रॉल-बैक (उर्फ "सेव्ड लाइन्स") मिटाएं

ध्यान दें कि यह केवल स्क्रॉल-बैक मिटाता है, स्क्रीन नहीं। यह आपको एक या दूसरे को मिटाने की अनुमति देता है, या दो भागने के क्रम भेजकर।

उदाहरण के लिए, आप स्क्रीन और स्क्रॉल-बैक को निम्नलिखित शेल कमांड से साफ़ कर सकते हैं: clear && printf '\e[3J'

( clearकमांड वर्तमान टर्मिनल के लिए स्क्रीन को साफ़ करने के लिए उपयुक्त अनुक्रम को देखता है, लेकिन "स्क्रॉल-बैक मिटाएं" एस्केप अनुक्रम कस्टम है और इसे हार्ड-कोडित किया जाना चाहिए। यदि आप इसे शेल स्क्रिप्ट में रखते हैं जो आपको नहीं पता है। कुछ के लिए केवल टर्मिनल के साथ चलाया जाएगा, आपको यह जांचना चाहिए कि इसे भेजने $TERM_PROGRAMसे Apple_Terminalपहले।)


4
यह ऑसस्क्रिप्ट से बहुत तेज है!
सर्गेई

3
यह एक बेहतर जवाब है। तो, इस स्थायी बनाने के लिए, अपने ~ / .bash_profile में जोड़ें: alias clear="clear && printf '\e[3J'"
टॉम

1
मैंने इस पटकथा को अपने PATH:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
वाकर हेल IV

2
@WalkerHaleIV स्टडआउट के लिए भागने के क्रम को प्रिंट करने के बजाय आप एक निष्पादन योग्य क्यों बना रहे हैं?
क्रिस पेज

1
$ TERM_APPLICATION $ 19 पर TERM_PROGRAM
pbatey

30

⌘K, शॉर्टकट "देखें> स्पष्ट स्क्रॉलबैक"।

अद्यतन : यह निम्नलिखित आदेश द्वारा AppleScript के साथ स्वचालित किया जा सकता है:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

... जो आप aliasअपने ~/.profileमनचाहे लिपि में एक फंक्शन में स्टोर कर सकते हैं।

एक सुरक्षा के रूप में, एक गलत फ्रंट ऐप के लिए कीस्ट्रोक जारी करने के लिए जोखिम के बिना पृष्ठभूमि में भी इसका उपयोग करने में सक्षम होने के लिए, मैं निम्नलिखित परीक्षण के साथ इसके आसपास की सलाह दूंगा:

if application "Terminal" is frontmost

… जो हमें निम्नलिखित कोड देता है:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

... जो बदल जाता है, ठीक से बच गया और aliasएड में समाप्त होता है:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

और यहाँ आपका नया है clear! :)


यहाँ बिंदु यह है कि मैं अपने शेल के वातावरण में कुछ स्थापित करना चाहूंगा, ताकि जब मैं एक कमांड (कहूं vim) चलाऊं, तो शेल वीम को निष्पादित करने से पहले "स्क्रॉलबैक रीसेट" निष्पादित करता है। प्रोग्रामेटिक, इंटरएक्टिव नहीं।
जेसन Salaz

1
@JasonSalaz ठीक है, वह नहीं मिला, क्षमा करें। उसके लिए कोड जोड़ा गया।
MattiSG

1
@ जैसनसलाज अगर इस जवाब ने आपकी समस्या को हल कर दिया, तो कृपया इसे मान्य करना याद रखें। यदि ऐसा नहीं होता है, तो कृपया हमें टिप्पणियों में वापस मिलें :) याद रखें, भविष्य के उपयोगकर्ता आपको धन्यवाद देंगे;)
MattiSG

वह कॉमिक मेरे बारे में है, आप जानते हैं। मैं डेनवर, कंपनी में कार्यक्रम करता हूं। (नहीं, वास्तव में नहीं, यह पागल होगा अगर यह था, हालांकि।)
जेसन सलज

यह मेरे लिए काम नहीं करता है। जहाँ तक मैं बता सकता हूँ, यह टाइपिंग के बराबर है clear; यही है, यह स्क्रीन को साफ करता है, लेकिन मैं अभी भी वापस स्क्रॉल कर सकता हूं। हिटिंग Command Kसामान्य रूप से काम करता है।
ज़ेव ईसेनबर्ग

7

यहाँ वह कोड है जो macOS 'टर्मिनल और iTerm2 दोनों के लिए काम करता है। यह खिड़की को अग्रभूमि में होने की आवश्यकता नहीं है, या तो।

printf '\033[2J\033[3J\033[1;1H'

यह काम किस प्रकार करता है

यह 3 एएनएसआई एस्केप सीक्वेंस की एक रचना है , विशेष रूप से "कंट्रोल सीक्वेंस इंट्रोड्यूसर" कमांड

\033एक भागने का क्रम है जो उस वर्ण के लिए कोड बिंदु को हार्डकोड करता है जो उसका प्रतिनिधित्व करता है। अग्रणी 0इंगित करता है कि शेष अनुक्रम एक अष्टातीय मान को कूटबद्ध करता है, इस मामले में, 33अष्टाधारी में। उस का दशमलव मान 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27) है। ASCII में, कोड बिंदु 27"ESC" (बच) वर्ण है।

CSIकमांड के साथ शुरू होता है ESC [, उर्फ \033[। इसे जानकर हम स्ट्रिंग को इसके 3 भागों में विभाजित कर सकते हैं।

  1. CSI 2 J
    • यह "ED - Erase in Display" कमांड का एक उदाहरण है, जिसका स्वरूप है CSI n J
    • nमान पर सेट है 2इस मामले है, जो दूसरे संस्करण का आह्वान में: "यदि n 2, स्पष्ट पूरे स्क्रीन है (और चाल ऊपरी डॉस ANSI.SYS पर छोड़ दिया करने के लिए कर्सर)।"
  2. CSI 3 J:
    • यह "ED - Erase in Display" कमांड का एक उदाहरण है, जिसका स्वरूप है CSI n J
    • nमान पर सेट है 3इस मामले में, जो तीसरे संस्करण का आह्वान में: "यदि n 3, स्पष्ट पूरे स्क्रीन है और (इस सुविधा टर्म के लिए जोड़ा गया था और दूसरे टर्मिनल अनुप्रयोगों के द्वारा समर्थित है) स्क्रॉल बैक बफर में सहेजी गई सभी पंक्तियों को हटा दें।"
  3. CSI 1 ; 1 H:
    • यह "ED - Erase in Display" कमांड का एक उदाहरण है, जिसका स्वरूप है CSI n ; m H

      कर्सर को पंक्ति n, स्तंभ पर ले जाता है m। मान 1-आधारित हैं, और यदि छोड़ा गया है तो डिफ़ॉल्ट 1 (ऊपरी बाएँ कोने)। एक अनुक्रम जैसे कि CSI ;5Hएक पर्याय के CSI 1;5Hरूप में के रूप में अच्छी तरह से CSI 17;HCSI 17H और के रूप में ही हैCSI 17;1H

    • nऔर mमूल्यों के दोनों सेट कर रहे हैं 1, जो इस आदेश चाल शीर्ष वाम-पंथी कोने में कर्सर का मतलब है।

क्या मैं आपसे पूछ सकता हूं कि आपको यह कहां से मिला? मेरे से +1 - यह वैसे भी काम करता है
rbrtl

1
मुझे याद नहीं है, लेकिन यह इनकी एक रचना है: en.wikipedia.org/wiki/ANSI_escape_code
अलेक्जेंडर - मोनिका

1
ऐसा लगता है कि यह " CSI n J" (जहाँ n = 2) + " CSI n J(जहाँ n = 3) +" CSI n ; m H"(जहाँ n, m = 1, 1) है, जो इसका अनुवाद करता है:" ED - Erase in Display "(संस्करण 2), "ED - डिस्प्ले में मिटाएँ" (संस्करण 3), "CUP - कर्सर की स्थिति" (1, 1 तक चलती है)
अलेक्जेंडर - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.