Đầu tiên, một chút về lịch sử. Ngày xưa, khi bạn gõ một số văn bản trên một thiết bị đầu cuối , mỗi phím sẽ gửi một ký tự đến ứng dụng. Khi các máy mà thiết bị đầu cuối được kết nối trở nên mạnh hơn, các thiết bị đầu cuối được chuẩn hóa trên một phím điều khiển , sẽ gửi một số ký tự đặc biệt, không được in nhưng có một số loại chức năng. Bộ ký tự chiến thắng cuối cùng là ASCII , với 128 ký tự trong đó 32 ký tự điều khiển. Nhấn Ctrlcùng với một chữ cái hoặc ký hiệu khác được viết 10xxxxx₂ (ký hiệu nhị phân) sẽ gửi ký tự điều khiển có mã là 00xxxxx₂, ví dụ Ctrl+ [gửi số ký tự 27₁₀ = 0011011₂ vì [
là 91₁₀ = 1011011₂.
Một vài phím chức năng trên thiết bị đầu cuối đã gửi các ký tự điều khiển:
- Backspace=
Ctrl-H
(BS = Không gian sau)
- Tab=
Ctrl-I
(HT = Tab ngang)
- Linefeed=
Ctrl-J
(LF = Nguồn cấp dữ liệu) (vài thiết bị đầu cuối từng có khóa này)
- Returnhoặc Enter=
Ctrl-M
(CR = Trả lại vận chuyển)
- Escape=
Ctrl-[
(ESC = Thoát)
Khi thiết bị đầu cuối có nhiều phím chức năng, sẽ không có đủ ký tự điều khiển để thể hiện tất cả. Vì vậy, họ đã gửi các chuỗi ký tự, và quy ước phổ quát là các chuỗi ký tự này bắt đầu bằng ký tự thoát , Ctrl-[
.
Thời gian trôi qua, thiết bị đầu cuối phần cứng trở nên hiếm hơn và hiếm hơn; ngày nay có nhiều cấp độ dịch giữa bàn phím và ứng dụng . Giới hạn về số lượng ký tự có sẵn và các tương ứng được mã hóa cứng giữa các tổ hợp phím nhất định và các ký tự điều khiển nhất định không còn phù hợp. Tuy nhiên, các ứng dụng vẫn tương thích với các thiết bị đầu cuối hiện tại và thiết bị đầu cuối vẫn tương thích với các ứng dụng hiện có, điều này gây khó khăn cho việc thay đổi bất cứ điều gì.
Vì vậy, ngay cả ngày nay, trên các hệ thống giống như Unix, các ứng dụng chạy trong trình giả lập thiết bị đầu cuối nhận được ký tự Ctrl-I
khi người dùng nhấn Tabphím, ký tự Ctrl-[
khi người dùng nhấn Esc, v.v. Nếu Vim đang chạy trong thiết bị đầu cuối Unix, nó không thể phân biệt giữa <Esc>
và <Ctrl-[>
bởi vì thiết bị đầu cuối gửi cùng một thông tin.
Vim chạy trong các môi trường khác không có giới hạn này, vì vậy về nguyên tắc, chúng có thể gửi thông tin khác nhau. Cho rằng Vim sử dụng Ctrl-[
nhân vật để thể hiện <Esc>
ở rất nhiều nơi, việc thay đổi sẽ không thực tế; thay vào đó Ctrl+ [có thể được thực hiện để gửi một sự kiện đầu vào khác.
Tôi không biết bất kỳ phiên bản nào của Vim có phân biệt giữa Escvà Ctrl+ [(nhưng nó không giống như tôi từng sử dụng). Gvim, đối với một, dường như mô phỏng một thiết bị đầu cuối vườn .
Trớ trêu thay, đặt cược tốt nhất của bạn có thể là Vim chạy trong trình giả lập thiết bị đầu cuối. Một số trình giả lập thiết bị đầu cuối cho phép bạn tùy chỉnh các chuỗi thoát được gửi bởi các phím và móc khóa. Vì vậy, bạn có thể sắp xếp cho Ctrl+ [để gửi không phải Ctrl-[
ký tự ␛ ( ), nhưng một số chuỗi thoát. Xterm, trình giả lập thiết bị đầu cuối của hệ thống tham chiếu trên các hệ thống giống như Unix, hỗ trợ hai sơ đồ như vậy. Ví dụ:
- Escgửi
␛
và Tabgửi ␉
, trong tất cả các cấu hình.
- Với
?.VT100.modifyOtherKeys: 0
(mặc định) hoặc ?.VT100.modifyOtherKeys: 1
, Ctrl+ [gửi ␛
và Ctrl+ Igửi ␉
. ?.VT100.modifyOtherKeys: 1
chỉ ảnh hưởng đến các kết hợp meta và kết hợp điều khiển thiếu ký tự ASCII.
- Với
?.VT100.modifyOtherKeys: 2
và ?.VT100.formatOtherKeys: 0
(mặc định), Ctrl+ [gửi ␛[27;5;91~
và Ctrl+ Igửi ␛[27;5;105~
.
- Với
?.VT100.modifyOtherKeys: 2
và ?.VT100.formatOtherKeys: 1
, Ctrl+ [gửi ␛[91;5u
và Ctrl+ Igửi ␛[105;5u
.
Có thể bật hỗ trợ bằng cách đặt modifyOtherKeys
tài nguyên khi khởi động xterm (và formatOtherKeys
để chọn giữa hai sơ đồ) hoặc ứng dụng có thể bật và tắt một cách linh hoạt bởi ứng dụng.
Vim không có hỗ trợ tích hợp mà tôi biết. Bạn có thể viết các ràng buộc của riêng bạn cho các chuỗi thoát này. Có thể yêu cầu Vim tự động đặt thiết bị đầu cuối ở modifyOtherKeys
chế độ bằng cách cung cấp cho nó một định nghĩa thiết bị đầu cuối được sửa đổi, nhưng làm như vậy là vượt quá phạm vi của câu trả lời này.
Neovim đã tích hợp hỗ trợ cho một trong các biến thể . Theo tôi hiểu, nó không bật hỗ trợ nếu thiết bị đầu cuối hỗ trợ nó, điều đó tùy thuộc vào người dùng.
Ngày càng nhiều và phổ biến nhất hiện nay, Backspacegửi nhân vật 127.
Esc
hoặcC-[
, vì vậy bạn không gặp may, nhưng bạn có thể làm gì đó với phiên bản GUI của Vim hoặc bằng cách cấu hình lại thiết bị đầu cuối của bạn.