2015-07-22 15 views
7

Khi bạn nhập vim, màn hình sẽ "xóa" màn hình. Khi thoát, nó "khôi phục" nội dung gốc.Cơ chế nào cho phép ViM tạm thời ghi đè toàn bộ bảng điều khiển?

Tôi hiểu người ta có thể sử dụng \x1b[2J để xóa bảng điều khiển và đặt lại vị trí con trỏ, nhưng điều này sẽ ghi đè nội dung đầu cuối.

Tôi giả sử Vim sử dụng ncurses dưới mui xe, trong trường hợp này tôi cho rằng câu hỏi tốt hơn là cách ncurses thực hiện điều này, nhưng làm thế nào nó được thực hiện?

Trả lời

7

Hầu hết các trình giả lập thiết bị đầu cuối đều có thể lưu và khôi phục nội dung của màn hình.

Mã số terminfo cho điều này là smcup để vào chế độ toàn màn hình và rmcup để thoát. (Các mã termcap cũ là tite.)

Nếu những khả năng này được kích hoạt trong cơ sở dữ liệu terminfo, bất kỳ chương trình có sử dụng ncurses sẽ in ra chuỗi smcup về nhập cảnh, và rmcup chuỗi trên lối ra.

Trên hệ thống Tôi đang sử dụng tại thời điểm này, các dây là (với \E đại diện cho Escape character):

smcup: \E7\E[?1;47h 
rmcup: \E[2J\E[?1;47l\E8 

này khôi phục các nội dung trước của màn hình cũng như vị trí con trỏ.

Nghĩa cụ thể của chuỗi (ví xterm) là documented here:

  • smcup:
    • \E7 Lưu Cursor
    • \E[?1;47h Application Cursor phím; Sử dụng màn hình thay thế đệm
  • rmcup:
    • \E[2J màn hình Erase
    • \E[?1;47l Application Cursor phím; Sử dụng bình thường Màn hình Buffer
    • \E8 Restore Cursor

(Điều này giả định tôi đang tìm hiểu việc sử dụng các dấu chấm phẩy đúng;. Tôi không chắc chắn về điều đó 100%)

+0

Đã học được điều gì đó mới mẻ. Điều này giải thích rất nhiều; cảm ơn bạn. – Qix

+2

Cài đặt ứng dụng con trỏ-phím bình thường không được thực hiện trong smcup/rmcup - hầu hết các chương trình giả định nó được thực hiện trong chuỗi khởi tạo (is2). Xem ví dụ [putty] (http://invisible-island.net/ncurses/terminfo.src.html#tic-putty) trong cơ sở dữ liệu đầu cuối ncurses. Và tất nhiên, chế độ 47 từ lâu đã lỗi thời với xterm (kể từ [1998] (http://invisible-island.net/xterm/xterm.log.html#xterm_90)). –

+1

@ThomasDickey: Rõ ràng các mục termcap/terminfo của tôi đã lỗi thời (điều này không đáng ngạc nhiên). Cảm ơn vì thông tin. Tôi sẽ làm một số nghiên cứu và cập nhật câu trả lời của tôi Real Soon Now. –

8

Về câu trả lời bằng @Keith Thompson — không chính xác:

  • vim không sử dụng tối ưu hóa màn hình của kernel mà gửi smcuprmcup tự động. Thay vào đó, nó là termcap application. Nó theo sau một quy ước được sử dụng bởi hầu hết (không phải tất cả) các ứng dụng termcap. Có một số hiện thực của vi mà không ví dụ (trên IRIX64 có lẽ).
  • đối với "hầu hết các thiết bị đầu cuối" — trên thực tế, giao diện xterm là một phần nhỏ của terminal database (thậm chí tính các biến thể, nhỏ hơn 10%). Rephrase rằng để một cái gì đó như "giả lập thiết bị đầu cuối phổ biến nhất trên Linux.
  • nhà ga không tiết kiệmkhôi phục nội dung màn hình. Thay vào đó, nó chuyển giữa hai màn hình (trong tài liệu xterm của 'bình thường' và" thay thế "). Trong xterm ví dụ, người ta có thể luôn luôn chuyển đổi giữa hai sử dụng một mục menu. các xterm FAQ Why doesn't the screen clear when running vi? cho biết thêm chi tiết.
  • cho bối cảnh tốt hơn, lưu ý rằng smcup là một (che khuất) viết tắt cho bộ -mode-cursor-location hoặc bắt đầu chế độ định vị con trỏ. (cũng trỏ địa chỉ). r trong rmcup có nghĩa là "đặt lại" (và m có nghĩa là "chế độ"). thiết lập/thiết lập lại có ý nghĩa khác nhau từ lưu/khôi phục; với sau này người dùng được dẫn đến tin rằng các giá trị có thể được xếp chồng lên nhau.
Các vấn đề liên quan