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


1113

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


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가 실행됩니다 (예 : "마지막 줄로 점프"). 최대 하나의 비 재귀 매핑이 확장 체인에 적용됩니다 (마지막으로 확장 될 것임).

에 대한 매핑은 Ggg누를 경우에만 적용 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.