Làm cách nào để đặt lại cuộn trong thiết bị đầu cuối thông qua lệnh shell?


41

Khi sử dụng Terminal.app, bạn có thể xóa màn hình bằng cách sử dụng shell dựng sẵn clearhoặc nhấn ^+ L(Control-L).

Tuy nhiên, tất cả những điều này là đẩy nội dung màn hình hiện tại trở lại một chiều cao màn hình và đặt lại con trỏ / đầu vào ở dòng đầu tiên. Có nghĩa là bạn vẫn có thể cuộn lại và xem nó.

Những gì bạn cũng có thể làm, là đặt lại toàn bộ cuộn lại của bạn bằng cách nhấn + K(Command-K).

Sau khi thực hiện xong, bạn không thể cuộn lại.

Trong một số trường hợp nhất định (đáng chú ý là trước khi chạy screenhoặc vim), tôi muốn đặt lại cuộn trước khi lệnh thực sự thực thi.

Có một lệnh (như clear) được triển khai trong OS X cho phép tôi làm điều này không? Với sự tồn tại của pbcopypbpaste, tôi nghĩ một cái gì đó tương tự có thể tồn tại sẽ cho phép tôi làm điều này.


Như câu trả lời của Chris Pages nói trong lệnh sử dụng Terminal: clear && printf '\e[3J' (Bạn đã chọn câu trả lời sai là câu trả lời đúng!)
Cyborg

Câu trả lời:


57

Terminal hỗ trợ một phần mở rộng của chuỗi thoát ED (Erase in Display) để xóa cuộn ngược lại. Nó cũng được hỗ trợ bởi xterm. Lệnh ED, được mô tả trong hướng dẫn VT100 , chấp nhận các giá trị này cho tham số Ps:

ESC [Ps

Thông số Ý nghĩa Thông số

0 Xóa từ vị trí hoạt động đến cuối màn hình
1 Xóa từ đầu màn hình đến vị trí hoạt động
2 Xóa tất cả màn hình

Terminal ( và xterm ) cho biết thêm:

3 Xóa cuộn lại (hay còn gọi là Dòng đã lưu

Lưu ý rằng điều này chỉ xóa trở lại cuộn, không phải màn hình. Điều này cho phép bạn xóa cái này hoặc cái kia hoặc cả hai bằng cách gửi hai chuỗi thoát.

Ví dụ: bạn có thể xóa màn hình và cuộn lại bằng lệnh shell sau: clear && printf '\e[3J'

( clearLệnh tìm kiếm trình tự thích hợp để xóa màn hình cho thiết bị đầu cuối hiện tại, nhưng trình tự thoát ra khỏi cuộn xóa xóa xóa xóa là tùy chỉnh và phải được mã hóa cứng. Nếu bạn đặt mã này trong tập lệnh shell mà bạn không biết vì chắc chắn sẽ chỉ được chạy với Terminal, bạn nên kiểm tra xem đó $TERM_PROGRAMApple_Terminaltrước khi gửi nó.)


4
Điều này nhanh hơn rất nhiều so với osascript!
Sergei

3
Đây là một câu trả lời tốt hơn nhiều. Vì vậy, để làm cho điều này vĩnh viễn, hãy thêm vào ~ / .bash_profile của bạn: alias clear="clear && printf '\e[3J'"
Tom

1
Tôi đặt kịch bản này vào ĐƯỜNG của tôi:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV

2
@WalkerHaleIV Tại sao bạn tạo một tệp thực thi thay vì chỉ in chuỗi thoát ra thiết bị xuất chuẩn?
Chris Trang

1
$ TERM_APPLICATION phải là $ TERM_PROGRAM
pbatey

30

⌘K, lối tắt đến Chế độ xem> Xóa cuộn lại.

CẬP NHẬT : Điều này có thể được tự động hóa với AppleScript bằng lệnh sau:

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

Tất nhiên là bạn có thể aliaslàm bất cứ điều gì bạn muốn hoặc lưu trữ một chức năng trong ~/.profiletập lệnh đăng nhập của bạn :)

Tuy nhiên, để bảo mật, để có thể sử dụng điều này ngay cả trong nền mà không gặp rủi ro khi đưa ra một tổ hợp phím cho một ứng dụng phía trước sai, tôi khuyên bạn nên kiểm tra xung quanh nó bằng thử nghiệm sau:

if application "Terminal" is frontmost

Cung cấp cho chúng tôi đoạn mã sau:

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

Lần lượt, thoát đúng và aliased, kết thúc bằng:

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

Và đây là cái mới của bạn clear! :)


