Jak dowiedzieć się, do czego przypisany jest klucz?

13

Wiem, że uruchamianie :mappoleceń bez argumentów powinno dać mi listę mapowań zdefiniowanych przez użytkownika, ale na przykład, kiedy naciskam Ctrl-W Ctrl-I coś się dzieje, ale nie mam pojęcia, która funkcja właśnie się wydarzyła jako wbudowane mapowania nie pojawiają się w :mappoleceniach.

Jak dowiedzieć się, co robi klucz?

Szalony Wombat
źródło
Być może Jak nawigować do tematów w dokumentacji Vima? jest przydatny ;-)
Martin Tournoij,
Nie całkiem. W emacsie mogę przejść z wciśniętym klawiszem Ctrl-H k naciśnij klawisz, o którym chcę wiedzieć, a on poda mi wiążące informacje. Vimowi brakuje tej funkcji. Jak mogę się dowiedzieć, do czego przypisana jest konkretna kombinacja klawiszy?
Mad Wombat,
Czy przeczytałeś zaznaczony duplikat? Ponieważ to mówi ci, jak zapytać system pomocy Vima o te informacje (pozycja listy nr 8): :help CTRL-W_CTRL-Ilub:help CTRL-W_i
Martin Tournoij
2
Głosowałem za ponownym otwarciem, ponieważ forma post-edycji pytania ma użytecznie inną odpowiedź („: map <Keys>, aby wydrukować aktywne mapowania”) niż to, co znajduje się w aktualnie powiązanym duplikacie na temat pomocy w nawigacji.
1
Ale OP wydaje się o tym wiedzieć, to jego pierwsza fraza. Byłoby miło, gdyby Vim miał sposób pokazać (w podobny sposób) wszystkie klucze niemapowane, tzn. Co domyślnie robią.
VanLaser,

Odpowiedzi:

10

Nie możesz

Oto kod źródłowy C dla tego, co <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;

Nie jestem do końca pewien, gdzie typezmienna jest pobierana, nie miałem ochoty na to patrzeć, ale chodzi o to, że nie ma prawdziwej możliwości powiedzenia „ten klucz jest przypisany do tej funkcji”. Jest to po prostu structmapowanie charfunkcji na funkcję, a implementacja drugiego naciśnięcia klawisza ( <C-i>) jest po prostu brzydotą ad-hoc!

Różni się to od Emacsa, gdzie (przypuszczam) wszystko jest w Lisp, a twoje niestandardowe mapowania nie różnią się niczym od domyślnych mapowań Emacsa. Ale w Vimie masz „magiczne” mapowania, które są dostarczane przez kod C, które mapują funkcje C, które nigdy nie są ujawniane w Vimie. Zawsze mówię, że Vim ma lepszy pomysł, ale Emacs ma lepszą implementację ;-)

Więc jedynym sposobem jest sprawdzenie go w plikach pomocy. Dlatego zamknąłem to jako duplikat Jak nawigować do tematów w dokumentacji Vima, ponieważ jest to jedyna praktyczna odpowiedź , jaką może dać każdy. Rzeczywiście można argumentować, że można podać bardziej szczegółowe wyjaśnienie tego pytania (tak jak właśnie to uczyniłem), a gdybyście argumentowali, że zamiast dać odpowiedź (teraz usuniętą), prawdopodobnie powiedziałbym „ty” racja, przepraszam za błąd ”i ponownie go otworzyłem ;-)

W każdym razie, aby krótko zilustrować konwencje kilkoma przykładami:

  • :help w- mapowanie trybu normalnego dla w(rozróżniana jest wielkość liter);
  • :help g8- mapowanie trybu normalnego dla g8;
  • :help v_o- mapowanie trybu wizualnego dla o; inne tryby dotyczą cwiersza poleceń i iwstawiania;
  • :help CTRL-W- mapowanie trybu normalnego dla <C-w>;
  • :help i_CTRL-W- mapowanie trybu wstawiania dla <C-w>;
  • :help CTRL-W_CTRL-I- mapowanie trybu normalnego dla <C-w><C-i>;
  • :help i_CTRL-G_<Down>- mapowanie trybu wstawiania dla <C-g><Down>.
Martin Tournoij
źródło
1
Jedną ważną kwestią dotyczącą: pomocy, która wydaje się zawsze pomijana, jest to, co nazywa się commandline completionvim help przy użyciu CTRL-D (nazywam to „szukaj w pomocy”). Wpisz, :h CTRL-Wa następnie naciśnij <CTRL-D>, a otrzymasz listę wszystkich poleceń zawierających ciąg „CTRL-W”, np CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Wpisz, :h g8<CTRL-D>a zobaczysz g8i 8g8jako dostępne tematy pomocy. Bez tego musisz dokładnie wpisać temat pomocy, a znalezienie dokładnego ciągu, który działa, jest trudne.
JESii,
1

Myślę, że można uzyskać mapowania za pomocą następujących poleceń

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

Mam nadzieję, że to pomoże!

David Yew
źródło
2
Nie sądzę, żeby to pomogło z powodu pierwszych kilku słów pierwszego wiersza pytania.