Sự khác biệt giữa các lệnh ánh xạ remap, noremap, nnoremap và vnoremap trong Vim là gì?


1113

Phần chênh lệch giữa là gì remap, noremap, nnoremapvnoremaplệnh ánh xạ trong Vim?


1
Thận trọng vnoremapvmaplàm việc trong chế độ Visual AND Chọn. Để có một ánh xạ chỉ trong chế độ Visual, sử dụng xmapxnoremap.
Benoit

Câu trả lời:


1627

remaplà một tùy chọn làm cho ánh xạ hoạt động đệ quy. Theo mặc định, nó được bật và tôi khuyên bạn nên để nó như vậy. Phần còn lại là các lệnh ánh xạ , được mô tả dưới đây:

:map:noremaplà các phiên bản đệ quykhông đệ quy của các lệnh ánh xạ khác nhau. Điều đó có nghĩa là nếu bạn làm:

:map j gg
:map Q j
:noremap W j

jsẽ được ánh xạ tới gg. cũngQ sẽ được ánh xạ tới , vì sẽ được mở rộng cho ánh xạ đệ quy. sẽ được ánh xạ tới (và không ) vì sẽ không được mở rộng cho ánh xạ không đệ quy.ggjWjggj

Bây giờ hãy nhớ rằng Vim là một trình soạn thảo phương thức . Nó có chế độ bình thường , chế độ trực quan và các chế độ khác.

Đối với mỗi bộ ánh xạ này, có một ánh xạ hoạt động ở chế độ bình thường, trực quan, chọn và vận hành ( :map:noremap), một chế độ hoạt động ở chế độ bình thường ( :nmap:nnoremap), một ở chế độ trực quan ( :vmap:vnoremap), v.v.

Để được hướng dẫn thêm về điều này, xem:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

8
Cảm ơn câu trả lời của bạn! Ngoài ra, khi nào đệ quy được sử dụng và khi nào không sử dụng đệ quy?
Chetan

14
@Chetan: Nó phụ thuộc vào những gì bạn muốn đạt được. Tôi có xu hướng sử dụng không đệ quy thường xuyên hơn, nhưng nếu bạn đã xác định ánh xạ tương đối phức tạp bằng cách sử dụng không đệ quy và một ánh xạ khác thực hiện mọi thứ mà ánh xạ đầu tiên thực hiện và hơn thế nữa, có thể dễ dàng sử dụng ánh xạ đệ quy bao gồm bản gốc thay vì gõ lại toàn bộ bản không đệ quy một lần nữa (đặc biệt nếu sau đó bạn cần phải chỉnh bản gốc).
DrAl

10
Tôi đã giả định noremaplà một số ngược lại map. Tôi có nghĩa là một cái gì đó loại bỏ một bản đồ. Cảm ơn câu trả lời. Nó làm rõ tôi
Pavan Manjunath

