Comment savoir à quoi correspond une clé?

13

Je sais que l'exécution de :mapcommandes sans arguments devrait me donner une liste de mappages définis par l'utilisateur, mais, par exemple, lorsque j'appuie sur Ctrl-W Ctrl-I, quelque chose se produit, mais je n'ai aucune idée de la fonction qui vient de se produire en tant que mappages intégrés n'apparaissent pas dans les :mapcommandes.

Comment savoir ce que fait une clé?

Mad Wombat
la source
Peut-être Comment accéder aux rubriques de la documentation de Vim? est utile ;-)
Martin Tournoij
Pas vraiment. Dans emacs, je peux aller Ctrl-H k appuyer sur la touche que je veux connaître et cela me donnera les informations de liaison. Vim semble manquer de cette fonction. Comment savoir à quoi correspond une combinaison de touches particulière?
Mad Wombat
Avez-vous lu le double marqué? Parce que cela vous indique comment interroger le système d'aide de Vim pour obtenir ces informations (liste de l'élément n ° 8): :help CTRL-W_CTRL-Iou:help CTRL-W_i
Martin Tournoij
2
J'ai voté pour la réouverture, car le formulaire post-édition de la question a une réponse utilement différente (": mapper <Keys> pour imprimer les mappages actifs") que ce qui se trouve dans le doublon actuellement lié concernant la navigation dans l'aide.
1
Mais l'OP semble le savoir, c'est sa première phrase. Ce serait bien pour Vim d'avoir un moyen de montrer (de manière similaire) toutes les clés non mappées, c'est-à-dire ce qu'elles font par défaut.
VanLaser

Réponses:

10

Tu ne peux pas.

Voici le code source C pour ce qui <C-w><C-i>fait:

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;

Je ne sais pas exactement où la typevariable est récupérée, je n'avais pas envie de chercher ça, mais le fait est qu'il n'y a pas vraiment de facilité pour dire "cette clé est mappée à cette fonctionnalité". C'est fondamentalement juste un structqui mappe un charà une fonction, et l'implémentation de la deuxième frappe ( <C-i>) est simplement une laideur ad hoc!

C'est différent d'Emacs, où (je présume) tout est en Lisp, et vos mappages personnalisés ne sont pas différents des mappages par défaut d'Emacs. Mais dans Vim, vous avez des mappages "magiques" fournis par le code C qui correspondent aux fonctions C qui ne sont jamais exposées dans Vim. Je dis toujours que Vim a la meilleure idée, mais Emacs a la meilleure implémentation ;-)

La seule façon est donc de le rechercher dans les fichiers d'aide. C'est pourquoi j'ai fermé ceci en double de Comment naviguer vers les rubriques de la documentation de Vim, car c'est la seule réponse pratique que l' on puisse donner. On pourrait en effet affirmer qu'une explication plus approfondie de la question pourrait être donnée (comme je viens de le faire), et si vous aviez soutenu qu'au lieu de donner la réponse (maintenant supprimée), j'aurais probablement dit "vous" re right, désolé pour l'erreur "et l'a rouvert ;-)

En tout cas, pour illustrer brièvement les conventions avec quelques exemples:

  • :help w- mappage en mode normal pour w(sensible à la casse);
  • :help g8- mappage en mode normal pour g8;
  • :help v_o- cartographie du mode visuel pour o; les autres modes sont cpour la ligne de commande et ipour l'insertion;
  • :help CTRL-W- mappage en mode normal pour <C-w>;
  • :help i_CTRL-W- insérer le mappage de mode pour <C-w>;
  • :help CTRL-W_CTRL-I- mappage en mode normal pour <C-w><C-i>;
  • :help i_CTRL-G_<Down>- insérer le mappage de mode pour <C-g><Down>.
Martin Tournoij
la source
1
Un point important à propos de: l'aide qui semble toujours être laissée de côté est ce qu'on appelle commandline completiondans l'aide de vim en utilisant CTRL-D (je l'appelle "rechercher dans l'aide"). Tapez :h CTRL-Wpuis appuyez sur <CTRL-D>, et vous obtiendrez une liste de toutes les commandes contenant la chaîne « CTRL-W », par exemple CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Tapez :h g8<CTRL-D>et vous verrez g8et 8g8comme sujets d'aide disponibles. Sans cela, vous devez taper le sujet d'aide exactement et trouver la chaîne exacte qui fonctionne est difficile.
JESii
9

Il se trouve dans les fichiers d'aide de vim à l'adresse :help index

Si vous souhaitez savoir quelles clés ne sont pas mappées par défaut, consultez :help map-which-keys

Remarque: les liens ci-dessus sont cliquables vers le dernier manuel de référence vim

Tom Hale
la source
1

Je pense que vous pouvez obtenir les mappages via les commandes suivantes

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

J'espère que cela aide!

David Yew
la source
2
Je ne pense pas que cela aidera en raison des premiers mots de la première ligne de la question.