¿Cómo averiguar a qué se asigna una clave?

13

Sé que ejecutar :mapcomandos sin argumentos debería darme una lista de asignaciones definidas por el usuario, pero, por ejemplo, cuando presiono Ctrl-W Ctrl-I ocurre algo, sin embargo, no tengo idea de qué función acaba de suceder como asignaciones incorporadas no aparece en los :mapcomandos.

¿Cómo puedo saber qué hace una llave?

Wombat loco
fuente
Quizás ¿Cómo navego a los temas en la documentación de Vim? es útil ;-)
Martin Tournoij
Realmente no. En emacs, puedo ir Ctrl-H k presionar la tecla que quiero saber y me dará la información de enlace. Vim parece carecer de esa función. ¿Cómo puedo saber a qué se asigna una combinación de teclas en particular?
Mad Wombat
¿Leíste el duplicado marcado? Porque eso le indica cómo consultar el sistema de ayuda de Vim para obtener esta información (enumere el elemento no. 8): :help CTRL-W_CTRL-Io:help CTRL-W_i
Martin Tournoij
2
He votado para volver a abrir porque la forma de la pregunta posterior a la edición tiene una respuesta útil diferente (": mapa <Teclas> para imprimir asignaciones activas") de lo que está en el duplicado actualmente vinculado sobre la navegación de ayuda.
1
Pero el OP parece saber eso, es su primera frase. Sería bueno para Vim tener una manera de mostrar (de manera similar) todas las teclas no asignadas, es decir, lo que hacen de forma predeterminada.
VanLaser

Respuestas:

10

No puedes

Aquí está el código fuente C para lo que <C-w><C-i>hace:

normal.c:

/*
 * This table contains one entry for every Normal or Visual mode command.
 * The order doesn't matter, init_normal_cmds() will create a sorted index.
 * It is faster when all keys from zero to '~' are present.
 */
static const struct nv_cmd
{
    int         cmd_char;       /* (first) command character */
    nv_func_T   cmd_func;       /* function for this command */
    short_u     cmd_flags;      /* NV_ flags */
    short       cmd_arg;        /* value for ca.arg */
} nv_cmds[] =
{

[...]

    {Ctrl_W,    nv_window,      0,                      0},
};

[...]

/*
 * CTRL-W: Window commands
 */
    static void
nv_window(cmdarg_T *cap)
{
    if (!checkclearop(cap->oap))
        do_window(cap->nchar, cap->count0, NUL); /* everything is in window.c */
}

window.c:

/*
 * all CTRL-W window commands are handled here, called from normal_cmd().
 */
    void
do_window(
[..]
) {
    switch (nchar)
    {
[..]
    case 'i':                       /* Go to any match */
    case Ctrl_I:
                type = FIND_ANY;
                /* FALLTHROUGH */

[..]
    default:    beep_flush();
                break;

No estoy completamente seguro de dónde typese recoge la variable, no tenía ganas de buscar eso, pero el punto es que no hay una facilidad real para decir "esta clave está asignada a esta funcionalidad". Básicamente, es solo un structmapeo charde una función, ¡y la implementación de la segunda pulsación de tecla ( <C-i>) es simplemente fealdad ad-hoc!

Esto es diferente de Emacs, donde (supongo) que todo está en Lisp, y sus asignaciones personalizadas no son diferentes de las asignaciones predeterminadas de Emacs. Pero en Vim usted tiene mapeos "mágicos" proporcionados por el código C que mapean contra funciones C que nunca están expuestas en Vim. Siempre digo que Vim tiene la mejor idea, pero Emacs tiene la mejor implementación ;-)

Entonces, la única forma es buscarlo en los archivos de ayuda. Es por eso que cerré esto como un duplicado de Cómo navego a los temas en la documentación de Vim, ya que esa es la única respuesta práctica que alguien puede dar. De hecho, se podría argumentar que se podría dar una explicación más profunda de la pregunta (como acabo de hacer), y si hubiera argumentado que , en lugar de dar la respuesta (ahora eliminada), probablemente habría dicho "usted" de nuevo, perdón por el error "y lo volví a abrir ;-)

En cualquier caso, para ilustrar brevemente las convenciones con algunos ejemplos:

  • :help w- mapeo en modo normal para w(mayúsculas y minúsculas);
  • :help g8- mapeo en modo normal para g8;
  • :help v_o- mapeo de modo visual para o; otros modos son cpara línea de comandos y ipara inserción;
  • :help CTRL-W- mapeo en modo normal para <C-w>;
  • :help i_CTRL-W- mapeo de modo de inserción para <C-w>;
  • :help CTRL-W_CTRL-I- mapeo en modo normal para <C-w><C-i>;
  • :help i_CTRL-G_<Down>- Insertar mapeo de modo para <C-g><Down>.
Martin Tournoij
fuente
1
Un punto importante acerca de: la ayuda que siempre parece omitirse es lo que se llama commandline completionen vim help usando CTRL-D (lo llamo "buscar en ayuda"). Escriba :h CTRL-Wa continuación, pulse <Ctrl-D>, y obtendrá una lista de todos los comandos que contienen la cadena "CTRL-W", por ejemplo, CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Escriba :h g8<CTRL-D>y verá g8y 8g8como temas de ayuda disponibles. Sin esto, debe escribir el tema de ayuda exactamente y encontrar la cadena exacta que funciona es difícil.
JESii
1

Creo que puede obtener las asignaciones a través de los siguientes comandos

:nmap - Mapping on normal mode
:cmap - Mapping on command mode
:vmap - Mapping on visual mode

¡Espero eso ayude!

David Yew
fuente
2
No creo que ayude debido a las primeras palabras de la primera línea de la pregunta.