Vấn đề ở đây là tôi muốn thiết lập một cái gì đó trong môi trường shell của mình để khi tôi chạy một lệnh (giả sử vim), shell sẽ thực thi "thiết lập lại cuộn" trước khi thực hiện vim. Có lập trình, không tương tác.
Jason Salaz

1
@JasonSalaz Ok, xin lỗi, xin lỗi. Đã thêm mã cho điều đó.
MattiSG

1
@JasonSalaz nếu câu trả lời này đã giải quyết vấn đề của bạn, hãy nhớ xác thực nó. Nếu không, vui lòng liên hệ lại với chúng tôi trong phần bình luận :) Hãy nhớ rằng, người dùng từ tương lai sẽ cảm ơn bạn;)
MattiSG

Truyện tranh đó là về tôi, bạn biết đấy. Tôi làm chương trình ở Denver, CO. (Không, không thực sự, nó sẽ điên rồ nếu nó là, mặc dù vậy.)
Jason Salaz

Điều này không làm việc cho tôi. Theo như tôi có thể nói, nó tương đương với việc gõ clear; nghĩa là, nó sẽ xóa màn hình, nhưng tôi vẫn có thể cuộn lại. Đánh Command Khoạt động bình thường.
Zev Eisenberg

7

Đây là mã hoạt động cho cả Terminal của macOS và iTerm2. Nó cũng không cần cửa sổ ở phía trước.

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

Làm thế nào nó hoạt động

Đây là một thành phần của 3 chuỗi thoát ANSI , đặc biệt là các lệnh "Trình tự giới thiệu trình tự điều khiển" .

\033là một chuỗi thoát giúp mã hóa điểm mã cho ký tự mà nó đại diện. Phần đầu 0chỉ ra rằng phần còn lại của chuỗi mã hóa một giá trị bát phân, trong trường hợp này là 33bằng số bát phân. Giá trị thập phân của đó là 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). Trong ASCII, điểm mã 27là ký tự "ESC" (thoát).

CSIlệnh bắt đầu bằng ESC [, aka \033[. Biết được điều này, chúng ta có thể chia chuỗi thành 3 phần.

  1. CSI 2 J
    • Đây là một ví dụ của lệnh "ED - Erase in Display", có dạng CSI n J
    • Các ngiá trị được đặt 2trong trường hợp này, đó gọi là biến thể thứ hai: "Nếu n là 2, toàn bộ màn hình rõ ràng (và di chuyển con trỏ đến phía trên còn lại trên hệ điều hành DOS ANSI.SYS)."
  2. CSI 3 J:
    • Đây là một ví dụ của lệnh "ED - Erase in Display", có dạng CSI n J
    • Các ngiá trị được đặt 3trong trường hợp này, đó gọi là biến thể thứ ba: "Nếu n là 3, toàn bộ màn hình rõ ràng và xóa tất cả các dòng lưu trong bộ đệm scrollback (tính năng này đã được bổ sung cho xterm và được hỗ trợ bởi các ứng dụng thiết bị đầu cuối khác)."
  3. CSI 1 ; 1 H:
    • Đây là một ví dụ của lệnh "ED - Erase in Display", có dạng CSI n ; m H

      Di chuyển con trỏ đến hàng n, cột m. Các giá trị dựa trên 1 và mặc định là 1 (góc trên cùng bên trái) nếu bị bỏ qua. Một chuỗi như CSI ;5Hlà một từ đồng nghĩa CSI 1;5Hcũng như CSI 17;Hgiống như CSI 17H vàCSI 17;1H

    • Cả hai nmcác giá trị đều được đặt thành 1, có nghĩa là lệnh này di chuyển con trỏ đến góc trên cùng bên trái.

Tôi có thể hỏi bạn nơi bạn đã nhận nó từ đâu? +1 từ tôi - dù sao nó cũng hoạt động
rbrtl

1
Tôi không nhớ, nhưng đó là một thành phần của những điều này: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Tái lập Monica

1
Có vẻ như đó là " CSI n J" (trong đó n = 2) + " CSI n J" (trong đó n = 3) + " CSI n ; m H" (trong đó n, m = 1, 1), có nghĩa là: "ED - Erase in Display" (biến thể 2), "ED - Xóa trong hiển thị" (biến thể 3), "CUP - Vị trí con trỏ" (chuyển sang 1, 1)
Alexander - Tái lập Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.