các phím mũi tên không hoạt động trong chế độ chèn


13

Khi tôi nhấn các phím mũi tên ở chế độ chèn, tôi nhận được các ký tự thay vì điều hướng:

Nhấn phím mũi tên loại ký tự

Tôi muốn có thể sử dụng các phím mũi tên để điều hướng.


Những điều tôi đã thử

Tôi có set nocompatibletrong ~/.vimrc( vimrc pastebin ) của tôi, tôi đang sử dụng mầm bệnh và đây là ~/.vim/bundlethư mục của tôi :

YouCompleteMe/
emmet-vim/
nerdtree/
node/
vim-airline/
vim-markdown/

Vấn đề chỉ bắt đầu gần đây, không thể nhớ nguyên nhân.

Một số khuyến nghị :set term=builtin_ansi, và điều này khắc phục vấn đề nhưng loại bỏ tất cả các màu của tôi.


$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 29 2016 12:51:13)
MacOS X (unix) version
Included patches: 1-2290
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
...

Xem http://pastebin.com/5z1HbpqW cho toàn bộ đầu ra.

$ echo $TERM
xterm-256color

và trong vim:

:set compatible?
nocompatible

:set term?
term=xterm-256color

5
Có thể không phải là một bản sao (tôi không chắc chắn) nhưng ít nhất là vi.stackexchange.com/q/5123/1841
statox

@statox đây không phải là bản sao vì tôi đang sử dụng vim, không vi.
theonlygusti

1
Làm thế nào bạn ghi lại màn hình của bạn như vậy?
Anthony

Bạn đã thử mẹo từ trang web này chưa: vim.wikia.com/wiki/ .
grodzik

1
Loại bỏ ánh xạ chế độ chèn với thoát. Dòng 133
FDinoff

Câu trả lời:


7

Điều gì gây ra hành vi

Khi bạn nhấn mũi tên trái, thiết bị đầu cuối của bạn sẽ gửi chuỗi thoát sau:

ESC O D

Điều này cũng có thể được ký hiệu là, ký hiệu ^[ODở đâu , đó là một cách khác để ghi chú hoặc nhập ký tự ESC. (Hãy thử nó trong chế độ chèn!)^[Ctrl-[

Vim không nhận ra đây là một chuỗi thoát, và do đó, nó đang đối xử với những tổ hợp phím đó như thể bạn đã tự gõ chúng ra:

  • Esc: Để chế độ chèn,
  • O: Bắt đầu một dòng mới phía trên con trỏ và vào chế độ chèn,
  • D: Nhập ký tự 'D'.

Bạn có thể xác nhận rằng đây là những gì thiết bị đầu cuối của bạn đang gửi bằng cách vào chế độ chèn và sau đó nhấn Ctrl-Vtheo sau là Leftmũi tên.

Có chuyện gì thế

Trình tự thoát có thể hết thời gian

Cách duy nhất mà Vim có thể phân biệt chuỗi thoát với ba ký tự được nhập thủ công là vào thời gian xảy ra giữa lúc nhận từng ký tự. Do đó, có thể trên các thiết bị đầu cuối chậm hoặc các hệ thống rất bận rộn có đủ độ trễ giữa mỗi ký tự mà Vim đang quyết định đó không phải là một chuỗi thoát và chỉ diễn giải các tổ hợp phím như được mô tả ở trên.

Điều này được mô tả trong :help vt100-cursor-keysvà hơn nữa :help timeout - giải pháp được đề xuất là đặt một mức đủ lớn ttimeoutlen, nhưng vô hiệu hóa hoàn toàn thời gian chờ bằng cách đặt cả hai notimeoutnottimeoutcũng sẽ hoạt động.

Tuy nhiên, với thiết lập của bạn, điều này dường như không phải là vấn đề.

Vim không nhận ra chuỗi

Có nhiều khả năng vấn đề là Vim không nhận ra chuỗi thoát được gửi và do đó, diễn giải nó là tổ hợp phím. Bạn có thể kiểm tra điều này bằng lệnh sau:

:set <left>?

Trong một thiết lập làm việc với cấu hình thiết bị đầu cuối hiện tại của bạn, điều này sẽ cung cấp một trong các đầu ra sau:

t_kl <Left>      ^[O*D
t_kl <Left>      ^[OD

Nếu bạn thấy bất cứ điều gì khác 1 , thì Vim và thiết bị đầu cuối của bạn không hoàn toàn nói cùng một ngôn ngữ.

Cách chính xác để khắc phục điều này là sửa cấu hình thiết bị đầu cuối của bạn để cơ sở dữ liệu terminfo của bạn báo cáo các chuỗi thực sự được gửi khi bạn nhấn các phím mũi tên, nhưng làm như vậy có thể phức tạp. Một sửa chữa hơi khó khăn là thay đổi những gì thiết bị đầu cuối của bạn gửi để phù hợp với những gì Vim đang mong đợi. Tôi suy luận từ nhận xét của bạn rằng bạn đang sử dụng Mac Terminal.app mặc định: Bạn có thể thay đổi chuỗi thoát nào được gửi cho mỗi lần nhấn phím trong Tùy chọn → Cấu hình → Hồ sơ của bạn → Bàn phím.

Tuy nhiên, cách khắc phục dễ dàng nhất có lẽ là thông báo trực tiếp cho Vim những chuỗi thoát nào được mong đợi. Bạn có thể làm điều này bằng cách đặt các tùy chọn đầu cuối của nó, do đó:

set <up>=^[OA
set <down>=^[OB
set <right>=^[OC
set <left>=^[OD

Lưu ý rằng ^[ở trên là một ESCnhân vật theo nghĩa đen . Bạn không thể chỉ cần gõ ^theo sau [! Cách dễ nhất để nhập ánh xạ là nhập vd

set <left>=

và sau đó, vẫn ở chế độ chèn, nhấn Ctrl-Vtheo sau là leftmũi tên. Lưu ý rằng sau đó bạn đang đặt chuỗi thoát trực tiếp tới những gì Vim nhận được khi bạn nhấn phím mũi tên ... bằng cách gửi chuỗi đó!

1: Một khả năng có thể là trình tự CSI :^[[D


Cuối cùng, nhờ câu trả lời của bạn, tôi đã có thể sửa các phím con trỏ trong Hệ thống con Windows cho Linux!
David Ferenczy Rogožan

5

Câu trả lời này đã giải quyết chính xác cùng một vấn đề cho tôi.

Trong ~/.vimrcthêm dòng sau đây:

set nocompatible

Sau khi khởi động lại vim, vấn đề đã biến mất


2
Từ đó nếu bạn có một đặt vào nó sẽ là dư thừa. :h 'nocompatible' default on, off when a vimrc or gvimrc file is found.vimrcset nocompatible
statox

2

Cập nhật vimgói đã khắc phục sự cố mũi tên bị hỏng cho tôi.

Nếu bạn đang dùng Ubuntu, hãy chạy apt upgrade vim. Thật thú vị, apt install vimcũng giúp. Và thú vị hơn nữa, sau khi vimphiên bản cập nhật giữ nguyên:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

Nhưng nó giúp.


1
Phiên bản có thể giữ nguyên nhưng có thể các bản vá đi kèm đã được cập nhật? Mặt khác, tôi không thấy làm thế nào apt upgradecó thể giải quyết vấn đề.
statox

Điều này làm việc hoàn hảo cho tôi trên hệ điều hành tiểu học 5.1 Hera.
praneetloke
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.