"매핑 된 키 시퀀스"와 "키 코드"의 차이점은 무엇입니까? (timeoutlen v ttimeoutlen)


20

정력 설명서는 우리가 사용할 수있는 말합니다 timeoutlen의 제한 시간 길이 지정 매핑 키 시퀀스를 사용할 수 ttimeoutlen의 제한 시간 길이를 지정하는 키 코드를 :

유용한 설정은

:set timeout timeoutlen=3000 ttimeoutlen=100

(3 초 후 매핑 시간 초과, 10 초 후 키 코드 시간 초과).

키 코드 란 무엇입니까 ? 그것들은 매핑 된 키 시퀀스와 어떻게 다릅니 까?

매핑 된 키 시퀀스의 예 jk는 아래 매핑에서 온 것입니다.

inoremap jk <esc>

이 예제에서 삽입 모드 및 유형 j에있을 때 vim은 의도를 결정하기 전에 timeoutlen밀리 초 동안 기다릴 것 k입니다.

그러나 키 코드 란 무엇 이며 어떻게 ttimeoutlen영향을 미칩니 까? 감사합니다.

답변:


22

한마디로 :

  • 키코 드는 키를 나타내는 방법입니다
  • 매핑 된 키 시퀀스는 동작을 트리거하는 일련의 키 코드입니다.

이제 귀하의 질문은 매핑 된 키 시퀀스와 키 코드의 차이점 timeoutlen과 차이점에 대한 것이 아니라고 생각합니다 ttimeoutlen.

내 대답은 이 위키 기사 에 기반 을두고 있으며, 대답을 최대한 짧고 명확하게하기 위해 여기에 언급하지 않은 몇 가지 사항을 다루기 때문에 실제로 읽어야합니다.


먼저 키 코드에 대해 이야기합시다. 이 기사는 두 가지 유형의 키 코드를 정의합니다.

  • 터미널 키 코드 :

    터미널이 키를 나타내는 방식입니다.

    이 코드는 터미널에서 Vim으로 전송됩니다.

    이러한 키 코드 목록을 얻으려면 터미널 설명서를 사용해야합니다. cat터미널 에서 명령 을 입력하고 키 코드를 알고 자하는 키를 입력하여 확인할 수도 있습니다. 예를 들어 터미널에서 키 코드는 ShiftF1다음과 같습니다.

    ^[[23~

  • Vim 키 코드 :

    그들은 vim이 열쇠를 나타내는 방법입니다.

    터미널의 키 코드가 터미널에서 다른 것으로 변경되기 때문에 Vim은 키를 나타내는 일관된 방법이 필요합니다. Vim 키 코드 목록은에서 액세스 할 수 있습니다 :h t_ku. Vim 키코 드는 ShiftF1다음과 같습니다.

    <S-F1>

따라서 ShiftF1키보드를 누를 때 드라이버와 OS는 터미널에서이 키를 눌렀 음을 해석하도록 알려줍니다 ^[[23~. 터미널은이를 Vim에 전송 <S-F1>하여이 키 코드에 매핑 된 동작을 의미 하고 트리거 함을 이해합니다 .

Vim 키 코드를 설정할 수 있으므로 터미널에서 Vim이 이해할 수없는 키 코드를 보내면 <S-F1>다음 명령을 사용할 수 있습니다. 키 코드를 받으면 Vim에 다음 ^[[24~과 같이 번역합니다 <S-F1>.

set <S-F1> ^[[24~

그렇다면 매핑 된 키 시퀀스는 무엇입니까?

매핑 된 키 시퀀스는 1h의 매핑이며 Vim 키 코드 또는 터미널 키 코드 일 수 있습니다. 예를 들면 다음과 같습니다.

:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>

첫 번째 매핑은 터미널 키 코드를 매핑하고 두 번째 매핑은 Vim 키 코드를 매핑합니다.

이제 사이의 차이 timeoutlenttimeoutlen?

  • ttimeoutlen빔 될 것이라고 우리 앞의 예에서 터미널 키 코드의 다른 부분 (기다리는 시간입니다 ^[다음 [다음 2등 ...

    이 키코 드는 터미널에서 전송되므로 이러한 입력 사이에 지연이 없어야합니다 (터미널이 '한 번에'전송하기 때문에). 이것이 문서가이 설정에 대해 아주 작은 값을 권장하는 이유입니다.

  • timeoutlen Vim이 사용자가 수동으로 입력하는 연속적인 Vim 키 코드를 기다리는 시간이므로 터미널 키 코드보다 입력 시간이 더 깁니다.

예제를 사용하려면 다음과 같이 말하십시오.

  • ^[[1;6B액션에 매핑 했습니다
  • ^[1;6B 터미널의 키 코드입니다 ctrlshiftdown
  • ^[의 터미널 키 코드입니다 Escape.

예상되는 동작 :

  • 당신은 큰 설정하면 ttimeoutlen, 사용자가 입력 할 때마다 Escape, 빔는 의미가 있는지 확인하기 위해 대기합니다 ^[(예 Escape) 또는 ^[1;6B(예 ctrlshiftdown)
  • small을 설정하면 ttimeoutlen입력 할 때 지연이 발생하지 않습니다. EscapeVim은 완전한 키 코드임을 알 수 있기 때문입니다.

그리고 timeoutlen,는 '높은 수준'의 역할을 다음과 같은 매핑이있는 경우 :

inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>

jvim 을 입력 timeoutlen하면 터미널 키 코드의 시작이 j완료되지 않아서 다음 Vim 키 코드를 대기하기 때문에 대기하지 않습니다.


내 설명이 이해되기를 바랍니다. 내가 사용한 일부 매핑은 기능적인 관점에서 의미가 없지만 설명의 편의를 위해 여기에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.