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.