2

.emacsファイルで完全に機能するemacsマクロ(global-set-key)がありますが、何らかの理由で.cファイルでは機能しません。

(global-set-key "\C-c\C-d" "\C-a\C- \C-e\M-w\C-j\C-y")

.emacsファイルを閉じて再度開き、いじり始めると、このマクロは期待どおりに動作し、1行を下の行にコピーします。ただし、Cファイルを開くと、同じマクロが文字を削除するだけです(Cdでのみ取得されるようです)。

何か案は?

4

2 に答える 2

6

cc-modeは、であると定義C-c C-dc-mode-base-mapますc-hungry-delete-forward。これは、グローバルレベルでバインディングを非表示にします。したがって、これを解決するためのより良い方法は、作成したバインディングの定義cc-modeを解除することです。これを行うには、次のようにします。

(eval-after-load "cc-mode"
  '(define-key c-mode-base-map (kbd "C-c C-d") nil))

フックで実行することもできますが、eval-after-load実行されるのは1回だけなので、私は好みます。

注:ファイルを開いて(aka )c-modeと入力し、次のように表示して、既存のバインディングを決定しました。C-h C-k C-c C-dM-x describe-binding C-c C-d

Cc Cdは、コマンドc-hungry-delete-forwardを実行します。これは、`cc-cmds.el'のインタラクティブにコンパイルされたLisp関数です。

これにより、バインディングが(の1つ)で設定されていることがかなり明確になったc-modeので、ソースファイルを開いた(またはgrep編集した)と、次のc-hungry-delete-forwardことがわかりました。

(define-key c-mode-base-map "\C-c\C-d"     'c-hungry-delete-forward)

そして、答えは簡単でした。

再定義するよりも、必要なグローバルバインディングを非表示にするローカルバインディングの定義を解除する方が良いと思います。問題のあるバインディングを見つけるのも同じくらいの作業です。このように、グローバルバインディングの関数を変更する場合は、1か所で行うだけで済みます。

于 2012-06-07T20:43:46.330 に答える
0

明らかに、Cモードはバインディングを削除または変更しています。それをc-mode-hookに追加して、それが機能するかどうかを確認することができます。これに似ています:

(add-hook `c-mode-hook '(lambda ()
                         (global-set-key "\C-c\C-d" "\C-a\C- \C-e\M-w\C-j\C-y")))

または。c-mode-hook_ グローバルなものの代わりに使用して、このバッファーだけにバインディングを適用するc-mode-common-hookこともできます。local-set-key

于 2012-06-07T16:57:00.847 に答える