Wie finde ich heraus, wem eine Taste zugeordnet ist?

13

Ich weiß, dass das Ausführen von :mapBefehlen ohne Argumente eine Liste benutzerdefinierter Zuordnungen enthalten sollte. Wenn ich jedoch beispielsweise Strg-W Strg-I drücke, passiert etwas, aber ich habe keine Ahnung, welche Funktion gerade als integrierte Zuordnungen passiert ist erscheinen nicht in den :mapBefehlen.

Wie finde ich heraus, was ein Schlüssel tut?

Mad Wombat
quelle
Vielleicht Wie navigiere ich zu Themen in der Dokumentation von Vim? ist nützlich ;-)
Martin Tournoij
Nicht wirklich. In Emacs kann ich Strg-H drücken und die Taste drücken, über die ich informiert werden möchte. Dadurch erhalte ich die verbindlichen Informationen. Vim scheint diese Funktion zu fehlen. Wie finde ich heraus, welcher Tastenkombination eine bestimmte Zuordnung zugeordnet ist?
Mad Wombat
Haben Sie das markierte Duplikat gelesen? Denn das sagt Ihnen, wie Sie das Vim-Hilfesystem nach diesen Informationen abfragen können (Listenelement Nr. 8): :help CTRL-W_CTRL-Ioder:help CTRL-W_i
Martin Tournoij
2
Ich habe für das erneute Öffnen gestimmt, da das Formular zum Nachbearbeiten der Frage eine andere Antwort enthält (": map <Keys> to print active mappings") als das derzeit verknüpfte Duplikat über die Hilfe-Navigation.
1
Aber das OP scheint das zu wissen, es ist seine erste Phrase. Wäre schön, wenn Vim die Möglichkeit hätte, (auf ähnliche Weise) alle nicht zugeordneten Tasten anzuzeigen, dh was sie standardmäßig tun.
VanLaser

Antworten:

10

Das kannst du nicht.

Hier ist der C-Quellcode für die folgenden Aufgaben <C-w><C-i>:

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;

Ich bin mir nicht ganz sicher, wo die typeVariable aufgenommen wird. Ich wollte das nicht nachschlagen, aber der Punkt ist, dass es keine echte Möglichkeit gibt, zu sagen, dass "dieser Schlüssel dieser Funktionalität zugeordnet ist". Im Grunde ist es nur eine Funktion, structdie a charauf eine Funktion abbildet , und die Implementierung des zweiten Tastenanschlags ( <C-i>) ist einfach eine Ad-hoc-Hässlichkeit!

Dies unterscheidet sich von Emacs, wo (ich nehme an) alles in Lisp ist, und Ihre benutzerdefinierten Zuordnungen unterscheiden sich nicht von den Standardzuordnungen von Emacs. In Vim gibt es jedoch "magische" Zuordnungen, die vom C-Code bereitgestellt werden und die C-Funktionen zuordnen, die in Vim niemals verfügbar sind. Ich sage immer, dass Vim die bessere Idee hat, aber Emacs die bessere Implementierung hat ;-)

Die einzige Möglichkeit besteht darin, sie in den Hilfedateien nachzuschlagen. Aus diesem Grund habe ich dies als Duplikat von " Wie navigiere ich zu Themen in der Dokumentation von Vim?" Geschlossen, da dies die einzige praktische Antwort ist, die jeder geben kann. Man könnte in der Tat argumentieren, dass eine ausführlichere Erklärung zu der Frage gegeben werden könnte (wie ich es gerade getan habe), und hätten Sie argumentiert, dass ich , anstatt die (jetzt gestrichene) Antwort zu geben, wahrscheinlich "Sie" gesagt hätte. hab recht, sorry für den fehler "und habe es wieder geöffnet ;-)

In jedem Fall, um die Konventionen mit einigen Beispielen kurz zu veranschaulichen:

  • :help w- Normalmodus-Zuordnung für w(Groß- und Kleinschreibung beachten);
  • :help g8- Normalmodus-Zuordnung für g8;
  • :help v_o- Visual Mode Mapping für o; andere Modi sind cfür die Befehlszeile und izum Einfügen;
  • :help CTRL-W- Normalmodus-Zuordnung für <C-w>;
  • :help i_CTRL-W- Einfügemoduszuordnung für <C-w>;
  • :help CTRL-W_CTRL-I- Normalmodus-Zuordnung für <C-w><C-i>;
  • :help i_CTRL-G_<Down>- Einfügemoduszuordnung für <C-g><Down>.
Martin Tournoij
quelle
1
Ein wichtiger Punkt über: Hilfe, die immer ausgelassen zu werden scheint, ist das, was commandline completionin vim help mit STRG-D aufgerufen wird (ich nenne es "In Hilfe suchen"). Geben Sie :h CTRL-Wdann <STRG-D> ein und Sie erhalten eine Liste aller Befehle, die die Zeichenfolge "STRG-W" enthalten, z CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Geben :h g8<CTRL-D>Sie ein und Sie sehen g8und 8g8als verfügbare Hilfethemen. Ohne dies müssen Sie das Hilfethema genau eingeben, und es ist schwierig, die richtige Zeichenfolge zu finden.
JESii
9

Es ist in den VIM-Hilfedateien unter :help index

Wenn Sie wissen möchten, welche Tasten standardmäßig nicht zugeordnet sind, lesen Sie :help map-which-keys

Hinweis: Die obigen Links sind anklickbare Links zum neuesten Referenzhandbuch für VIM

Tom Hale
quelle
1

Ich denke, Sie können die Zuordnungen über die folgenden Befehle erhalten

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

Ich hoffe es hilft!

David Yew
quelle
2
Ich denke nicht, dass es wegen der ersten paar Worte der ersten Zeile der Frage helfen wird.