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?



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>.

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!


2
Nie sądzę, żeby to pomogło z powodu pierwszych kilku słów pierwszego wiersza pytania.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.