Vô hiệu hóa <Esc> nhưng giữ <C - [>


24

Để chuyển trở lại từ chế độ Chèn tôi đã quen <Esc>. Bây giờ tôi đang tìm cách kiềm chế bản thân để <C-[>thay vì <Esc>. Vì vậy, tôi cần phải vô hiệu hóa <Esc>để giúp đào tạo lại.

Vấn đề là

:inoremap <Esc> <Nop>

cũng vô hiệu hóa <C-[>. Đối với vim họ dường như là điều tương tự.

Có cách nào để vô hiệu hóa cái này mà không có cái kia không?


13
Nó phụ thuộc vào môi trường bạn đang làm việc. Hầu hết các thiết bị đầu cuối văn bản gửi cùng một thông tin đến ứng dụng khi bạn nhấn Eschoặc C-[, 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.
Gilles 'SO- ngừng trở thành ác quỷ'

Đúng! Không phải là một vấn đề vim. Tôi sẽ tìm thấy một cách giải quyết với ánh xạ bàn phím. Cảm ơn
mxlian 11/05/2015

3
@Gilles tại sao bạn không đặt câu trả lời? Nó tốt hơn cho nhân viên Google và thống kê trang web của chúng tôi.
Robbie Wxyz

2
@SuperScript Tôi đã nghiên cứu thêm một chút và đăng câu trả lời.
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


35

Đầ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-Ikhi 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><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 EscCtrl+ [(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 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 Ctrl+ Igửi . ?.VT100.modifyOtherKeys: 1chỉ ả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?.VT100.formatOtherKeys: 0(mặc định), Ctrl+ [gửi ␛[27;5;91~Ctrl+ Igửi ␛[27;5;105~.
  • Với ?.VT100.modifyOtherKeys: 2?.VT100.formatOtherKeys: 1, Ctrl+ [gửi ␛[91;5uCtrl+ 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 ở modifyOtherKeyschế độ 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.

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.