2012-10-18 34 views
5

Xem xét unbinding các phím mũi tên sử dụngVim: Tại sao bản đồ không hoạt động ở chế độ chèn?

noremap <Left> <NOP> 
noremap <Right> <NOP> 
noremap <Up> <NOP> 
noremap <Down> <NOP> 

này hoạt động ở chế độ bình thường, nhưng nó không làm việc trong chế độ chèn: chúng ta vẫn có thể điều hướng với các phím mũi tên. Như một biện pháp đối phó, người ta phải bao gồm

inoremap <Left> <NOP> 
inoremap <Right> <NOP> 
inoremap <Up> <NOP> 
inoremap <Down> <NOP> 

Nhưng điều này không thực sự có ý nghĩa với tôi, vì tôi giả mapnoremap nên làm việc trong tất cả các chế độ, trong khi prepending n/v/x/s/o/i/l/c quy định cụ thể việc lập bản đồ để chỉ làm việc trong chế độ mà cụ thể . Có một lý do cho điều này?

Trả lời

4

lý do tại sao không có bản đồ phương thức bao trọn gói, thay vì phát hành cả bản đồ và bản đồ!

Đó là dễ dàng để giải thích: Trong ánh xạ chế độ chèn, Vim không tự động chuyển sang chế độ bình thường (bạn có thể muốn ở lại trong chế độ chèn, mặc dù bản dịch văn bản thường được thực hiện thông qua :iabb, không qua :imap), do đó tập các lệnh áp dụng hoàn toàn khác nhau. Ví dụ, trong chế độ bình thường Ctrl-U cuộn lên trên, nhưng ở chế độ chèn nó sẽ xóa các ký tự đã nhập trong dòng!

Các tiền tố như <C-O> tạm thời chuyển từ chế độ chèn sang chế độ thông thường. Trên thực tế, người ta thường thậm chí có để xác định một tiền tố khác nhau cho chế độ dòng lệnh, cũng như thể hiện bởi ví dụ này:

noremap <C-Tab> :<C-U>tabnext<CR> 
inoremap <C-Tab> <C-O>:tabnext<CR> 
cnoremap <C-Tab> <C-C>:tabnext<CR> 

Vì vậy, khi xác định ánh xạ, luôn luôn xem xét, trong đó chế độ họ là cần thiết và cho dù họ không cần Remapping (:nmap:noremap, thích thứ hai).

+0

