Chính xác thì cuộn cuộn và cuộn đệm là gì?


23

"Scrollback" và "đệm scrollback" trong các chương trình như là gì bashscreen, và làm thế nào để chúng liên quan đến các tty, các chương trình được chạy, và stdin / stdout / stderr?

Đây là định nghĩa duy nhất về "cuộn ngược" mà tôi tìm thấy cho đến nay (trong wiki archlinux ):

Scrollback là một chức năng được triển khai trong bảng điều khiển văn bản để cho phép người dùng quay lại để xem các dòng văn bản đã cuộn khỏi màn hình. Điều này được thực hiện bởi một bộ đệm được tạo ra chỉ cho mục đích này giữa bộ điều hợp video và thiết bị hiển thị; bộ đệm cuộn lại.

Nhưng, điều này đặt ra nhiều câu hỏi hơn cho tôi:

  • Nó có nghĩa là "chức năng" như trong "chương trình con" hay như trong "tính năng"?
  • Có một tiêu chuẩn Unix hoặc API cho bộ đệm cuộn lại này không?
  • Trong một "ngăn xếp" các chương trình, chẳng hạn như vimđược khởi chạy trong screenkhởi bashchạy được khởi chạy trong sshkhởi chạy trong trình giả lập thiết bị đầu cuối, chương trình nào trong số này đang điều khiển bộ đệm cuộn lại?

Tôi cũng đã sử dụng screenđể kết xuất cuộn lại vào một tập tin . Tệp này có rất nhiều khoảng trắng ở trên cùng và có vẻ như "khung nhìn" trình giả lập thiết bị đầu cuối của tôi cho tôi thấy chỉ đơn giản là một vài dòng dưới cùng của bộ đệm.

  • Đây có phải là lý do tại sao một chương trình như vimcó thể "xóa" toàn bộ cửa sổ đầu cuối của tôi không, vì nó có quyền truy cập tạm thời vào bộ đệm cuộn của trình bao cha mẹ?
  • Hoặc có vimsử dụng bộ đệm cuộn của riêng nó bằng cách nào đó được phủ lên trên bộ đệm cuộn ngược lại không?

Câu trả lời:


28

Đây là một chút của một câu hỏi phức tạp. Tôi sẽ cố gắng trả lời lần lượt các câu hỏi của bạn, nhưng trước tiên là một mô tả chung:

Bộ đệm cuộn được triển khai bởi trình giả lập thiết bị đầu cuối của bạn ( xterm, Konsole, Gnome Terminal). Nó chứa tất cả các văn bản đã được hiển thị trên màn hình, bao gồm cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn từ mọi chương trình bạn chạy trong thiết bị đầu cuối. Đó là chức năng hoàn toàn của thiết bị đầu cuối để cho phép bạn nhìn vào đầu ra trong quá khứ có thể đã cuộn qua bạn hoặc để kiểm tra những gì đã nói trước đó.

Bạn có thể nghĩ về bộ đệm cuộn như một trang dài của đầu ra được ghi và cửa sổ đầu cuối của bạn như một cửa sổ nhìn vào một phần của nó bất cứ lúc nào. Nếu bạn chưa cuộn lên bất kỳ, cái bạn đang nhìn vào là phần đuôi của bộ đệm. Thông thường sẽ có một giới hạn được cấu hình trong thiết bị đầu cuối có bao nhiêu dòng nó theo dõi trước khi nó bắt đầu quên.

