如何找出键映射到什么?


13

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

我如何找出钥匙的作用?



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

您是否阅读了标记的副本?因为这样可以告诉您如何在Vim帮助系统中查询此信息(列表项目8)::help CTRL-W_CTRL-I:help CTRL-W_i
Martin Tournoij,2016年

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

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

Answers:


10

你不能

这是做什么的C源代码<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;

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

这与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>

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


1

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

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

希望能帮助到你!


2
由于问题第一行的前几句话,我认为这不会有所帮助。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.