Nó không phải ngay lập tức rõ ràng rằng blockquote của bạn "tại sao không có một bản đồ phương thức bao gồm tất cả, thay vì phát hành cả bản đồ và bản đồ!" Là trích dẫn một phần của [bình luận của nil] (http://stackoverflow.com/questions/12953183 # comment17559832_12953259) về câu trả lời của Paul Ruane. –

+0

Vì vậy, dường như tôi phải nhận xét về câu trả lời này thay vì sửa chữa nó. Trích dẫn từ bình luận của nil không đọc đúng, mặc dù câu gốc của nil là đúng ngữ pháp. '' và ' 'không phải là các đầu tiên; họ không cần phải bắt đầu. 'nmap' không phải là đệ quy tương đương với' noremap', vì vậy nó có thể được cải thiện bằng cách thay đổi 'nmap' thành' map' hoặc nói ‘' * map' so với '* noremap'’. Tôi đã khắc phục các sự cố này trong bản chỉnh sửa nhưng đã bị từ chối. Tôi luôn luôn có vẻ để có được nói-off cho hoặc chỉnh sửa quá ít hoặc chỉnh sửa quá nhiều; Tôi không thể chiến thắng với người kiểm duyệt. SE quá * quan liêu. –

1
:help map-overview 

Bản đồ (và sơ đồ) dành cho chế độ bình thường, trực quan, chọn và nhà điều hành đang chờ xử lý.

+0

Ah! Cảm ơn chắc chắn có ý nghĩa. [Tôi đã dựa vào câu hỏi của mình ngoài câu trả lời ở đây, nhưng tôi sẽ sửa nó] (http://stackoverflow.com/questions/3776117/vim-what-is-the-difference-between-the-remap-noremap- nnoremap-and-vnoremap-ma) để không ai khác nhận được ý tưởng sai như tôi đã làm. Có một lý do tại sao có * không * một bản đồ phương thức bao trọn gói, thay vì phát hành cả bản đồ 'và' bản đồ! '? –

+0

@nil: Lý do có thể là ví dụ về chức năng vô hiệu hóa của bạn là một trong rất ít trường hợp mà cùng một ánh xạ sẽ có cùng tác dụng trong tất cả các chế độ. –

+0

Tôi đọc qua từ 'bản đồ tổng quan' xuống phần cuối của phần phụ, đó là một chút khó khăn đi, chỉ để thấy rằng phần phụ tiếp theo, đó là * 1.4 BẢN ĐỒ BẢN ĐỒ * (': help map-listing'), thực sự cung cấp một cái nhìn tổng quan tốt hơn nhiều so với 'bản đồ-tổng quan'! –

0

Trái với những gì bạn có thể mong đợi, noremapmap không thực sự áp dụng cho tất cả các chế độ.Dựa trên các bản tóm tắt rất hữu ích từ :help map-listing, đây là một danh sách các nhân vật có thể được bắt đầu (hoặc hậu tố trong trường hợp !) để map, noremap, unmap, và mapclear, cùng với các phương thức mà họ áp dụng đối với:

  • (none) - Bình thường, Visual, Chọn, và điều hành đang chờ giải quyết
  • n - Bình thường
  • v - thị giác và Chọn
  • x - Visual
  • s - Chọn
  • o - Nhà tổ chức đang chờ giải quyết
  • ! - Insert và Command-line
  • i - Chèn
  • c - dòng lệnh
  • l - ": lmap" ánh xạ cho Insert , Dòng lệnh và Lang-Arg

Vì vậy,Ánh xạsẽ không có hiệu lực trong chế độ Chèn hoặc Dòng lệnh, và không cân nhắc, có thể không hoạt động như dự định trong chế độ Visual, Select hoặc Operator-pending.

Tuy nhiên, ánh xạ có thể được điều chỉnh để hoạt động ở các chế độ khác nhau, chỉ đơn giản bằng cách thay đổi chế độ và quay lại ánh xạ. Ví dụ, noremap ánh xạ đó phát hành dòng lệnh lệnh nhưng chỉ làm việc trong chế độ bình thường có thể thích nghi cũng làm việc trong các chế độ khác như thể hiện bởi ví dụ này:

noremap <C-Tab> :<C-U>set list!<CR> 
inoremap <C-Tab> <C-O>:set list!<CR> 
cnoremap <C-Tab> <C-C>:set list!<CR>:<Up> 

noremap áp dụng cho Bình thường, Visual, Chọn, và Chế độ vận hành đang chờ xử lý, trong đó :<C-U> chuyển sang chế độ Dòng lệnh, sau đó xóa dòng hiện tại trong trường hợp Vim chèn một phạm vi; inoremap áp dụng cho chế độ Chèn, trong đó <C-O>: tạm thời thoát sang chế độ Bình thường, sau đó chuyển sang chế độ Dòng lệnh; và cnoremap áp dụng cho chế độ dòng lệnh, trong đó <C-C>: thoát và chuyển sang chế độ dòng lệnh để xóa dòng nhưng, không giống như <C-U>, giữ lại trong lịch sử lệnh sao cho :<Up> có thể đưa lại.

Ba ánh xạ này bao gồm tất cả sáu chế độ. (Rõ ràng là 'Lang-Arg' không phải là một chế độ.) Có một số trường hợp góc mà nó không hoạt động, nhưng sau đó cũng có một số trường hợp nó hoạt động khi tôi đã nghĩ rằng nó sẽ không, và tôi don không hiểu tại sao. Ngoài ra, hầu hết các chế độ sẽ mất những thứ nhỏ như lựa chọn và các nhà khai thác đang chờ xử lý, ngay cả khi lệnh được ánh xạ sẽ không làm mất những thứ này. Ví dụ, khi ở chế độ Chèn, tôi không thấy lý do tại sao ví dụ tôi đã đưa ra sẽ cần phải chia chỉnh sửa hiện tại thành các thay đổi riêng trong lịch sử hoàn tác/làm lại (thử gõ i123<C-O><Esc>456<Esc>u). Thành thật mà nói, sử dụng các ánh xạ chính để chạy các lệnh theo cách này có vẻ hơi khó khăn với tôi, nhưng tôi không biết cách nào khác.

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