2013-03-21 24 views
28

Trong Vim, khi ở chế độ trực quan, tôi phải bấm Esc hai lần để thoát khỏi nó và tắt lựa chọn. Sau một lần bấm số Esc Tôi phải đợi 2 giây để lựa chọn tắt.Thoát chế độ trực quan không bị trễ

Tôi có thể làm gì để thoát khỏi chế độ trực quan ngay lập tức khi nhập Esc?

+2

bạn có bản đồ nào với phím ESC không? – Kent

Trả lời

37

Thực thi lệnh sau đây đã giúp tôi

set timeoutlen=1000 ttimeoutlen=0 

see: http://www.johnhawthorn.com/2012/09/vi-escape-delays/

+10

Tôi tự hỏi tại sao một người nào đó đã downvoted câu trả lời này, vì nó hoạt động tốt. Tôi thấy hữu ích thiết lập cho tmux trên tài liệu tham khảo: 'set -sg thoát-time 0' – mMontu

+0

@mMontu Omg cảm ơn bạn, tôi đã nổi điên cố gắng tìm ra lý do tại sao thiết lập không được sử dụng trong vim, tôi không có ý tưởng tmux có cài đặt riêng của nó! –

+0

cho tôi điều này dường như thể hiện bản thân trong khi sử dụng tmux. Nhận xét mMontu chỉ cho tôi liên kết, điều đã làm việc kỳ diệu – Paul

5

Một cách giải quyết nhanh chóng được sử dụng <C-c> thay vào đó, nhưng có thể bạn muốn sửa chữa thời gian chờ trên <Esc>, bị gây ra bởi một ánh xạ mà bắt đầu với <Esc>, mà làm cho Vim chờ 'timeoutlen' để kiểm tra xem các bản đồ là hoàn tất.

Điều này không nhất thiết phải là bản đồ "thực"; nhiều cách giải quyết thiết bị đầu cuối (ví dụ: để làm cho một số khóa nhất định hoạt động) khuyên bạn nên thiết lập ánh xạ như vậy. (Thật không may, đây là một vấn đề khó khăn và phức tạp.)

Bạn có thể tìm thấy các bản đồ qua:

:verbose map <Esc> 
+0

khi thực hiện '' không có sự chậm trễ thực sự. Nhưng tôi muốn sử dụng 'ESC'. Tôi nhận được 'Không tìm thấy bản đồ' – Ozkan

+1

Hm, nó cũng có thể được gây ra bởi một trong các cài đặt': set t _... ', nhưng tôi không biết cách khắc phục điều đó. –

8

Như Ingo giải thích. Chỉ cần nghĩ rằng tôi sẽ đăng giải pháp: https://github.com/Greduan/dotfiles/blob/47f92e4db29d4ead778d877a85082b271de130ed/vim/vimrc.vim#L332-L346

Hoạt động khá tốt. Tôi cũng hơi bối rối, nên tôi không thể giải thích được, nhưng đoạn mã giải thích khá rõ.

Vấn đề là nó hoạt động, nó chỉ đơn giản là làm cho <Esc> hoạt động ngay lập tức ngay cả khi trên Thiết bị đầu cuối. Tôi tin rằng nếu bạn có ánh xạ được đặt thành <Esc>, nó cũng sẽ cho bạn thời gian để thực hiện những điều đó. Tuy nhiên tôi không chắc chắn.

EDIT

nghiên cứu một chút và bây giờ tôi có thể giải thích nó. Về cơ bản, nếu bạn không sử dụng GUI (như MacVim) thì khi bạn nhập chế độ chèn, ttimeoutlen sẽ được đặt thành 0. Nghĩa là ngay khi bạn nhấp vào <Esc> sẽ hoạt động. Tuy nhiên khi bạn đang ở chế độ bình thường thì nó sẽ đặt số ttimeoutlen thành số bạn thích, cho phép bạn ánh xạ với <Esc>.

Giải pháp hoàn hảo tôi nghĩ, vì nếu bạn có ánh xạ ở chế độ chèn, nó sẽ sử dụng điều khiển hoặc một cái gì đó tương tự.

EDIT 2

Dưới đây là các mã:

set timeout " Do time out on mappings and others 
set timeoutlen=2000 " Wait {num} ms before timing out a mapping 

" When you’re pressing Escape to leave insert mode in the terminal, it will by 
" default take a second or another keystroke to leave insert mode completely 
" and update the statusline. This fixes that. I got this from: 
" https://powerline.readthedocs.org/en/latest/tipstricks.html#vim 
if !has('gui_running') 
    set ttimeoutlen=10 
    augroup FastEscape 
     autocmd! 
     au InsertEnter * set timeoutlen=0 
     au InsertLeave * set timeoutlen=1000 
    augroup END 
endif 

Với thời gian tôi đã loại bỏ các điều kiện GUI không chạy và nó vẫn hoạt động như xa như tôi có thể nói.

+0

sự khác biệt giữa 2000ms từ dòng thứ hai và 1000ms là gì? Cảm ơn! – etal

+0

@ thai không chắc chắn một cách trung thực. Tôi đã làm điều này từ lâu rồi. : P Họ là cùng một lựa chọn để họ có thể được thiết lập giống nhau. Đọc ': h timeout',': h timeoutlen' và ': h ttimeoutlen' sẽ giúp bạn tìm ra nó. Tôi khá chắc chắn lý do chỉ đơn giản là một workaround cho quirks tạo ra bởi sự khác biệt giữa làm thế nào GUI phiên bản của Vim xử lý này và làm thế nào các phiên bản thiết bị đầu cuối của Vim xử lý này. Hy vọng rằng sẽ giúp. :) – greduan

1

tôi không có bản đồ ràng buộc để <ESC> toàn cầu hay cho chế độ trực quan (gọi: VMAP verbose <ESC> mang đến cho không có kết quả) nhưng vẫn còn một sự chậm trễ đáng kể khi thoát khỏi chế độ Visual.Ngay cả trên các cài đặt mới không có vimrc thì có sự chậm trễ. Sử dụng < C-c > sẽ thoát khỏi chế độ trực quan mà không bị chậm trễ.

Vì tôi không thích cách nhấn < C-c > để thoát bất kỳ chế độ, Tôi hiện bản đồ <ESC>-< C-c > trong chế độ trực quan. Thao tác này thoát chế độ trực quan bằng cách sử dụng <ESC> mà không bị chậm trễ.

:vmap <ESC> <C-c> 

Hoặc đặt dòng sau trong vimrc của bạn

vnoremap <ESC> <C-c> 

này sẽ không hoạt động nếu bạn không có ánh xạ chế độ toàn cầu hoặc thị giác bị ràng buộc để <ESC>.

Các vấn đề liên quan