매핑을 디버깅하는 방법?


65

여기에서 사용자가 작동하지 않는 매핑이 있고 대부분의 경우 그 이유는 매우 비슷한 많은 질문이 있습니다.

나는이 질문을 이런 종류의 질문에 대한 참조로 만들고 매핑을 디버그하는 완전한 절차를 제공하는 것이 좋습니다. 사용자가 매핑 관련 문제인 경우 가장 일반적인 문제를 제거하기 위해 여기로 리디렉션 될 수 있습니다.

물론 전용 질문이 필요하고 여기서 다루지 않는 특별한 경우가 여전히 있습니다.

답변:


88

매핑이 예상대로 작동하지 않거나 동작하지 않는 경우 문제 해결을 위해 몇 가지 단계를 수행해야합니다.

키가 수행해야하는 작업에 효과적으로 매핑되어 있는지 확인

Vim은 명령을 제공합니다 :map. 기본적으로 (인수가 지정되지 않은 경우) 명령은 현재 작성된 모든 맵핑을 표시합니다. 다음은 명령 결과의 예입니다.

<code> : map </ code>의 결과

항상 의사는 당신의 친구입니다. :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이고 두 번째는 플러그인에 의해 생성 된 매핑입니다.

vimrc에서 매핑 세트

플러그인에서 매핑 설정

이제 다른 스크립트가 매핑을 수정 한 것을 확인하면 해당 스크립트를 제거하거나 동작을 수정할 수 있는지 확인해야합니다. (일부 플러그인은 매핑을 활성화 / 비활성화하는 변수를 제공하지만 불행히도 모든 플러그인이 그렇게하지는 않습니다)

매핑을 변경 한 마지막 파일이 your .vimrc인 경우 동일한 키에 대한 매핑을 정의하는 다른 줄이 없는지 확인하십시오. .vimrc파일 행복하게 파일의 종류의 마지막에 모든 매핑을 우선합니다.

Vim이 매핑을 실제로 가로채는 지 확인하십시오.

몇 가지 상황에서 Vim이 키를 가로 채지 않을 수 있습니다.

  • 이 명령 :map은 키가 올바르게 매핑되었지만 아무 키도 누르지 않음을 보여줍니다.
  • 매핑은 gVim (GUI)에서 작동하지만 터미널 Vim에서는 아무 것도 수행하지 않습니다.
  • 매핑은 정의 된 터미널 에뮬레이터에서 작동하지만 다른 터미널 에뮬레이터에서는 작동하지 않습니다.
  • 매핑은 정의 된 OS에서는 작동하지만 다른 OS에서는 작동하지 않습니다.

다음 두 가지 중 하나 일 수 있습니다.

  • Vim 이전의 열쇠를 가로채는 것 : OS, 데스크탑 환경, 터미널 에뮬레이터, Tmux (사용하는 경우)와 같은 다른 응용 프로그램 일 수 있습니다 ...

    이를 해결하려면 다음을 수행해야합니다.

    • .tmux.conftmux를 사용하는 경우 일시적으로 제거하십시오
    • 터미널 또는 데스크탑 환경의 문서를 참조하십시오.

    수퍼 유저 , 유닉스 및 리눅스 , 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은 매핑에 관한 것이며 흥미로운 질문이 있습니다.

보너스 : 매핑에 사용할 키를 찾는 모범 사례에 대한 질문


2
중재자가 제안한대로 다른 사용자와 경험을 공유 합니다. 그리고 때문에 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나는 그렇게 매핑에 대한 중복 된 질문의 수를 줄일 수 있도록해야 이러한 이유를 수집, 내 질문의 첫 번째 줄에 말했듯이.
statox

1
반복되는 VIM-라텍스와 프랑스어 키보드가있는 문제 : <m-i>é정력에 대해 동일, 모든 메타 + 키와 동일합니다 : 그들은 다른 분음 부호로 연결됩니다.
Luc Hermitte

1
그것은 우리가 그들의 정의를 요청할 때 버퍼 로컬 매핑을 읽는 방법을 아는 것도 중요합니다 :map {sequence}->은이 *역 하이라이트에 연관된 행동 이전에 어떤 정력 인쇄에.
Luc Hermitte

2
때때로 우리는 실제로 일어나는 일을 디버깅하고 싶습니다. 일반적으로 매핑이 플러그 매핑 또는 기억하기 어려운 이름이나 복잡한 매개 변수를 가진 함수를 호출 할 때. 이 경우 우리는 실행할 수 있습니다 :debug normal {keysequence}(모든 쾅없이), 또는 :debug i{keysequence}키 시퀀스가 특수 키 같은 것들 (포함 된 경우 등, 삽입 모드 매핑에 대한 <cr>, <left>, <c-x>, <m-i>, <leader>...)를. 그런 다음 execute + double-quotes + backslash->를 사용해야합니다 :debug execute "normal \<leader>\<cr>Z".
Luc Hermitte

2
메타 시퀀스와 관련하여 vim-latex가와 같은 것을 사용하기로 선택했기 때문에 이것은 FAQ의 오래된 지점입니다 <m-i>. 대부분의 사용자는 메타 키를 간단하게 사용할 수없는 터미널에서 Vim을 실행하는 데 중점을두기 때문에 메타 키를 사용하지 않습니다. 문제를 확인하려면 gvim 또는 macvim을 사용해야합니다.
Luc Hermitte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.