モード別のemacsキーバインディング

モード別のemacsキーバインディング

私は+をCモード(実際には組み込みCCモード)の組み込みの「コンパイル」機能にマッピングするemacsために(Arch Linuxの23.3)取得しようとしています。これまで私は次のことを試しました。CtrlF12

(defun my-c-mode-common-hook (define-key c-mode-map (kbd "C-<f12>") 'compile))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

そして:

(eval-after-load 'c-mode
  '(define-key c-mode-map (kbd "C-<f12>") 'compile))

しかし、どちらも機能しません<C-f12> is undefined。私が読んだ内容に基づいてここここここ、なぜ動作しないのか理解できません。どんなアイデアがありますか?

答え1

Cモード(特に変数c-mode-map)はcc-modec-mode

(eval-after-load 'cc-mode
  '(define-key c-mode-map (kbd "C-<f12>") 'compile))

次のような他の方法の場合vschumが既に回答しています、パラメータリストがありませんdefun。また、c-mode-common-hookこれは正しい位置ではありません。 Cモードに入るたびに実行されます。バインディングを追加する正しい時間は、Cモードがロードされたときです。eval-after-load上記の一般的なメカニズムを介して、または次の方法でこれを実行できますc-initialization-hook

(defun my-c-mode-common-hook ()
  (define-key c-mode-map (kbd "C-<f12>") 'compile))
(add-hook 'c-initialization-hook 'my-c-mode-common-hook)

答え2

タイプミスがあります。 defunのパラメータ定義がありません。この場合、関数 my-c-mode-common-hook はパラメータを受け入れないため、関数名の後に空の括弧セットを追加します。

(defun my-c-mode-common-hook ()
    (define-key c-mode-map (kbd "C-<f12>") 'compile))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

関連情報