我知道在不带参数的情况下运行:map命令应该会给我一个用户定义的映射列表,但是,例如,当我按Ctrl-W Ctrl-I时,发生了一些事情,但是我不知道内置的函数只是发生了什么映射不会出现在:map命令中。

如何找出键的作用?

评论

也许我该如何导航到Vim文档中的主题?有用;-)

并不是的。在emacs中,我可以按Ctrl-H k按下我想了解的键,它将为我提供绑定信息。 Vim似乎缺少该功能。如何确定特定的组合键映射到什么?

您是否阅读了标记的副本?因为这告诉您如何在Vim帮助系统中查询此信息(清单项目8)::help CTRL-W_CTRL-I或:help CTRL-W_i

我之所以投票决定重新开放,是因为问题的后编辑形式与当前链接的有关帮助导航的副本相比,有一个非常有用的答案(“:map 以打印活动映射”)。

但是,OP似乎知道,这是他的第一句话。对于Vim来说,有一种方法可以显示(以类似的方式)所有未映射的键,也就是默认情况下它们的作用。

#1 楼

您不能。

这是<C-w><C-i>的作用的C源代码:

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;


我不完全确定type变量是从哪里获取的,我并不希望查找该变量,但重点是,在那里说“此键已映射到此功能”并不是真正的工具。它基本上只是一个struct,它将一个char映射到一个函数,并且第二个击键(<C-i>)的实现只是临时的丑陋!

这与Emacs有所不同,在Emacs中,我假设一切在Lisp中,您的自定义映射与Emacs的默认映射没有任何不同。但是在Vim中,C代码提供了“魔术”映射,这些映射映射到Vim中从未公开的C函数。我总是说Vim有更好的主意,但Emacs有更好的实现;-)

所以唯一的方法是在帮助文件中查找它。这就是为什么我将其作为“如何导航到Vim文档中的主题”的副本而关闭的原因,因为这是任何人都可以给出的唯一实用答案。确实有人可能会争辩说,可以对这个问题进行更深入的解释(就像我刚才所做的那样),而您是否曾争辩说,与其给出(现在删除的)答复,我可能会说“您”正确,为错误感到抱歉”,然后重新打开它;-)

无论如何,用一些示例简要说明这些约定:



:help w-w的普通模式映射(区分大小写);

:help g8-g8的普通模式映射;

:help v_o-o的可视模式映射;其他模式是c(用于命令行)和i(用于插入);

:help CTRL-W-<C-w>的普通模式映射;

:help i_CTRL-W-<C-w>的插入模式映射;

:help CTRL-W_CTRL-I-<C-w><C-i>的正常模式映射;

:help i_CTRL-G_<Down>-<C-g><Down>的插入模式映射。


评论


关于:help的一个重要点似乎总是被遗漏了,就是使用CTRL-D的vim帮助中的命令行完成(我称其为“在帮助中搜索”)。输入:h CTRL-W,然后按,您将获得包含字符串“ CTRL-W”的所有命令的列表,例如CTRL-W,CTRL-W _ ^,CTRL-W- < Down>,...。键入:h g8 ,您将看到g8和8g8作为可用的帮助主题。否则,您必须准确键入帮助主题,并且很难找到确切的字符串。

–JESii
18年7月23日在13:23

#2 楼

它位于:help index的vim帮助文件中。

如果您想知道默认情况下未映射哪些键,请参见
:help map-which-keys

注:以上内容均可单击链接到最新的vim参考手册

#3 楼

我认为您可以通过以下命令获取映射

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


希望有帮助!

评论


由于问题第一行的前几句话,我认为这不会有所帮助。

–user859
16 Mar 23 '16 at 14:52