Đâ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 screen
và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 vim
và bash
, 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à screen
bộ đệ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 vim
nó 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. vim
chuyể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.
screen
là 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 - screen
mô 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à vim
có 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 xterm
dẫ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 ncurses
thư 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ư less
lệ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 less
lạ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.