ฉันจะรีเซ็ต scrollback ในเทอร์มินัลผ่านคำสั่งเชลล์ได้อย่างไร


41

เมื่อใช้ Terminal.app คุณสามารถล้างหน้าจอโดยใช้เชลล์บิวด์อินclearหรือกด^+ L(Control-L)

อย่างไรก็ตามทั้งหมดนี้คือการผลักเนื้อหาของหน้าจอปัจจุบันกลับเป็นความสูงหนึ่งหน้าจอและรีเซ็ตเคอร์เซอร์ / อินพุตที่บรรทัดแรก หมายความว่าคุณยังสามารถเลื่อนดูได้

สิ่งที่คุณสามารถทำได้คือรีเซ็ต scrollback ทั้งหมดของคุณโดยกด+ K(Command-K)

หลังจากคุณทำสิ่งนี้แล้วคุณจะไม่สามารถเลื่อนกลับไปได้เลย

ในบางสถานการณ์ (โดยเฉพาะอย่างยิ่งก่อนที่จะรันscreenหรือvim) ฉันต้องการรีเซ็ตการเลื่อนกลับก่อนที่คำสั่งจะทำงานจริง

มีคำสั่ง (เช่นclear) ที่ใช้ใน OS X ที่ให้ฉันทำสิ่งนี้หรือไม่? เมื่อพิจารณาถึงการมีอยู่ของpbcopyและpbpasteฉันคิดว่าสิ่งที่คล้ายกันอาจมีอยู่ที่จะทำให้ฉันทำเช่นนี้


ดังคำตอบของ Chris Pages ที่บอกไว้ในคำสั่งการใช้ Terminal: clear && printf '\e[3J' (คุณได้เลือกคำตอบที่ผิดเป็นคำตอบที่ถูกต้อง!)
Cyborg

คำตอบ:


57

เทอร์มินัลรองรับส่วนขยายของลำดับหลบหลีก (ลบในจอแสดงผล) เพื่อลบการเลื่อนกลับ นอกจากนี้ยังรองรับโดย xterm คำสั่ง ED ซึ่งอธิบายไว้ในคู่มือ VT100ยอมรับค่าเหล่านี้สำหรับพารามิเตอร์ Ps:

ESC [Ps J

พารามิเตอร์ความหมายพารามิเตอร์

0 ลบจากตำแหน่งที่แอ็คทีฟจนถึงจุดสิ้นสุดของหน้าจอ
1 ลบจากจุดเริ่มต้นของหน้าจอไปยังตำแหน่งที่ใช้งานอยู่
2 ลบจอแสดงผลทั้งหมด

เทอร์มินัล ( และ xterm ) เพิ่ม:

3 ลบ scroll-back (aka“ Saved Lines”)

โปรดทราบว่าสิ่งนี้จะลบการเลื่อนกลับไม่ใช่หน้าจอ วิธีนี้ช่วยให้คุณสามารถลบอย่างใดอย่างหนึ่งหรืออื่น ๆ หรือทั้งสองโดยการส่งสองลำดับหนี

ตัวอย่างเช่นคุณสามารถล้างหน้าจอและการเลื่อนกลับด้วยคำสั่งเชลล์ต่อไปนี้: clear && printf '\e[3J'

( clearคำสั่งค้นหาลำดับที่เหมาะสมสำหรับการล้างหน้าจอสำหรับเทอร์มินัลปัจจุบัน แต่ลำดับการหลบหนี“ ลบแบบเลื่อนกลับ” เป็นแบบกำหนดเองและต้องเขียนรหัสแบบยากหากคุณใส่สิ่งนี้ลงในเชลล์สคริปต์ที่คุณไม่รู้ สำหรับบางจะเคยได้รับการทำงานกับเทอร์มิคุณควรตรวจสอบว่า$TERM_PROGRAMเป็นApple_Terminalก่อนที่จะส่งมัน.)


4
นี่เร็วกว่า osascript มาก ๆ !
Sergei

3
นี่เป็นคำตอบที่ดีกว่ามาก ดังนั้นในการทำให้เป็นแบบถาวรให้เพิ่ม ~ / .bash_profile ของคุณ: alias clear="clear && printf '\e[3J'"
Tom

1
ฉันวางสคริปต์นี้ไว้ใน PATH:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV

2
@WalkerHaleIV เหตุใดคุณจึงสร้างไฟล์ที่เรียกใช้งานได้แทนที่จะพิมพ์เพียงแค่ลำดับหนีภัยไปยัง stdout?
Chris Page

1
$ TERM_APPLICATION ควรเป็น $ 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) เชลล์ดำเนินการ "scrollback รีเซ็ต" ก่อนดำเนินการเป็นกลุ่ม แบบเป็นโปรแกรมไม่ใช่แบบโต้ตอบ
Jason Salaz