4
Điều này không quan trọng đối với phần lớn các trường hợp sử dụng, nhưng cần lưu ý rằng :map, v.v. không hoạt động ở tất cả các chế độ, chính xác, chỉ tất cả các chế độ phổ biến (cụ thể là chế độ bình thường, chế độ trực quan, chế độ chọn và chế độ chờ vận hành). Nếu bạn muốn ánh xạ hoạt động ở chế độ chèn, dòng lệnh hoặc lang-arg, bạn cần sử dụng :map!, v.v. (Nguồn: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows

3
@whytheq noremap = ánh xạ không đệ quy
Dan Bechard

281

Tôi nghĩ rằng tài liệu Vim nên đã giải thích ý nghĩa đằng sau việc đặt tên của các lệnh này. Chỉ nói cho bạn biết những gì họ làm không giúp bạn nhớ tên.

maplà "gốc" của tất cả các lệnh ánh xạ đệ quy. Biểu mẫu gốc áp dụng cho các chế độ "bình thường", "trực quan + chọn" và "chờ toán tử". (Tôi đang sử dụng thuật ngữ "root" như trong ngôn ngữ học .)

noremaplà "gốc" của tất cả các lệnh ánh xạ không đệ quy. Các hình thức gốc áp dụng cho các chế độ tương tự như map. (Hãy nghĩ về noretiền tố có nghĩa là "không đệ quy".)

(Lưu ý rằng cũng có các !chế độ như thế map!áp dụng cho chèn & dòng lệnh.)

Xem bên dưới để biết "đệ quy" nghĩa là gì trong bối cảnh này.

Chuẩn bị một chữ cái chế độ như nsửa đổi các chế độ mà ánh xạ hoạt động. Nó có thể chọn một tập hợp con của danh sách các chế độ áp dụng (ví dụ: "trực quan") hoặc chọn các chế độ khác mapkhông áp dụng cho (ví dụ: "chèn").

Sử dụng help map-modessẽ chỉ cho bạn một vài bảng giải thích cách kiểm soát chế độ mà ánh xạ áp dụng.

Chế độ chữ:

  • n: chỉ bình thường
  • v: trực quan và chọn
  • o: nhà điều hành đang chờ xử lý
  • x: Chỉ nhìn
  • s: chỉ chọn
  • i: chèn
  • c: dòng lệnh
  • l: insert, dòng lệnh, regrec-search (và các loại khác. Gọi chung là chế độ giả "Lang-Arg")

" Đệ quy " có nghĩa là ánh xạ được mở rộng thành kết quả, sau đó kết quả được mở rộng sang kết quả khác, v.v.

Việc mở rộng dừng lại khi một trong những điều này là đúng:

  1. kết quả không còn được ánh xạ tới bất cứ điều gì khác.
  2. một ánh xạ không đệ quy đã được áp dụng (tức là "noremap" [hoặc một trong ilk của nó] là bản mở rộng cuối cùng).

Tại thời điểm đó, "ý nghĩa" mặc định của kết quả cuối cùng được áp dụng / thực thi.

" Không đệ quy " có nghĩa là ánh xạ chỉ được mở rộng một lần và kết quả đó được áp dụng / thực thi.

Thí dụ:

 nmap K H
 nnoremap H G
 nnoremap G gg

Các nguyên nhân trên Kđể mở rộng đến H, sau đó Hmở rộng đến Gvà dừng lại. Nó dừng lại vì nnoremap, mở rộng và dừng lại ngay lập tức. Ý nghĩa của Gsẽ được thực thi (tức là "nhảy đến dòng cuối cùng"). Nhiều nhất một ánh xạ không đệ quy sẽ được áp dụng trong chuỗi mở rộng (nó sẽ là lần mở rộng cuối cùng xảy ra).

Các bản đồ của Gđể ggchỉ áp dụng nếu bạn bấm G, nhưng không nếu bạn bấm K. Ánh xạ này không ảnh hưởng đến việc nhấn Kbất kể có Gđược ánh xạ đệ quy hay không, vì dòng 2 khiến việc mở rộng bị Kdừng lại, vì vậy dòng 3 sẽ không được sử dụng.


4
Một điều: mapchỉ áp dụng cho các chế độ thông thường, trực quan, chọn và vận hành, không áp dụng cho tất cả các chế độ.
Brian McCutchon

1
nên được chấp nhận trả lời.
Tycholiz

Đây là một cách trả lời tốt hơn so với chấp nhận.
MilMike

19

Một sự khác biệt là:

  • :map does nvo== normal + (visual + select) + toán tử đang chờ xử lý
  • :map!hiện ic == insert + chế độ dòng lệnh

như đã nêu trên help map-modesbảng.

Vì vậy: mapkhông ánh xạ tới tất cả các chế độ .

Để ánh xạ tới tất cả các chế độ, bạn cần cả hai :map:map!.


5
Cẩn thận !! command modelà một tên lịch sử khác cho normal modeviz. chapt 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). Chữ viết tắt 'c' là cho 'dòng lệnh'. Nói cách khác, theo mặc định: ánh xạ map! lhs rhs đệ quy lhs sang rhs cho chế độ insert + lệnh-LINE . Đó là trừ khi remaptùy chọn mặc định bị vô hiệu hóa rõ ràng với set noremap[!]in / / .vimrc. Trong trường hợp đó ánh xạ sẽ không được đệ quy (không nên).
Cbhihe
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.