Giả sử giới hạn đó là 1000 dòng. Đối với hàng nghìn dòng đầu ra đầu tiên trong phiên của bạn, bạn chỉ cần thêm vào bộ đệm và bạn có thể cuộn lên ngay để bắt đầu phiên của mình. Ngay khi nhận được dòng đầu ra thứ 1001, dòng đầu tiên trong bộ đệm sẽ bị xóa và trở lại xa nhất bạn có thể cuộn sẽ là dòng thứ hai trong phiên của bạn. Bộ đệm sẽ luôn chứa hàng nghìn dòng đầu ra gần đây nhất được hiển thị trên màn hình của bạn và bạn có thể cuộn lên để xem đầu ra trước đó bất cứ lúc nào.

  • Nó có nghĩa là "chức năng" như trong "chương trình con" hay như trong "tính năng"?

    Đây là "chức năng" như trong "tính năng". Trình giả lập thiết bị đầu cuối có chức năng ghi lại những gì trên màn hình và cho phép bạn cuộn lên xuống trong đó. Các bảng điều khiển trên một số hệ thống cũng hỗ trợ cuộn ngược giới hạn.

    Nó phức tạp hơn một chút khi bạn ném screenvào hỗn hợp. Tại thời điểm đó, screenđang mô phỏng chính bộ đệm cuộn - đó là lý do tại sao bạn có thể sao chép và dán từ nó trong chương trình, thay vì chỉ với lựa chọn X (nói).

  • Có một tiêu chuẩn Unix hoặc API cho bộ đệm cuộn lại này không?

    Câu trả lời ngắn gọn là không, nó chỉ được cung cấp bởi thiết bị đầu cuối của bạn. Câu trả lời dài hơn chúng ta sẽ nhận được ở phía dưới.

  • Trong một "ngăn xếp" các chương trình, chẳng hạn như vim được khởi chạy trong màn hình được khởi chạy trong bash được khởi chạy trong ssh được khởi chạy trong trình giả lập thiết bị đầu cuối, những chương trình nào trong số này đang điều khiển bộ đệm cuộn lại?

    Trong trường hợp vimbash, họ hoàn toàn không kiểm soát nó (báo trước, một lần nữa, bên dưới). Thiết bị đầu cuối của bạn cung cấp bộ đệm cuộn lại cho tất cả các chương trình bên trong nó, bắt đầu từ trình bao của bạn. screen, như đã đề cập ở trên, là mô phỏng cuộn chính nó.

  • Tôi cũng đã sử dụng màn hình để kết xuất cuộn lại vào một tập tin. Tệp này có rất nhiều khoảng trắng ở trên cùng và có vẻ như "khung nhìn" trình giả lập thiết bị đầu cuối của tôi cho tôi thấy chỉ đơn giản là một vài dòng dưới cùng của bộ đệm.

    Đây là screenbộ đệm nội bộ. Những gì trên màn hình của bạn tại thời điểm đó thường sẽ là những gì ở dưới cùng của bộ đệm.

  • Đây có phải là lý do tại sao một chương trình như vim có thể "xóa" toàn bộ cửa sổ đầu cuối của tôi không, vì nó có quyền truy cập tạm thời vào bộ đệm cuộn của trình bao cha mẹ?

    Đây là một phần của nơi nó trở nên phức tạp hơn nhiều. Hầu như tất cả các trình giả lập thiết bị đầu cuối dựa trên X đều mô phỏng VT100, và một điều họ làm ở đó là hỗ trợ "Bộ đệm màn hình thay thế" . Không giống như bộ đệm thông thường được sử dụng cho hầu hết các tương tác đầu cuối với đầu ra tuần tự, bộ đệm màn hình thay thế chỉ là kích thước chính xác của thiết bị đầu cuối của bạn. Không có cuộn lên hoặc xuống trong đó vì nó không lớn hơn những gì được hiển thị.

    Ý tưởng là cho phép một ứng dụng toàn màn hình thực hiện những gì nó cần làm mà không bị can thiệp bởi bất cứ điều gì bạn đã có trên màn hình, và sau đó cho phép bạn quay lại chính xác màn hình bạn có trước đó. Đó là lý do tại sao khi bạn nhập vimnó sẽ lấp đầy toàn bộ màn hình, nhưng khi bạn rời khỏi nó thì đầu ra thiết bị đầu cuối bạn đã có trước đó - tất cả các lời nhắc và đầu ra lệnh trong quá khứ của bạn - sẽ quay trở lại. vimchuyển sang bộ đệm màn hình thay thế khi nó khởi động và trở lại bộ đệm bình thường khi nó thoát.

    Bộ đệm thay thế này là một trong những cảnh báo tôi đã đề cập ở trên. Đôi khi, chương trình thực sự có khả năng cho thiết bị đầu cuối biết phải làm gì với bộ đệm.

    screenlà một chương trình khác thực hiện điều này, đó là lý do tại sao chức năng cuộn của thiết bị đầu cuối của bạn thường không hoạt động trong khi bạn đang ở trong một phiên màn hình -  screenmô phỏng chính bộ đệm cuộn lại, do đó bạn phải sử dụng chức năng bên trong của nó để đến đầu ra cũ.

  • Hoặc vim có sử dụng bộ đệm cuộn ngược của chính nó bằng cách nào đó được phủ lên trên bộ đệm cuộn ngược lại không?

    Tôi hầu như đã trả lời câu hỏi này trong câu hỏi trước, nhưng câu trả lời ngắn cho câu hỏi cụ thể này là vimcó bộ đệm tạm thời của riêng nó, không có cuộn ngược lại, từ thiết bị đầu cuối, và sau đó thực hiện tất cả các cuộn tài liệu của riêng bạn.