1
@JasonSalaz ตกลงไม่เข้าใจเลยขอโทษ เพิ่มรหัสแล้ว
MattiSG

1
@ JasonSalaz หากคำตอบนี้ช่วยแก้ปัญหาของคุณได้โปรดอย่าลืมตรวจสอบความถูกต้อง หากไม่เป็นเช่นนั้นโปรดกลับมาให้เราในความคิดเห็น :) โปรดจำไว้ว่าผู้ใช้จากอนาคตจะขอบคุณ;)
MattiSG

การ์ตูนเรื่องนั้นเกี่ยวกับฉันคุณรู้ไหม ฉันทำโปรแกรมในเดนเวอร์, โคโลราโด (ไม่, ไม่จริง, มันจะบ้าถ้าเป็น,)
Jason Salaz

สิ่งนี้ไม่ได้ผลสำหรับฉัน เท่าที่ฉันสามารถบอกได้มันเท่ากับการพิมพ์clear; นั่นคือมันล้างหน้าจอ แต่ฉันยังสามารถเลื่อนกลับ การกดปุ่มCommand Kทำงานได้ตามปกติ
Zev Eisenberg

7

นี่คือโค้ดที่ใช้งานได้กับทั้ง MacOS 'Terminal และ iTerm2 ไม่ต้องการให้หน้าต่างอยู่ในเบื้องหน้า

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

มันทำงานอย่างไร

นี่คือองค์ประกอบของ 3 ลำดับหนี ANSIโดยเฉพาะอย่างยิ่ง"การควบคุมลำดับผู้แนะนำ" คำสั่ง

\033เป็นลำดับ escape ที่เข้ารหัสโค้ดจุดสำหรับอักขระที่แทน ส่วน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 หน้าจอทั้งหมดที่ชัดเจน (และเลื่อนเคอร์เซอร์ไปทางซ้ายบนของ DOS ANSI.SYS)."
  2. CSI 3 J:
    • นี่เป็นตัวอย่างของคำสั่ง "ED - Erase in Display" ซึ่งมีรูปแบบ CSI n J
    • nถูกตั้งค่าการ3ในกรณีนี้ซึ่งเรียกตัวแปรที่สาม: "ถ้า n เป็น 3 ทั้งหน้าจอที่ชัดเจนและลบบรรทัดทั้งหมดที่บันทึกไว้ในบัฟเฟอร์ scrollback นี้ (คุณลักษณะนี้ถูกเพิ่มเข้ามาสำหรับ xterm และได้รับการสนับสนุนโดยการใช้งานสถานีอื่น ๆ )."
  3. CSI 1 ; 1 H:
    • นี่เป็นตัวอย่างของคำสั่ง "ED - Erase in Display" ซึ่งมีรูปแบบ CSI n ; m H

      เลื่อนเคอร์เซอร์ไปยังแถวคอลัมน์n mค่าเป็นแบบอิง 1 และค่าดีฟอลต์คือ 1 (มุมซ้ายบน) หากไม่ใส่ค่า ลำดับเช่นเป็นCSI ;5HคำCSI 1;5Hเหมือนเช่นCSI 17;Hเดียวกับ CSI 17H และCSI 17;1H

    • nและmค่าเป็นชุดทั้งสอง1ซึ่งหมายความว่าคำสั่งนี้ย้ายเคอร์เซอร์ไปยังด้านบนซ้ายสุดมุม

ฉันขอถามคุณได้จากที่ใด +1 จากฉัน - ใช้งานได้
rbrtl

1
ฉันจำไม่ได้ แต่มันเป็นองค์ประกอบของสิ่งเหล่านี้: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica

1
ดูเหมือนว่า " CSI n J" (โดยที่ n = 2) + " CSI n J" (โดยที่ n = 3) + " CSI n ; m H" (โดยที่ n, m = 1, 1) ซึ่งแปลเป็น: "ED - ลบในจอแสดงผล" (ตัวแปร 2) "ED - ลบในจอแสดงผล" (ตัวแปร 3), "CUP - ตำแหน่งเคอร์เซอร์" (เลื่อนไปที่ 1, 1)
Alexander - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.