답변:
매핑이 예상대로 작동하지 않거나 동작하지 않는 경우 문제 해결을 위해 몇 가지 단계를 수행해야합니다.
Vim은 명령을 제공합니다 :map
. 기본적으로 (인수가 지정되지 않은 경우) 명령은 현재 작성된 모든 맵핑을 표시합니다. 다음은 명령 결과의 예입니다.
항상 의사는 당신의 친구입니다. :h map-listing
첫 번째 열에서 매핑 모드 ( n
일반 모드,
v
시각적 모드 등)를 볼 수 있고 두 번째 열에는 매핑 된 키와 키가 매핑 된 마지막 열이 표시됩니다. 맵핑 된 조치 전에 일부 추가 문자가 나타날 수 있으므로 해당 문자를 이해하는 것이 중요합니다.
*
know when to use nore
다시 매핑 할 수 없음을 나타냅니다 (즉, 재귀 매핑이 아닙니다. 이 답변의 뒷부분 참조 ).&
스크립트 로컬 매핑 만 다시 매핑 가능함을 나타냅니다.@
버퍼 로컬 매핑을 나타냅니다.매핑에 대한 도움을 요청할 때 다른 사람들이 매핑의 동작을 이해하는 데 도움이 될 수 있으므로이 정보를 추가하는 것이 좋습니다.
의 자매 명령을 특정 모드로 프롬프트를 제한 할 수 :map
같은, :vmap
, :nmap
, :omap
, 등
검색을 문제가있는 매핑으로 제한하기 위해 다음과 같이 디버깅중인 키 시퀀스를 명령의 매개 변수로 전달할 수 있습니다.
:map j
:map <Leader>m
:map <F5>
점을 유의 <Leader>
키 목록에서 실제 값으로 대체됩니다.
명령 결과 키가 올바르게 매핑되었다고 표시되면 문제가 Vim이 아니라 터미널이나 데스크톱 환경에서 발생했음을 의미합니다. Vim에서 실제로 매핑을 가로채는 지 확인 하십시오.
명령 결과에 키가 올바르게 매핑되지 않은 것으로 표시되면 다음 부분을 참조하십시오.
이 :map
명령 의 또 다른 편리한 사용법은 다음 과 결합하는 것입니다 verbose
. 매핑을 수정 한 마지막 파일이 표시됩니다.
예를 들어, 다음 두 가지 스크린 샷을 참조하십시오 :verbose map
. 첫 번째는 my에 의해 수정 된 매핑 .vimrc
이고 두 번째는 플러그인에 의해 생성 된 매핑입니다.
이제 다른 스크립트가 매핑을 수정 한 것을 확인하면 해당 스크립트를 제거하거나 동작을 수정할 수 있는지 확인해야합니다. (일부 플러그인은 매핑을 활성화 / 비활성화하는 변수를 제공하지만 불행히도 모든 플러그인이 그렇게하지는 않습니다)
매핑을 변경 한 마지막 파일이 your .vimrc
인 경우 동일한 키에 대한 매핑을 정의하는 다른 줄이 없는지 확인하십시오. .vimrc
파일 행복하게 파일의 종류의 마지막에 모든 매핑을 우선합니다.
몇 가지 상황에서 Vim이 키를 가로 채지 않을 수 있습니다.
:map
은 키가 올바르게 매핑되었지만 아무 키도 누르지 않음을 보여줍니다.다음 두 가지 중 하나 일 수 있습니다.
Vim 이전의 열쇠를 가로채는 것 : OS, 데스크탑 환경, 터미널 에뮬레이터, Tmux (사용하는 경우)와 같은 다른 응용 프로그램 일 수 있습니다 ...
이를 해결하려면 다음을 수행해야합니다.
.tmux.conf
tmux를 사용하는 경우 일시적으로 제거하십시오수퍼 유저 , 유닉스 및 리눅스 , askUbuntu 등과 같은 자매 사이트도 참조 할 수 있습니다 .
이것이 문제라면 두 가지 해결책이 있습니다. 문제를 일으키는 응용 프로그램의 동작을 변경하는 데 많은 시간을 소비하거나 다른 응용 프로그램이 가로 챌 수없는 다른 키 조합을 매핑하는 것입니다.
터미널 에뮬레이터는 매핑하려는 키 조합을 처리 할 수 없습니다 . 터미널 에뮬레이터는 다르게 구현되며 일부는 특정 키 조합을 처리 할 수 없습니다. (그들이 할 수없는 이유는이 질문의 범위를 벗어났습니다. 자세한 내용은 이전에 언급 한 의사 또는 자매 사이트를 참조하십시오).
이 경우 많은 해결책이 없습니다. 터미널이 올바르게 처리하는 다른 키를 변경하거나 터미널 에뮬레이터를 변경하십시오.
매핑의 일부 문제는 꽤 반복적이며 대부분 vimscript 구문과 관련이 있습니다. 매핑에 예기치 않은 동작이있는 경우 다음 사항을 확인하십시오.
mapping과 같은 줄 에 주석을 넣지 말고 위의 줄에 주석을 넣으십시오. 예:
그렇게하지 마십시오 :
inoremap ii <esc> " ii to go back into normal mode
Vim은 공백, "
및 주석을 매핑의 일부로 간주하여 예기치 않은 동작이 발생합니다.
대신 그렇게하십시오 :
" ii to go back into normal mode
inoremap ii <esc>
이것은 읽기 쉽고 매핑을 엉망으로 만들지 않습니다.
로 명령을 파이프하지 마십시오|
. 예:
그렇게하지 마십시오 :
nnoremap <Leader>x :w | !% python -m json.tools
Vim은 파이프 |
를 명령 종료로 간주합니다 . 소스를 .vimrc
매핑 nnoremap <Leader>x :w
하면 매핑 이 생성되고 외부 명령 !% python -m json.tools
이 실행됩니다.
대신 그렇게하십시오 :
nnoremap <Leader>x :w <bar> !% python -m json.tools
에 대한 설명을<bar>
참조하십시오 .
사용할 때 알고 nore
: 항상 .
LearnVimscriptTheHardWay 꽤 명확하게 설명 : 사용하지 마십시오 map
, nmap
, vmap
, 등 ... 항상 NORE 버전을 선호하지 : noremap
, nnoremap
, vnoremap
, 등 ... 왜? 매핑의 nore
의미는 non-recursive
매핑을 다시 매핑하더라도 매핑의 오른쪽이 내장 기능으로 간주됨을 의미합니다. 예:
>
줄을 삭제하고 줄 -
의 들여 쓰기를 늘리기 위해 매핑하려고한다고 가정하겠습니다 . 비 재귀 매핑을 사용하지 않으면 다음을 수행하십시오.
( 예를 들어하지 마십시오 )
nmap > dd
nmap - >
당신이 명중 것이다 때 >당신의 라인이 삭제됩니다, 그것은 좋다. 당신이 명중 것이다 때 -당신의 라인을 대신 들여 쓰기되는 삭제됩니다. 왜? 빔 이해하기 때문에 "나는에 타격받은 -
나는 번역해야하는 >
I는, 차례 차례로, 번역해야하는가 dd
".
대신 그렇게
nnoremap > dd
nnoremap - >
이런 식으로 Vim은로 번역 -
하고 >
다른 번역을 시도하지 않습니다 nore
.
편집 노트 "항상"은 경우에 따라 과장된 대답 일 수 있지만 재귀 매핑 양식을 사용해야하지만 실제로는 일반적이지 않습니다. 명확히하기 위해이 답변 에서 @romainl을 인용하겠습니다 .
맵핑에 다른 맵핑을 사용하려는 경우에만 순환 맵핑을 사용하십시오. 그렇지 않은 경우 비 재귀 매핑을 사용하십시오.
일부 키 조합은 동일하다는 점을 기억하십시오 . 생성 된 16 진 코드로 인해 일부 키 조합은 Vim에서 다른 키로 해석됩니다. 예를 들어
<C-h>
에 해당 <backspace>
<C-j>
같이 <enter>
<M-a>
는 á
모든 <m-
매핑 과 동일하며 동일
합니다. @LucHermitte가 주석에서 지적했듯이 vim-latex와 같은 이러한 유형의 매핑을 사용하는 플러그인에 문제가 있습니다.<C-S-a>
와 같습니다
<C-a>
. 터미널이 ASCII 코드를 보내는 방식으로 인해 Ctrl + 대문자를 Ctrl + 소문자와 별도로 매핑 할 수 없습니다.매핑이 다른 키에 영향을 미치는 것 같으면 다른 lhs 조합을 사용해보십시오. 그래도 문제가 해결되면 어떤 16 진 코드가 Vim으로 전송되는지 검사하십시오.
리더가 올바르게 정의되어 있는지 확인하십시오 . 관련된 매핑이<leader>
작동하지 않고 명령으로 리더를 변경한 경우 매핑 정의 전에mapleader
리더 정의가 완료되었는지 확인하십시오. 그렇지 않으면, Vim은 생각하지 않는 키를 사용하여 매핑을 만들려고 시도합니다. 또한 스페이스 바를 리더로 사용하려면 (현재 최신 상태 임) 올바른 표기법을 사용했는지 확인하십시오.let mapleader = "\<Space>"
이 답변의 모든 단계를 수행 한 후에도 원하는 방식으로 매핑이 작동하지 않으면이 사이트에 대한 도움을 요청하는 것이 좋습니다.
사람들이 다음과 같은 중요한 정보를 제공하는 것을 기억하도록 도와줍니다.
문제에 대한 정확한 설명 :
"작동하지 않습니다"는 당신을 도와 주려는 사람들에게는 실제로 도움이되지 않습니다. 매핑이 아무 것도하지 않거나 예상 한 것과 다르게 동작하는 경우 정확해야합니다.
:map
및:verbose map
이 모든 것이 당신과 사이트의 사용자들을 많은 시간을 절약 할 것입니다.
:unmap
때로는 Vim을 종료하지 않고 매핑을 재설정하여 동작 디버깅에 도움이 될 수 있습니다.
그렇게하기 위해 명령 :unmap <key>
을 사용하여 <key>
Normal, Visual 및 Operating-pending 모드에 할당 된 매핑을 제거 할 수 있습니다. :iunmap
삽입 모드에 대한 매핑을 제거합니다. 다른 모드에 대해서는를 참조하십시오 :help :unmap
.
매핑에 대한 훌륭한 소개 : vimscriptthehardway를 배우십시오 (Vim의 다른 많은 측면들)
의사 : :h mapping
,
:h :map
Vim의 FAQ 섹션 20은 매핑에 관한 것이며 흥미로운 질문이 있습니다.
<m-i>
및 é
정력에 대해 동일, 모든 메타 + 키와 동일합니다 : 그들은 다른 분음 부호로 연결됩니다.
:map {sequence}
->은이 *
역 하이라이트에 연관된 행동 이전에 어떤 정력 인쇄에.
:debug normal {keysequence}
(모든 쾅없이), 또는 :debug i{keysequence}
키 시퀀스가 특수 키 같은 것들 (포함 된 경우 등, 삽입 모드 매핑에 대한 <cr>
, <left>
, <c-x>
, <m-i>
, <leader>
...)를. 그런 다음 execute + double-quotes + backslash->를 사용해야합니다 :debug execute "normal \<leader>\<cr>Z"
.
<m-i>
. 대부분의 사용자는 메타 키를 간단하게 사용할 수없는 터미널에서 Vim을 실행하는 데 중점을두기 때문에 메타 키를 사용하지 않습니다. 문제를 확인하려면 gvim 또는 macvim을 사용해야합니다.
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
나는 그렇게 매핑에 대한 중복 된 질문의 수를 줄일 수 있도록해야 이러한 이유를 수집, 내 질문의 첫 번째 줄에 말했듯이.