キーが何にマッピングされているかを調べる方法は?


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

2
質問の編集後のフォームには、ヘルプナビゲーションについて現在リンクされている複製の内容とは異なる答え(「:map <Keys> to active mappings」)が有用に異なるため、私は再び開くことに投票しました。

1
しかし、OPはそれを知っているようです、それは彼の最初のフレーズです。Vimがすべてのマッピングされていないキーを表示する(同様の方法で)方法を持っているといいでしょう。
ヴァンレーザー

回答:


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変数がどこで取得されるのか完全にはわかりませんが、それを調べる気はありませんでしたが、ポイントは「このキーはこの機能にマップされている」と言う本当の機能がないということです。これは基本的にa structchar関数にマップするだけであり、2番目のキーストローク(<C-i>)の実装はアドホックなさです!

これはEmacsとは異なります。Emacsでは(すべて)Lispにあり、カスタムマッピングはEmacsのデフォルトマッピングと変わりません。しかし、Vimには、Vimで決して公開されないC関数に対してマップする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についての重要なポイントの1つは、常に省略されているように見えるが、commandline completionCTRL-Dを使用してvim helpで呼び出されるものです(「ヘルプを検索」と呼びます)。入力して:h CTRL-Wから<CTRL-D>を押すと、文字列「CTRL-W」を含むすべてのコマンドのリストが表示されますCTRL-W, CTRL-W_^, CTRL-W-<Down>, ...。入力し:h g8<CTRL-D>、あなたが表示されますg8と、8g8使用可能なヘルプ対象として。これがないと、ヘルプの件名を正確に入力する必要があり、動作する正確な文字列を見つけることは困難です。
JESii


1

次のコマンドでマッピングを取得できると思います

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

それが役に立てば幸い!


2
質問の最初の行の最初の数語のために、私はそれが助けになるとは思わない。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.