Qual é a diferença entre "sequências de teclas mapeadas" e "códigos de teclas"? (timeoutlen v ttimeoutlen)

20

O manual do vim diz que podemos usar timeoutlenpara especificar o tempo limite das seqüências de chaves mapeadas e ttimeoutlenpara especificar o tempo limite dos códigos de chave :

Uma configuração útil seria

:set timeout timeoutlen=3000 ttimeoutlen=100

(tempo limite no mapeamento após três segundos, tempo limite nos códigos-chave após um décimo de segundo).

O que são códigos de chave ? Como eles são diferentes das seqüências de teclas mapeadas ?

Eu sei que um exemplo de uma sequência de teclas mapeada é jkdo mapeamento abaixo:

inoremap jk <esc>

Neste exemplo, quando estou no modo e tipo de inserção j, o vim aguarda timeoutlenmilissegundos para que eu pressione kantes de decidir qual é minha intenção.

Mas o que é um código-chave e como isso o ttimeoutlenafeta? Te agradece.

Niko Bellic
fonte

Respostas:

22

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 timeoutlene em ttimeoutlenvez 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 catno 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 timeoutlene 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;6Bpara 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 timeoutlenatuará em um 'nível superior', se você tiver os seguintes mapeamentos:

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

Quando você digita jvim, espera timeoutlennã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.

statox
fonte