Tất cả những ngoại lệ tôi đã đề cập:

Nó trở nên phức tạp hơn một lần nữa. Tôi đã nói rằng các ứng dụng không có bất kỳ sự kiểm soát nào đối với cuộn ngược và nó được cung cấp hoàn toàn bởi thiết bị đầu cuối. Trong một số trường hợp, với một số thiết bị đầu cuối, có sự tương tác hạn chế. Chương trình in ra các chuỗi thoát nhất định - nếu bạn đã từng sử dụng màu thiết bị đầu cuối theo cách thủ công trong quá khứ, bạn sẽ thấy chúng trông như thế nào - và thiết bị đầu cuối có thể diễn giải chúng và thay đổi hành vi của nó, hoặc thậm chí gửi lại thông tin cho chương trình. Những chuỗi thoát nào có sẵn được mô tả trong cơ sở dữ liệu termcap (khả năng đầu cuối) .

Một số thiết bị đầu cuối hỗ trợ truy vấn và thao tác hạn chế của bộ đệm cuộn. Nhiều xtermdẫn xuất có trình tự thoát hướng thiết bị đầu cuối để cuộn chế độ xem của nó. Nhiều thiết bị đầu cuối cũng hỗ trợ chỉ định một khu vực cụ thể của màn hình để cuộn, giữ nguyên tất cả các phần còn lại. Điều đó có xu hướng phá vỡ bộ đệm cuộn.

Hầu như tất cả các thiết bị đầu cuối đều hỗ trợ các chuỗi để di chuyển con trỏ xung quanh màn hình, đó là cách ncursesthư viện có thể cập nhật tất cả các phần khác nhau của màn hình. Bạn có thể xem các chuỗi VT100 được hỗ trợ bởixterm . Cách mà các tương tác này với bộ đệm cuộn có thể hơi kỳ lạ, đặc biệt trong trường hợp một cái gì đó thực hiện hành vi cuộn của chính nó, như lesslệnh. Bạn có thể kết thúc với các dòng trùng lặp hoặc bị thiếu trong cuộn ngược lesslại vì đã vẽ lại văn bản trên đầu theo cách mà thiết bị đầu cuối của bạn không mong đợi. Các chương trình khác đôi khi kết thúc việc lấp đầy bộ đệm của bạn với nhiều bản sao của toàn bộ màn hình.


1
Cảm ơn bạn rất nhiều vì câu trả lời tuyệt vời này! Nó rất đầy đủ và dễ hiểu mặc dù chủ đề phức tạp. Các chi tiết bổ sung cả hai làm cho tôi muốn tìm hiểu thêm và chỉ cho tôi nơi để tìm.
Oleg

1
Một số thiết bị đầu cuối có tùy chọn cuộn ngược không giới hạn, điều này có nghĩa là toàn bộ cuộn ngược là RAM (vì vậy tại một số điểm, chúng tôi sẽ gặp lỗi malloc hoặc OOM trên thiết bị đầu cuối) hoặc nó cố gắng ghi vào đĩa và tải từ đĩa như bạn cuộn? Kiểu như các chương trình trò chuyện.
CMCDragonkai

Các chuỗi thoát để truy vấn thường không có trong termcap (chúng thường không có trong terminfo, sẽ hoàn thiện hơn).
Thomas Dickey

@CMCDragonkai Konsole giữ cuộn ngược hữu hạn trong bộ nhớ, nhưng đặt cuộn ngược vô hạn trên đĩa không được mã hóa; bạn đã cảnh báo về nó trên hộp thoại cài đặt của nó. VTE (gnome-terminal và những người khác) lưu trữ cuộn (hữu hạn hoặc vô hạn) trên đĩa, được nén và mã hóa. Tôi không biết những trình giả lập khác làm gì.
egmont
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.