Vim에서 remap, noremap, nnoremap 및 vnoremap 매핑 명령의 차이점은 무엇입니까?


1113

사이의 차이는 무엇입니까 remap, noremap, nnoremap및 vnoremap빔에 매핑 명령은?


1
주의 vnoremap하고 vmapVisual AND Select 모드에서 작업하십시오. 비주얼 모드에서만 맵핑을하려면 xmapand를 사용하십시오 xnoremap.
— Benoit

답변:


1626

remap매핑이 재귀 적으로 작동하도록 하는 옵션 입니다. 기본적으로 켜져 있으며 그대로 두는 것이 좋습니다. 나머지는 아래에 설명 된 매핑 명령입니다 .

:map하고 :noremap있는 재귀 및 비 - 재귀 다양한 매핑 명령의 버전. 이것이 의미하는 바는 다음과 같습니다.

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

j에 매핑됩니다 gg. Q것 도 에 매핑 할 수 gg있기 때문에, j재귀 매핑 확장됩니다. W로 매핑됩니다 j(그리고에 gg있기 때문에) j비 재귀 매핑 확장되지 않습니다.

이제 Vim은 모달 편집기 입니다. 그것은 갖는 정상 모드, 영상 모드와 다른 모드.

이러한 각 맵핑 세트에 대해 정상, 시각적, 선택 및 연산자 모드 ( 및 ), 정상 모드 ( 및 ), 시각적 모드 ( 및 ) 등에서 작동 하는 맵핑 이 있습니다 .:map:noremap:nmap:nnoremap:vmap:vnoremap

이에 대한 자세한 지침은 다음을 참조하십시오.

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

8
답변 주셔서 감사합니다! 또한 재귀는 언제 사용되며 비 재귀는 언제 사용됩니까?
— Chetan

14
@Chetan : 달성하고자하는 대상에 따라 다릅니다. 비 재귀를 더 자주 사용하는 경향이 있지만 비 재귀를 사용하여 비교적 복잡한 매핑을 정의하고 첫 번째 매핑이 수행하는 모든 작업을 수행하는 다른 매핑을 수행하는 경우 다음을 포함하는 재귀 매핑을 사용하는 것이 더 쉽습니다. 비재 귀적 인 전체를 다시 다시 입력하는 대신 원래의 것을 재조정하십시오 (특히 원본을 조정 해야하는 경우).
— DrAl

10
나는 noremap약간 반대 라고 가정 했다 map. 나는 매핑을 제거하는 것을 의미합니다. 답변 해주셔서 감사합니다. 그것은 나를 명확히했다
— Pavan Manjunath 9

4
대부분의 유스 케이스에서 그다지 중요 :map하지는 않지만 모든 모드에서 정확히 모든 공통 모드 (특히, 일반 모드, 시각적 모드, 선택 모드 및 운영자 보류 모드). 삽입, 명령 행 또는 lang-arg 모드에서 매핑을 작동 시키려면 :map!, 등 을 사용해야합니다 . (출처 : vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
— Ken Bellows

3
@whytheq noremap = 비 재귀 매핑
— Dan Bechard

281

Vim 문서는 이러한 명령의 이름을 짓는 의미를 설명해야한다고 생각합니다. 그들이하는 일만 말해도 이름을 기억하는 데 도움이되지 않습니다.

map모든 재귀 매핑 명령의 "루트"입니다. 루트 형식은 "정상", "시각적 + 선택"및 "운영자 보류"모드에 적용됩니다. ( 언어학 에서와 같이 "루트"라는 용어를 사용하고 있습니다.)

noremap모든 비 재귀 매핑 명령의 "루트"입니다. 루트 형식은와 동일한 모드에 적용됩니다 map. nore접두어가 "비 재귀"를 의미한다고 생각하십시오 .

( 삽입 및 명령 행에 적용되는 !것과 같은 모드 도 있습니다 map!.)

이 문맥에서 "재귀"의 의미는 아래를 참조하십시오.

n매핑이 작동하는 모드를 수정하는 것과 같은 모드 문자 앞에 붙일 수 있습니다. 적용 가능한 모드 목록의 하위 집합 (예 : "시각적"만)을 선택하거나 map적용 할 수없는 다른 모드 (예 : "삽입")를 선택할 수 있습니다 .

Use help map-modes는 매핑이 적용되는 모드를 제어하는 ​​방법을 설명하는 몇 가지 테이블을 보여줍니다.

모드 문자 :

  • n: 보통 만
  • v: 시각적 및 선택
  • o: 운영자 보류
  • x: 시각 만
  • s: 선택 만
  • i: 삽입
  • c: 명령 줄
  • l: insert, command-line, regexp-search (및 기타. "Lang-Arg"의사 모드라고 통칭)

" 재귀 "는 매핑이 결과로 확장 된 다음 결과가 다른 결과로 확장되는 것을 의미합니다.

다음 중 하나에 해당하면 확장이 중지됩니다.

  1. 결과는 더 이상 다른 것으로 매핑되지 않습니다.
  2. 비 재귀 매핑이 적용되었습니다 (즉 "noremap"[또는 그 중 하나]가 최종 확장 임).

이때 최종 결과의 Vim의 기본 "의미"가 적용 / 실행됩니다.

" 비 재귀 "는 매핑이 한 번만 확장되어 결과가 적용 / 실행됨을 의미합니다.

예:

 nmap K H
 nnoremap H G
 nnoremap G gg

위의 K확장 은 로 확장 된 H다음 H확장되어 G중지됩니다. 이 (가) nnoremap중지되어 즉시 확장되고 중지됩니다. 의 의미 G가 실행됩니다 (예 : "마지막 줄로 점프"). 최대 하나의 비 재귀 매핑이 확장 체인에 적용됩니다 (마지막으로 확장 될 것임).

에 대한 매핑은 G을 gg누를 경우에만 적용 G되지만 을 누를 경우에는 적용 되지 않습니다 K. 이 매핑은 재귀 적으로 매핑 K되었는지 여부 G에 관계없이 압축에 영향을 미치지 않습니다. 확장이 K중지 되는 2 행이기 때문에 3 행은 사용되지 않습니다.


4
한 가지 : map모든 모드가 아닌 일반, 시각적, 선택 및 운영자 대기 모드에만 적용됩니다.
— Brian McCutchon

1
대답을 받아 들여야합니다.
— Tycholiz

이것은 허용되는 것보다 더 나은 방법입니다.
— MilMike

19

한 가지 차이점은 다음과 같습니다.

  • :map 않는 nvo== 정상 + (+ 시각적 것은 선택) + 연산자 보류
  • :map!하지 ic + 명령 줄 모드 삽입 ==

help map-modes표에 명시된대로 .

따라서 map모든 모드에 매핑되지는 않습니다 .

당신이 모두 필요로하는 모든 모드에 매핑하려면 :map와 :map!.


5
조심해 !! viz의 command mode또 다른 역사적 이름입니다 normal mode. 채프 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). 약어 'c'는 '명령 줄'을 나타냅니다. 즉, 기본적으로 삽입 + 명령 줄 모드의 경우 lhs를 rhs에 map! lhs rhs 재귀 적으로 매핑 합니다. ~ / .vimrc에서 기본 옵션을 명시 적으로 비활성화 하지 않은 경우 입니다. 이 경우 매핑은 재귀 적이 지 않습니다 (권장되지 않음). remapset noremap[!]
— Cbhihe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.