ラムダをキーにバインドするときの「間違った型引数:commandp」エラー


87

ここで「間違った型の引数:commandp、(lambda nil(forward-line 5))」が表示されます。

(global-set-key [?\M-n] (lambda () (forward-line 5)))

エラーは何ですか?私はそれが単純であるとかなり確信しています、そして私は明白な何かを逃しています。


閉じ括弧がありません。おそらくあなたのコードにはなく、質問だけにあります。
ヘルダーSリベイロ

補足として:そのような無名関数を引用すると、コンパイルされません。しかし、あなたの場合は大したことではないと思います。
フィルジャクソン

回答:


129

global-set-key対話型コマンドが必要です。(lambda () (interactive) (forward-line 5))動作するはずです。

ちなみに、それはそのようC-h f commandpなエラーのかなり良い出発点です。


マイナス面はないと思います。ドキュメントから:>>「インタラクティブ」への「呼び出し」は実際には関数ではなく宣言です。これは、関数に渡す引数の読み取り方法を「call-interactively」に指示します。実際に呼び出されると、「interactive」は単にnilを返します。
ダンジェロフ

したがって、(commandp)ドキュメントによると、トップレベルの呼び出しが機能するラムダ関数ですが(interactive)、それを使用して関数を定義するにはどうすればよい(defun)ですか?
peterhil

35

正しい形式は次のようになります-

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))

問題は、(interactive)(ブレンダンが言ったように)置くのを忘れたことでした。

ちなみに、(kbd)キーバインドを指定する関数を使用したことに気付くでしょう。この関数は、キーバインディングをほぼ文字通りに配置できるため、非常に便利です。


2

また、通常の.emacsファイルを使用しているがパッケージをインストールしていない新しいマシンでこのエラーが発生し、実行するコマンドがそれらのパッケージの1つに含まれています。(確実に実行できないコマンドはインタラクティブではないためです!)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.