Como descobrir para que uma chave está mapeada?

13

Eu sei que a execução de :mapcomandos sem argumentos deve me fornecer uma lista de mapeamentos definidos pelo usuário, mas, por exemplo, quando eu pressiono Ctrl-W Ctrl-I algo acontece, mas não tenho idéia de qual função aconteceu apenas como mapeamentos internos não aparece nos :mapcomandos.

Como descubro o que uma chave faz?

Mad Wombat
fonte
Talvez como eu navegue para os tópicos na documentação do Vim? é útil ;-)
Martin Tournoij 10/03
Na verdade não. No emacs, posso pressionar Ctrl-H k e pressionar a tecla que eu quero conhecer e isso fornecerá as informações de ligação. Vim parece não ter essa função. Como descubro para o que uma combinação de teclas específica é mapeada?
Mad Wombat
Você leu a duplicata marcada? Porque isso indica como consultar o sistema de ajuda do Vim para obter essas informações (item 8 da lista): :help CTRL-W_CTRL-Iou:help CTRL-W_i
Martin Tournoij 10/16 / 16-
2
Votei em reabrir porque o formulário de pós-edição da pergunta tem uma resposta útil diferente (": map <Keys> para imprimir mapeamentos ativos") do que o que está no duplicado atualmente vinculado sobre navegação de ajuda.
1
Mas o OP parece saber disso, é sua primeira frase. Seria bom que o Vim tivesse uma maneira de mostrar (de maneira semelhante) todas as chaves não mapeadas, ou seja, o que elas fazem por padrão.
VanLaser

Respostas:

10

Você não pode.

Aqui está o código fonte C para o que <C-w><C-i>faz:

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;

Não tenho muita certeza de onde a typevariável é captada, não estava com vontade de procurá-la, mas o ponto é que não há nenhuma facilidade real para dizer "essa chave está mapeada para essa funcionalidade". É basicamente apenas um structque mapeia a charpara uma função, e a implementação do segundo pressionamento de tecla ( <C-i>) é simplesmente feiura ad-hoc!

Isso é diferente do Emacs, onde (presumo) tudo está no Lisp, e seus mapeamentos personalizados não são diferentes dos mapeamentos padrão do Emacs. Mas no Vim você tem mapeamentos "mágicos" que são fornecidos pelo código C que mapeiam contra funções C que nunca são expostas no Vim. Eu sempre digo que o Vim tem a melhor ideia, mas o Emacs tem a melhor implementação ;-)

Portanto, a única maneira é procurar nos arquivos de ajuda. É por isso que encerrei isso como uma duplicata de Como navego para tópicos na documentação do Vim, já que essa é a única resposta prática que alguém pode dar. Alguém poderia de fato argumentar que uma explicação mais aprofundada para a questão poderia ser dada (como acabei de fazer), e você argumentou que , em vez de dar a resposta (agora excluída), eu provavelmente teria dito "você" está certo, desculpe pelo erro "e o abriu novamente ;-)

De qualquer forma, para ilustrar brevemente as convenções com alguns exemplos:

  • :help w- mapeamento de modo normal para w(diferencia maiúsculas de minúsculas);
  • :help g8- mapeamento de modo normal para g8;
  • :help v_o- mapeamento de modo visual para o; outros modos são cpara linha de comando e iinserção;
  • :help CTRL-W- mapeamento de modo normal para <C-w>;
  • :help i_CTRL-W- inserir modo de mapeamento para <C-w>;
  • :help CTRL-W_CTRL-I- mapeamento de modo normal para <C-w><C-i>;
  • :help i_CTRL-G_<Down>- inserir mapeamento de modo para <C-g><Down>.
Martin Tournoij
fonte
1
Um ponto importante sobre: ​​a ajuda que parece sempre ficar de fora é o que é chamado commandline completionna ajuda do vim usando CTRL-D (eu chamo de "pesquisa na ajuda"). Digite :h CTRL-We pressione <CTRL-D>, e você obterá uma lista de todos os comandos que contêm a string "CTRL-W", por exemplo CTRL-W, CTRL-W_^, CTRL-W-<Down>, ...,. Digite :h g8<CTRL-D>e você verá g8e, 8g8como assuntos de ajuda disponíveis. Sem isso, você precisa digitar o assunto da ajuda exatamente e encontrar a string exata que funciona é difícil.
JESii 23/07
1

Eu acho que você pode obter os mapeamentos através dos seguintes comandos

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

Espero que ajude!

David Yew
fonte
2
Eu não acho que ajudará por causa das primeiras palavras da primeira linha da pergunta.