0

customize-optionかなり頻繁に変更する必要があるため、特定の変数をキーにバインドしたいと思います。私には2つの選択肢があります:

(global-set-key (kbd "<f12>") '(lambda() (interactive) (customize-option 'my-variable) ) )
(global-set-key (kbd "<f12>") '(customize-option 'my-variable )

最初のものは機能しますが、2番目は機能しません。これは、コマンドではないとcommandp文句を言うためです。customize-optionなんで?私の知る限り、これcustomize-optionはインタラクティブな関数なので、次のようにするcommandp必要がありますt

Customize-optionは、インタラクティブにコンパイルされたLisp関数です。

にバインドされています。

(カスタマイズオプション記号)

SYMBOLをカスタマイズします。これは、ユーザーオプション変数である必要があります。

4

2 に答える 2

3

(customize-option 'my-variable)コマンドではない形です。リテラル文字列またはバインドされていないシンボルにバインドできる以上に、任意の引用符で囲まれた形式にバインドすることはできません。それらのいくつかはバインドするのに役立ちますが、制限を回避するのは難しくありません。一緒に暮らすのが難しい場合は、マクロを作成してください。(ことわざにあるように、今は2つの問題があります。)

于 2012-09-17T13:39:05.007 に答える
3

の2番目の引数は、コマンド定義global-set-keyである必要があります。通常は、対話型関数に名前を付けるシンボルです。インタラクティブ関数は、フォームで始まる関数です。例えば:(interactive)

(defun delete-to-end ()
  "Delete text from point to the end of buffer."
  (interactive)
  (delete-region (point) (point-max)))

これにより、対話型関数が定義され、シンボルに割り当てられますdelete-to-end。その後、にdelete-to-end渡すことができる有効なコマンドですglobal-set-key

(global-set-key [f12] 'delete-to-end)

(interactive)この行がなくてdelete-to-endも、Lispプログラムから呼び出し可能な関数に名前を付けることができますが、それは「コマンド」ではありません。インタラクティブとしてマークされているため、(commandp 'delete-to-end)trueを返し、機能しM-x delete-to-endます。

インタラクティブ関数はシンボルにバインドする必要はなく、匿名にすることができます。他の無名関数と同様に、lambdaフォームを使用して作成されますが、コマンドの場合は。も含める必要があります(interactive)global-set-key匿名コマンドは、シンボルに割り当てずに2番目の引数として渡すことができるため、次の定義は上記の定義と同等です。

(global-set-key [f12]
                (lambda ()
                  "Delete text from point to the end of buffer."
                  (interactive)
                  (delete-region (point) (point-max))))

C-h c ...少し読みにくく、またはで検査すると見栄えが悪いことを除いてC-h k

あなたの場合、への最初の呼び出しにglobal-set-keyは有効なコマンドが与えられますが(引用符で囲まれたlambda形式自体は有効な関数です)、2番目の呼び出しにはそうではなく、呼び出すことも要件を満たさない2要素のリストが与えられます。 「インタラクティブ」とマークされています。

于 2012-09-17T16:15:25.140 に答える