Em resumo:
- códigos de chave é uma maneira de representar uma chave
- Uma sequência de teclas mapeada é uma sucessão de códigos de teclas que acionam uma ação
Agora, acho que sua pergunta é mais sobre a diferença entre timeoutlen
e em ttimeoutlen
vez da diferença entre uma sequência de teclas mapeada e um código de chave.
Minha resposta é baseada neste artigo da wikia que você realmente deve ler porque aborda alguns pontos que não mencionei aqui para manter a resposta o mais curta e clara possível.
Primeiro vamos falar sobre códigos-chave. O artigo define dois tipos de códigos de chave:
Códigos de chave do terminal:
Eles são como o terminal representa uma chave.
Esses códigos que são enviados pelo terminal ao Vim.
Para obter uma lista desses códigos de chave, você deve usar a documentação do terminal. Você também pode vê-los digitando o comando cat
no seu terminal e digitando a tecla que deseja conhecer o código da tecla. Por exemplo, no meu terminal, o código da chave se ShiftF1parece com:
^[[23~
Códigos-chave do Vim:
Eles são como o vim representa uma chave.
O Vim precisa de uma maneira consistente de representar as chaves porque os códigos de chave do terminal mudam de um terminal para outro. Uma lista de códigos de chave do Vim pode ser acessada em :h t_ku
. O código-chave do Vim ShiftF1é semelhante a:
<S-F1>
Assim, quando pressiono ShiftF1o teclado, os drivers e o SO informam ao terminal que pressionei essas teclas que serão interpretadas como ^[[23~
. O terminal enviará isso ao Vim, o que entenderá o que significa <S-F1>
e acionará a ação mapeada para esse código de chave.
Podemos definir códigos de chave do Vim, portanto, se o seu terminal enviar um código de chave que o Vim não entende, <S-F1>
por exemplo, você poderá usar o seguinte comando. Isso informará ao Vim quando você receber o código-chave ^[[24~
, traduza-o <S-F1>
:
set <S-F1> ^[[24~
Então, o que é uma sequência de teclas mapeada?
Uma sequência de teclas mapeada será um lhs de um mapeamento e pode ser códigos de chave do Vim ou códigos de chave do terminal. Por exemplo:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
O primeiro mapeamento mapeará o código de chave do terminal enquanto o segundo mapeia o código de chave do Vim.
Agora, a diferença entre timeoutlen
e ttimeoutlen
?
ttimeoutlen
é o momento Vim vai esperar para as diferentes partes de um código-chave de terminal (no nosso exemplo anterior que seriam ^[
em seguida, [
em seguida 2
, etc ...
Como esses códigos de teclas são enviados pelo terminal, não deve haver um atraso entre essas entradas (uma vez que são enviados 'de uma só vez' pelo terminal). É por isso que o documento recomenda um valor muito pequeno para essa configuração.
timeoutlen
é o tempo que o Vim aguarda os códigos de chave sucessivos do Vim que são inseridos manualmente por um usuário e, portanto, é mais longo para inserir do que um código de chave do terminal.
Para usar um exemplo, digamos que:
- Você mapeou
^[[1;6B
para uma ação
^[1;6B
é o código-chave do seu terminal para ctrlshiftdown
^[
é o código-chave do seu terminal para Escape.
O comportamento que você deve esperar:
- Se você definir um tamanho grande
ttimeoutlen
, toda vez que digitar Escape, o Vim aguardará para ver se você quis dizer ^[
(ie Escape) ou ^[1;6B
(ie ctrlshiftdown)
- Se você definir um valor pequeno
ttimeoutlen
, não terá um atraso ao digitar Escapeporque o Vim saberá que é um código de chave completo.
E timeoutlen
atuará em um 'nível superior', se você tiver os seguintes mapeamentos:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
Quando você digita jvim, espera timeoutlen
não porque o início do código de chave do terminal jnão esteja completo, mas porque está aguardando o próximo código de chave do Vim.
Espero que minha explicação faça sentido, observe que alguns dos mapeamentos que usei não fazem sentido do ponto de vista funcional, mas estão aqui para facilitar a explicação.