map, noremap, abbrev 및 noreabbrev 명령의 차이점은 무엇입니까?


19

이 명령은 어떤 방식으로 한 키 스트로크를 다른 키 스트로크로 변환하지만 어떤 상황에 가장 적합한 지 다소 모호합니다. 또한 그 !변형도 있습니다. 현재 이들의 사용법은 매우 우연한 일이므로 각각의 함정이 무엇인지 알 수 있습니까? Peter Rincker로부터 명령을 사용할 때뿐만 아니라 라인의 어느 곳에서나 확장 할 수 있는 주석에서 배웠기 때문에 다양한 모드 버전에 대한 특히 유용한 정보 가 cmap있습니다 :. 잠재적 인 함정에 대해 어떤 예방책을 취할 수 있습니까?


다음 부분은 약간 메타입니다.이 사이트에서 응답 할 때 어떤 형식을 사용해야합니까? -메타에 질문하거나 질문에 추가해야하나요?
muru

나는 그것이 달려 있다고 말할 것입니다. 매핑을 시연하는 경우 항상 noremap 버전을 사용합니다. 이런 방식으로 사람들은 재귀 버전에 비 재귀 매핑을 사용하는 습관을 들이게됩니다. 물론 <Plug> 매핑과 같이 맵을 구체적으로 사용해야하는 이유가 있습니다.
akshay

답변:


21

먼저, mapnoremap각각에 대한 맵핑을 생성한다는 점에서 유사하다, 정상 시각을 선택하고 조작 모드를 보류 동시에 . Vim은 이것을 다음에서 자세히 설명합니다 :help map-overview.

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

위의 도움말에 따라 매핑을 특정 모드로 제한하려면 앞에 추가해야합니다.

'n'(일반의 경우), 'v'(시각 및 선택의 경우), 'c'(명령의 경우), 'x'(비주얼 모드의 경우), 's'(선택의 경우), 'o'(오퍼레이터 보류의 경우) ).

예를 들어

nmap n nzz

의 일반 모드, 재귀 매핑을 n만듭니다.

이제는 noremap비 재귀 버전입니다 map.

비 재귀 매핑이란 무엇입니까? Vim은 다음과 같이 대답합니다 :help map-recursive.

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

이에 대한 예는 다음을 매핑하는 것입니다.

:imap j k

:imap k j

이제 vim은 j를 k로, k를 j 무한 횟수로 대체하므로 재귀 매핑을 생성했다는 오류를 표시합니다.

그렇기 때문에 일반적으로 거의 항상 ( <Plug>매핑 또는 이와 유사한 경우 제외 ) 비 재귀 매핑을 사용 하는 것이 좋습니다 . 이렇게하면 실수로 재귀 매핑을 만들 때 Vim이 중단되는 것을 방지 할 수 있습니다. 따라서 비 재귀 매핑은 Vim에서 명령을 더 안전하게 매핑하는 방법입니다.

위의 정보를 이용 :noreabbrev하면 비 재귀 버전의 :abbrev명령 임을 알 수 있습니다 .

:abbrev삽입, 교체 및 명령 모드에서만 사용할 수 있습니다 . :abbrev약어 (Vim이 확장 할 수있는 바로 가기)를 만드는 데 사용됩니다. 짧은 확장은 :map/ :noremap을 사용하여 매핑 을 작성하거나 :abbrev/ :noreabbrev을 사용하여 약어를 작성하거나 Vim에서 입력을 확장하려는 경우입니다.


1
정지를 피하는 것이 noremap 명령 의 양식 을 사용하는 유일한 이유는 아닙니다 . 그것들을 사용해야하는 또 다른 이유 (그리고 더 중요한 이유)는 매핑을 신뢰할 수 있고 예측 가능하게 만들기 때문입니다. 일반 양식을 사용하고 rhs다른 것으로 매핑되는 키가 포함되어 있으면 매핑과 의도 한 동작이 완전히 다를 수 있습니다.
Rich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.