¿Cuál es la diferencia entre "secuencias de teclas asignadas" y "códigos de teclas"? (timeoutlen v ttimeoutlen)


20

El manual de vim dice que podemos usar timeoutlenpara especificar la duración del tiempo de espera de las secuencias de teclas asignadas y podemos usar ttimeoutlenpara especificar la duración del tiempo de espera de los códigos de tecla :

Una configuración útil sería

:set timeout timeoutlen=3000 ttimeoutlen=100

(tiempo de espera en el mapeo después de tres segundos, tiempo de espera en códigos clave después de una décima de segundo).

¿Qué son los códigos clave ? ¿En qué se diferencian de las secuencias de teclas asignadas ?

Sé que un ejemplo de una secuencia de teclas asignada es jkde la siguiente asignación:

inoremap jk <esc>

En este ejemplo, cuando estoy en modo de inserción y tipo j, vim esperará timeoutlenmilisegundos para que presione kantes de decidir cuál es mi intención.

Pero, ¿qué es un código clave y cómo lo ttimeoutlenafecta? Gracias.

Respuestas:


22

En breve:

  • los códigos clave son una forma de representar una clave
  • Una secuencia de teclas asignada es una sucesión de códigos clave que activan una acción.

Ahora creo que su pregunta es más sobre la diferencia entre timeoutleny en ttimeoutlenlugar de la diferencia entre una secuencia de teclas asignada y un código de tecla.

Mi respuesta se basa en este artículo de wikia que realmente debería leer porque aborda algunos puntos que no mencioné aquí para mantener la respuesta lo más breve y clara posible.


Primero hablemos de los códigos clave. El artículo define dos tipos de códigos clave:

  • Códigos clave del terminal:

    Son cómo el terminal representa una clave.

    Estos códigos que son enviados por el terminal a Vim.

    Para obtener una lista de estos códigos de teclas, debe usar la documentación de su terminal. También puede verlos escribiendo el comando caten su terminal y escribiendo la clave que desea conocer el código clave. Por ejemplo, en mi terminal, el código clave para ShiftF1parece:

    ^[[23~

  • Vim códigos clave:

    Son cómo vim representa una clave.

    Vim necesita una forma consistente de representar las claves porque los códigos de clave de la terminal cambian de una terminal a otra. Se puede acceder a una lista de códigos de teclas de Vim en :h t_ku. El código clave de Vim para ShiftF1parece:

    <S-F1>

Por lo tanto, cuando ShiftF1presiono mi teclado, los controladores y el sistema operativo le informarán al terminal que presioné estas teclas que interpretará ^[[23~. El terminal lo enviará a Vim, lo que comprenderá que significa <S-F1>y activará la acción asignada a este código clave.

Podemos establecer códigos de teclas de Vim, por lo que si su terminal envía un código de clave que Vim no entiende, <S-F1>por ejemplo, puede usar el siguiente comando. Esto le dirá a Vim cuando reciba el código clave ^[[24~, traducirlo tiene <S-F1>:

set <S-F1> ^[[24~

Entonces, ¿qué es una secuencia de teclas asignada?

Una secuencia de teclas asignada será un lhs de una asignación y puede ser códigos de teclas Vim o códigos de teclas de Terminal. Por ejemplo:

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

La primera asignación asignará el código clave del terminal, mientras que la segunda asignará el código clave Vim.

Ahora para la diferencia entre timeoutleny ttimeoutlen?

  • ttimeoutlenes el momento de Vim esperar a que las diferentes partes de un terminal de códigos de teclas (en nuestro ejemplo anterior que serían ^[luego [a continuación 2, etc ...

    Como estos códigos clave son enviados por el terminal, no debe haber un retraso entre estas entradas (ya que el terminal los envía 'todos a la vez'). Esta es la razón por la cual el documento recomienda un valor realmente pequeño para esta configuración.

  • timeoutlen es el tiempo que Vim esperará por los códigos de tecla de Vim sucesivos que un usuario ingresa manualmente y, por lo tanto, es más largo de ingresar que un código clave de terminal.

Para usar un ejemplo, digamos que:

  • Mapeaste ^[[1;6Ba una acción
  • ^[1;6B es el código clave de su terminal para ctrlshiftdown
  • ^[es el código clave de su terminal para Escape.

El comportamiento que debe esperar:

  • Si establece un valor grande ttimeoutlen, cada vez que escribe Escape, Vim esperará para ver si quiso ^[decir (es decir Escape) o ^[1;6B(es decir ctrlshiftdown)
  • Si configura un pequeño ttimeoutlen, no tendrá un retraso cuando escriba Escapeporque Vim sabrá que es un código clave completo.

Y timeoutlenactuará en un 'nivel superior', si tiene las siguientes asignaciones:

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

Cuando escriba jvim esperará timeoutlenno porque el comienzo del código clave del terminal jno esté completo sino porque está esperando el siguiente código clave Vim.


Espero que mi explicación tenga sentido, tenga en cuenta que algunas de las asignaciones que utilicé no tienen sentido desde un punto de vista funcional, pero están aquí para su conveniencia.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.