14

私が理解していることから、Emacsでは次のようなコマンドM-xを実行できます(ちなみに、これはの略だと思いますexecute-extended-command)。このコマンドM-x自体は、customize_faceたとえばミニバッファーに入力するなどして実行するために使用されますM-x customize-face

私の質問は次のとおりです。

Q.1. コマンドですか?customize-face_ それとも関数ですか?そして、それが引数としてコマンドに渡されると言いますか?customize-face M-x

Q.2すべての Emacs コマンドには関連する Emacs関数がありますか? (つまり、入力M-x customize-faceすると、定義された関数が呼び出されると思います)。もしそうなら、どうすればコマンド名から関数名を調べることができますか? (およびその逆)

4

2 に答える 2

23

はい、すべての Emacs コマンドは関数ですが、すべての関数が Emacs コマンドであるとは限りません。M-x以下を使用して、任意の elisp 関数をコマンドにアクセス可能にすることができます(interactive)

(defun my-command ()
 "This is the docstring"
 (interactive)
 (do-foo)
 (do-bar))

インタラクティブとして定義my-commandしたので、すぐにアクセスできますM-x my-command。Emacs は、名前を使ってすべての簿記を自動的に行います。

新しいコマンドを追加するために必要なことはこれだけです。次に、次のような方法でキーにバインドできます。

(global-set-key (kbd "C-c f") 'my-command)

さらに、すべてのキーバインディングは、このようなインタラクティブな機能に関連付けられています。C-h kキーシーケンスを使用および入力して、どのキーでどの機能が呼び出されるかを確認できます。これにより、そのキー シーケンスで呼び出される関数のドキュメントが得られます。私が提供したコードを実行すると、C-h k C-c f(とりわけ) doc-string を含むバッファーが得られます。

C-c f runs the command my-command, which is an interactive Lisp
function.

It is bound to C-c f.

(my-command)

This is the docstring

つまり、すべての Emacs コマンドは、 で定義された単なる関数(interactive)です。(実際には、Emacs の C コアのプリミティブ関数もいくつかありますが、それほど重要ではありません。)

コマンドと関数の間のこのシンプルで洗練された関係 (どちらの方向にも簡単に従うことができる) は、Emacs を非常に簡単にカスタマイズできる理由の一部です。通常のアクションがどの関数を呼び出したのか疑問に思った場合は、簡単に調べることができます。さらにコマンドを追加したい場合は、関数に 1 行追加するだけです。

于 2012-09-25T15:21:52.543 に答える
6

(interactive)もう 1 つ詳しく説明します。関数をコマンドとしてもラベル付けするために追加する必要があるのはなぜだろうと思っている人のためinteractiveに、関数に引数を与える方法を説明するのがコツです。したがって、「これもコマンドであり、対話的に実行する場合は、引数なし(interactive)で関数を呼び出すだけです」と言います。ここでは、「これもコマンドであり、対話的に実行する場合、式を評価すると、コマンドに渡す引数のリストが作成されます」.(interactive (list 2))(list 2)

対話的に呼び出されたときに、 RETURN-FORMが戻り値をどうするかを指定する形式interactiveを取るだけでなく、形式を(interactive ARGs-FORM)取ることができるように拡張することについての議論がありました。典型的な例:関数は何も出力せず、数値を返すだけですが、対話的に実行した場合 (つまり、コマンドとして使用)、何も出力しない場合は役に立たなくなるため、RETURN-FORMは返された数値を取得して出力します。それ。(interactive ARGS-FORM RETURN-FORM)current-column

于 2012-09-27T00:55:12.460 に答える