Sự khác biệt giữa các chuỗi khóa được lập bản đồ là gì (timeoutlen v ttimeoutlen)


20

Các nhãn hiệu vim nói rằng chúng ta có thể sử dụng timeoutlenđể xác định độ dài thời gian chờ của chuỗi chìa khóa ánh xạ và có thể sử dụng ttimeoutlenđể xác định độ dài thời gian chờ của các mã chủ chốt :

Một thiết lập hữu ích sẽ là

:set timeout timeoutlen=3000 ttimeoutlen=100

(hết thời gian trên bản đồ sau ba giây, hết thời gian trên mã khóa sau một phần mười giây).

Mã chính là gì? Chúng khác với các chuỗi khóa được ánh xạ như thế nào?

Tôi biết một ví dụ về chuỗi khóa được ánh xạ là jktừ ánh xạ bên dưới:

inoremap jk <esc>

Trong ví dụ này, khi tôi ở chế độ chèn và gõ j, vim sẽ đợi một timeoutlenphần nghìn giây để tôi nhấn ktrước khi quyết định ý định của tôi là gì.

Nhưng mã khóa là gì và ttimeoutlenảnh hưởng đến nó như thế nào? Cảm ơn bạn.

Câu trả lời:


22

Nói ngắn gọn:

  • keycodes là một cách để thể hiện một khóa
  • Chuỗi khóa được ánh xạ là một chuỗi các mã khóa kích hoạt một hành động

Bây giờ tôi nghĩ rằng câu hỏi của bạn liên quan nhiều hơn đến sự khác biệt giữa timeoutlenttimeoutlenthay vì sự khác biệt giữa chuỗi khóa được ánh xạ và mã khóa.

Câu trả lời của tôi dựa trên bài viết về wiki này mà bạn thực sự nên đọc bởi vì nó giải quyết một số điểm mà tôi không đề cập ở đây để giữ câu trả lời ngắn gọn và rõ ràng nhất có thể.


Trước tiên hãy nói về mã khóa. Bài viết định nghĩa hai loại mã khóa:

  • Mã khóa thiết bị đầu cuối:

    Chúng là cách thiết bị đầu cuối đại diện cho một chìa khóa.

    Các mã này được gửi bởi thiết bị đầu cuối đến Vim.

    Để có được danh sách các mã khóa này, bạn nên sử dụng tài liệu đầu cuối của mình. Bạn cũng có thể nhìn thấy chúng bằng cách gõ lệnh cattrong thiết bị đầu cuối của bạn và nhập khóa bạn muốn biết mã khóa. Ví dụ trên thiết bị đầu cuối của tôi, mã khóa cho ShiftF1hình như:

    ^[[23~

  • Mã khóa Vim:

    Họ là cách vim đại diện cho một chìa khóa.

    Vim cần một cách nhất quán để biểu diễn các khóa vì mã khóa của thiết bị đầu cuối thay đổi từ thiết bị đầu cuối sang thiết bị khác. Một danh sách các mã khóa Vim có thể truy cập tại :h t_ku. Mã khóa Vim cho ShiftF1hình như:

    <S-F1>

Do đó, khi tôi nhấn ShiftF1trên bàn phím, trình điều khiển và HĐH sẽ cho thiết bị đầu cuối biết rằng tôi đã nhấn các phím này mà nó sẽ hiểu là ^[[23~. Thiết bị đầu cuối sẽ gửi nó đến Vim, điều này sẽ hiểu rằng nó có nghĩa <S-F1>và sẽ kích hoạt hành động được ánh xạ tới mã khóa này.

Chúng tôi có thể đặt mã khóa Vim, vì vậy nếu thiết bị đầu cuối của bạn gửi mã khóa mà Vim không hiểu như <S-F1>ví dụ bạn có thể sử dụng lệnh sau. Điều này sẽ cho Vim biết khi bạn nhận được mã khóa ^[[24~, hãy dịch nó có <S-F1>:

set <S-F1> ^[[24~

Vì vậy, một chuỗi phím được ánh xạ là gì?

Chuỗi khóa được ánh xạ sẽ là một lhs của ánh xạ và có thể là mã khóa Vim hoặc mã khóa Terminal. Ví dụ:

:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>

Ánh xạ đầu tiên sẽ ánh xạ mã khóa đầu cuối trong khi ánh xạ thứ hai ánh xạ mã khóa Vim.

Bây giờ cho sự khác biệt giữa timeoutlenttimeoutlen?

  • ttimeoutlenlà thời gian Vim sẽ đợi các phần khác nhau của mã khóa thiết bị đầu cuối (trong ví dụ trước của chúng tôi sẽ là ^[sau [đó 2, v.v ...

    Vì các mã khóa này được gửi bởi thiết bị đầu cuối, nên không có độ trễ giữa các đầu vào này (vì chúng được gửi 'tất cả cùng một lúc' bởi thiết bị đầu cuối). Đây là lý do tại sao tài liệu đề xuất một giá trị thực sự nhỏ cho cài đặt này.

  • timeoutlen là thời gian Vim sẽ đợi các mã khóa Vim kế tiếp được người dùng nhập thủ công và do đó thời gian nhập liệu dài hơn so với mã khóa đầu cuối.

Để sử dụng một ví dụ, hãy nói rằng:

  • Bạn đã ánh xạ ^[[1;6Btới một hành động
  • ^[1;6B là mã khóa của thiết bị đầu cuối của bạn cho ctrlshiftdown
  • ^[là mã khóa của thiết bị đầu cuối của bạn cho Escape.

Hành vi mà bạn nên mong đợi:

  • Nếu bạn đặt số lượng lớn ttimeoutlen, mỗi lần bạn nhập Escape, Vim sẽ chờ xem bạn có nghĩa là ^[(nghĩa là Escape) hoặc ^[1;6B(tức là ctrlshiftdown)
  • Nếu bạn đặt nhỏ ttimeoutlen, bạn sẽ không bị trễ khi bạn nhập Escapevì Vim sẽ biết rằng đó là một mã khóa hoàn chỉnh.

timeoutlensẽ hành động ở 'cấp độ cao hơn', nếu bạn có các ánh xạ sau:

inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>

Khi bạn gõ jvim sẽ đợi timeoutlenkhông phải vì bắt đầu mã khóa đầu cuối jchưa hoàn thành mà vì nó đang chờ mã khóa Vim tiếp theo.


Tôi hy vọng lời giải thích của tôi có ý nghĩa, lưu ý rằng một số ánh xạ tôi đã sử dụng không có ý nghĩa theo quan điểm chức năng nhưng ở đây để thuận tiện cho việc giải thích.

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.