Tại sao <Esc> ánh xạ chế độ bình thường này ảnh hưởng đến khởi động?


13

Tôi đang gặp một vấn đề kỳ lạ với ánh xạ chế độ bình thường Esc.

Nếu bạn tạo tệp escmapvimrccó nội dung:

set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>

Và sau đó bắt đầu vim bằng vimrc này:

vim --noplugin -u escmapvimrc

Sau đó, vim sẽ bắt đầu ở chế độ chờ toán tử với clệnh chờ nhập thêm, hiển thị tệp trống và hiển thị dòng lệnh :noh.

Nếu bạn loại bỏ nnoremapdòng, vấn đề sẽ biến mất.

Nếu bạn gỡ lỗi và thực hiện mọi thứ bạn nhận được kết quả sau:

Entering Debug mode.  Type "cont" to continue.
/[...]/escmapvimrc
line 1: set nocompatible
>s
/[...]/escmapvimrc
line 2: set showcmd " Doesn't affect the problem: just makes it easier to see
>s
/[...]/escmapvimrc
line 3: nnoremap <Esc> :noh<CR><esc>
>s
/[...]/escmapvimrc
line 4: End of sourced file
>s
Press ENTER or type command to continue

Sau khi bạn nhấn enter, màn hình khởi động Vim được hiển thị và bên dưới:

Entering Debug mode.  Type "cont" to continue.
cmd: noh
>s

Màn hình khởi động Vim sau đó biến mất và bạn đang ở chế độ chờ nhà điều hành, như được mô tả ở trên.

Chuyện gì đang xảy ra vậy?

EDIT: Hành vi được mô tả trong Vim 7.3. Trong Vim 7.4.52, nmapnguyên nhân khiến Vim khởi động ở chế độ Thay thế khi khởi động Vim mà không có tệp. ( Tuy nhiên, nếu Vim 7.4.52 được bắt đầu với một tệp, tuy nhiên, nó cũng khởi động bằng lệnh c đang được tiến hành.) Dù sao đi nữa, vấn đề sẽ biến mất khi nmap bị xóa.


Tôi đã tái tạo điều này với vim, nhưng dòng lệnh không hiển thị :nohcho tôi. Làm tương tự với gvim không cho thấy hành vi này.
PhilippFrank 18/03/2015

1
Một ánh xạ phổ biến để xóa phần tô sáng tìm kiếm là:nnoremap <c-l> :noh<cr><c-l>
Peter Rincker 18/03/2015

Là một lưu ý phụ, bạn có thể sử dụng /alksdjflaskjđể xóa phần đánh dấu tìm kiếm cũng khá nhanh.
Shahbaz

Câu trả lời:


11

Vim gửi trong khi khởi động một số mã đầu cuối đặc biệt (thường chứa <esc>khóa) để xác định một số thứ (màu sắc, bs, ...) Nếu bạn ánh xạ, <esc>điều này rất có thể sẽ gây nhầm lẫn cho trình phân tích mã trả về và những điều kỳ lạ có thể xảy ra.

Do đó, chỉ sử dụng bản đồ trên của bạn sau khi mọi thứ đã được thiết lập chính xác (ví dụ: thông qua chế độ tự động Vim Entry).


1
Chà, chúng được gửi bất cứ khi nào 'term'tùy chọn được đặt. Điều đó thường chỉ trong khi khởi động, nhưng có thể có các kịch bản được đặt trong thời gian chạy.
jamessan 18/03/2015

Trong trường hợp cụ thể này, điều này dường như được gây ra bởi may_Vq_ambigupt_char_ thong () chỉ được gọi khi khởi động
Christian Brabandt 18/03/2015

Tôi đã dự định thử chính xác điều này (đó là lý do tại sao tôi không chấp nhận câu trả lời khác). Tốt để có xác nhận nó nên làm việc, mặc dù.
Giàu

Điều này đã thực hiện các mẹo, mặc dù VimEntercụ thể không hoạt động.
Giàu

Bạn đang đùa, phải không? Lối thoát được sử dụng để liên lạc phải tách biệt với ánh xạ phím Escape.
Shawnhcorey

