`(fset SYMBOL KEYMAP)`は何をしますか?


7

私は発射物ソースファイルを読んでいましたが、彼らは次のことを行います:

(defvar projectile-command-map
  (let ((map (make-sparse-keymap)))
    ; define-keys
    map)
  "Keymap for Projectile commands after `projectile-keymap-prefix'.")
(fset 'projectile-command-map projectile-command-map)

なぜこれを行うのですか?下位互換性のためですか?


1
私はキーマップがどのように機能するかをよく知っていますが、なぜキーマップがこれを行うのかは説明できませんでした。あなたは彼らに尋ねたいと思うかもしれません。
ステファン

回答:


9

fsetシンボルの関数定義を設定します

ここでprojectile-command-mapは、プレフィックスコマンドとして使用されます。プレフィックスコマンドは、関数定義がキーマップであるシンボルです。

プレフィックスキーの定義は通常、次のイベントを検索するために使用するキーマップです。定義は、関数定義が次のキーマップであるLispシンボルにすることもできます。効果は同じですが、プレフィックスキーの目的の説明として使用できるプレフィックスキーのコマンド名を提供します。

これは、でも実行できdefine-prefix-commandます。

何ビットがここに混乱を招くことはということです同じ記号はprojectile-command-map、2つの目的のために使用されています。

  • キーマップとして
  • 前置コマンドとして

別の例はより明確かもしれません:

(fset 'help-command help-map)

ここで、help-commandは明らかにプレフィックスコマンドhelp-mapですが、はキーマップです。


C-h f defalias(と同様fset)も参照してください。プレフィックスコマンドの詳細については、(elisp)プレフィックスキーを参照してください。
ドリュー

ここで少し混乱しているのは、同じシンボルが2つの目的で使用されていることです:prefix keymapとprefix command。とのように、2つの異なるシンボルである場合はより明確にhelp-commandなりhelp-mapます。
Tianxiang Xiong

たぶんそうかもしれませんが、それが最も一般的な方法です(決まり文句)-同じ記号を使用してください。(grepためfset、その後、Lispのソース内M-x flush offsetを検索してmap。)
ドリュー

1
これは一般的であり、余分なシンボルを定義しないようにするための推奨される方法を私は言いますが、キーマップがどのように機能するかを十分に理解していない人を混乱させます。OPをより明確にするためにコメントを追加しました。
Tianxiang Xiong

はい、あなたがコメントをした理由を理解しました。混乱を招く可能性があることに同意します。余分な記号を避ける理由はないと思います。その理由は、同じシンボルが両方の動作を楽しむためです。これはプログラミングの決まり文句ですが、両者の関係(同じ名前かどうかに関係なく)はそのように文書化されています。これはコマンドなので、キーにバインドできます。ただし、これも変数なので、キーマップとして機能できます。これはLisp-2です。;-)
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.