한마디로 :
- 키코 드는 키를 나타내는 방법입니다
- 매핑 된 키 시퀀스는 동작을 트리거하는 일련의 키 코드입니다.
이제 귀하의 질문은 매핑 된 키 시퀀스와 키 코드의 차이점 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 키 코드를 매핑합니다.
이제 사이의 차이 timeoutlen
와 ttimeoutlen
?
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 키 코드를 대기하기 때문에 대기하지 않습니다.
내 설명이 이해되기를 바랍니다. 내가 사용한 일부 매핑은 기능적인 관점에서 의미가 없지만 설명의 편의를 위해 여기에 있습니다.