11

Thiết bị đầu cuối Linux sử dụng các chuỗi thoát ANSI (tức là các chuỗi ký tự bắt đầu bằng <Esc>) để gửi các khóa đặc biệt tới Vim và là một phần của giao thức giao tiếp mà ứng dụng truy vấn các khả năng của nó. Bản đồ của bạn can thiệp vào điều đó, và do đó dẫn đến những hành vi "lạ" này.

Do đó, đừng lập bản đồ<Esc> . Sử dụng một phím khác. Vấn đề ít được phát âm trong GVIM, nhưng tôi cũng không đề xuất nó ở đó.


Thật không may, tôi đã có bản đồ này gần như kể từ khi tôi bắt đầu sử dụng Vim, vì vậy bây giờ nó đã được ghi vào bộ nhớ cơ của tôi. Cảm ơn đã giải thích, mặc dù.
Giàu

Tôi có lẽ nên thêm vào, vì lợi ích của hậu thế, vấn đề được mô tả là vấn đề duy nhất mà tôi biết chắc chắn là do ánh xạ này và là vấn đề kỳ lạ duy nhất chưa được giải quyết mà tôi có thể nhớ lại khi gặp Vim.
Giàu

1
@Rich làm thế nào khó khăn để làm quen với việc sử dụng một cái gì đó như thế <Esc><Esc>nào?
Random832

@ Random832 Đó là một ý tưởng hấp dẫn.
Giàu

1
Tất cả các chương trình xterm sẽ làm điều này bởi vì chúng mô phỏng các thiết bị đầu cuối VT-100. Nó không có gì để làm với Linux. iOS, dựa trên BSD chứ không phải Linux, cũng sẽ có các xterms mô phỏng VT-100.
Shawnhcorey


1

Tôi đã thử thiết lập chế độ tự động để thiết lập ánh xạ sau này khi khởi động, nhưng sự cố vẫn xảy ra. *

Cuối cùng tôi đã tạo một autocommand để xảy ra lần đầu tiên khi tôi vào chế độ Chèn. Đây rõ ràng không phải là một giải pháp hoàn hảo, nhưng đối với tôi nó sẽ hoạt động hầu hết thời gian và dường như đó là cách tốt nhất tôi có thể làm:

CẬP NHẬT : Sau khi sử dụng phiên bản dài hơn bên dưới mà không gặp sự cố trong một vài năm, tôi đã quyết định rằng nó có thể hơi quá mức và từ đó tôi đã sử dụng phiên bản đơn giản hơn nhiều này, thay vào đó chỉ đặt lại ánh xạ mỗi khi bạn vào chế độ chèn:

augroup escape_mapping
  autocmd!
  autocmd InsertEnter * call s:setupEscapeMap()
augroup END

function! s:setupEscapeMap()
  nnoremap <Esc> :noh<CR><Esc>
endfunction

Ánh xạ không cần phải được đặt lại mỗi khi bạn vào chế độ chèn, nhưng nó cũng không gây hại gì cho Vim khi làm như vậy.

PHIÊN BẢN GỐC :

if !exists('g:escape_mapped')  " Only need to set the mapping up once.
  augroup escape_mapping
    autocmd!
    " Create the autocommand, to fire when Insert mode is entered
    autocmd InsertEnter * call s:setupEscapeMap()
  augroup END
endif

function! s:setupEscapeMap()
  " Actually create the mapping
  nnoremap <Esc> :noh<CR><Esc> 

  " Now the map exists, so we won't ever need the autocommand again.
  let g:escape_mapped = 1

  " Tidy up the autocommand and group
  autocmd! escape_mapping InsertEnter *
  augroup! escape_mapping
endfunction

* Tôi cố gắng gắn nó với các sự kiện khác nhau: VimEnter, BufReadPost, BufWinEnter, và thậm chí CursorMoved(!), Nhưng những tất cả dường như lửa quá sớm.


Bạn đã bao giờ thử TermResponseautocommand chưa?
Christian Brabandt

@ChristianBrabandt Nó nằm trong danh sách việc cần làm của tôi!
Giàu
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.