Come scoprire a cosa è mappata una chiave?


13

So che eseguire :mapcomandi senza argomenti dovrebbe darmi un elenco di mappature definite dall'utente, ma, ad esempio, quando premo Ctrl-W Ctrl-I succede qualcosa, ma non ho idea di quale funzione sia stata appena eseguita come mappature integrate non appare nei :mapcomandi.

Come faccio a sapere cosa fa una chiave?



Non proprio. In emacs, posso andare Ctrl-H k premere il tasto che voglio sapere e mi darà le informazioni vincolanti. A Vim sembra mancare quella funzione. Come faccio a sapere a cosa è mappata una particolare combinazione di tasti?
— Mad Wombat

Hai letto il duplicato contrassegnato? Perché questo ti dice come interrogare il sistema di aiuto di Vim per queste informazioni (elenco voce n. 8): :help CTRL-W_CTRL-Ioppure:help CTRL-W_i
— Martin Tournoij

2
Ho votato per la riapertura perché la forma post-modifica della domanda ha una risposta utilmente diversa (": mappa <Keys> per stampare mappature attive") rispetto a ciò che è nel duplicato attualmente collegato sulla navigazione della guida.

1
Ma l'OP sembra saperlo, è la sua prima frase. Sarebbe bello per Vim avere un modo per mostrare (in modo simile) tutte le chiavi non mappate, cioè cosa fanno di default.
— VanLaser,

Risposte:


10

Non puoi.

Ecco il codice sorgente C per ciò che <C-w><C-i>fa:

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;

Non sono del tutto sicuro di dove typevenga prelevata la variabile, non mi andava di cercarla, ma il punto è che non esiste una vera funzione per dire "questa chiave è mappata su questa funzionalità". Fondamentalmente è solo uno structche associa chara una funzione e l'implementazione della seconda sequenza di tasti ( <C-i>) è semplicemente bruttezza ad hoc!

Questo è diverso da Emacs, dove (presumo) tutto sia in Lisp e le tue mappature personalizzate non sono diverse dalle mappature predefinite di Emacs. Ma in Vim hai mappature "magiche" che sono fornite dal codice C che mappano contro le funzioni C che non sono mai esposte in Vim. Dico sempre che Vim ha l'idea migliore, ma Emacs ha l'implementazione migliore ;-)

Quindi l'unico modo è cercarlo nei file della guida. Questo è il motivo per cui ho chiuso questo come duplicato di Come posso navigare verso gli argomenti nella documentazione di Vim poiché questa è l'unica risposta pratica che chiunque può dare. Si potrebbe davvero sostenere che una spiegazione più approfondita alla domanda potrebbe essere data (come ho appena fatto), e se avessi sostenuto che , invece di dare la risposta (ora cancellata), avrei probabilmente detto "tu" esatto, scusate l'errore "e riaprirlo ;-)

Ad ogni modo, per illustrare brevemente le convenzioni con alcuni esempi:

  • :help w- mappatura della modalità normale per w(sensibile al maiuscolo / minuscolo);
  • :help g8- mappatura della modalità normale per g8;
  • :help v_o- mappatura della modalità visiva per o; altre modalità sono cper la riga di comando e iper l'inserimento;
  • :help CTRL-W- mappatura della modalità normale per <C-w>;
  • :help i_CTRL-W- inserire la modalità di mappatura per <C-w>;
  • :help CTRL-W_CTRL-I- mappatura della modalità normale per <C-w><C-i>;
  • :help i_CTRL-G_<Down>- inserire la modalità di mapping per <C-g><Down>.

1
Un punto importante su: un aiuto che sembra essere sempre escluso è quello che viene chiamato commandline completionin vim help usando CTRL-D (io lo chiamo "cerca in aiuto"). Digita :h CTRL-Wquindi premi <CTRL-D> e otterrai un elenco di tutti i comandi che contengono la stringa "CTRL-W", ad es CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Digita :h g8<CTRL-D>e vedrai g8e 8g8come argomenti di aiuto disponibili. Senza questo, devi digitare esattamente l'argomento della guida e trovare la stringa esatta che funziona è difficile.
— GESii,


1

Penso che sia possibile ottenere i mapping tramite i seguenti comandi

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

Spero che sia d'aiuto!


2
Non credo che sarà di aiuto a causa delle prime parole della prima riga della domanda.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.