2012-06-07 2 views
2

У меня есть макрос emacs (глобальный набор-ключ), который отлично работает в моем файле .emacs, но по какой-то причине он не работает в моем .c файле.Макрос Emacs работает в файле .emacs, но не в исходном файле?

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

Если закрыть и повторно открыть мой файл .emacs и начать бездельничать, этот макрос ведет себя, как и ожидалось, копирование строки к строке ниже. Однако, когда я открываю C-файл, тот же макрос просто удаляет символ (он, кажется, только набирает C-d).

Любые идеи?

ответ

6

CC-режим определяет С-С-С-D в c-mode-base-map быть c-hungry-delete-forward, который скрывает ваши связывания на глобальном уровне. Таким образом, лучший способ решить эту проблему состоит в Undefine связывания, что cc-mode сделал, и вы делаете это со следующим:

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

Вы также можете сделать это в крюк, но я предпочитаю eval-after-load потому что это только выполняется один раз.

Примечание: Я определил существующие привязки, открыв файл в c-mode и набрав Ch Ck Cc Cd (ака Mx описывают связывания Cc Cd) и видящими:

Cc Cd запускает команду c-hungry-delete-forward, которая представляет собой интерактивную скомпилированную функцию Lisp в `cc-cmds.el '.

Это сделал его довольно ясно, что связывание было создано в (один из) c-mode с, так что я просто открыл (или grep редактора) исходные файлы для c-hungry-delete-forward, после чего я нашел:

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

И тогда ответ был прямолинейным.

Я думаю, что лучше Undefine локальных привязок, которые скрываются глобальные привязки, которые вы хотите, а не пересматривают их. Так же сложно найти проблемные привязки, и таким образом, если вы хотите изменить функцию глобального связывания, вам нужно сделать это только в одном месте.

+0

Спасибо. Для дальнейшего использования, как вы узнали, какие другие режимы определены? Есть ли файл где-нибудь? – Jon

+0

@Jon Я обновил ответ, чтобы помочь с этим, но это не совсем прямо. –

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 вместо глобального, чтобы применить привязку только к этому буферу.

+0

Я действительно новичок в emacs, не могли бы вы рассказать подробнее? Как добавить к c-mode-hook? Вот так? (add-hook 'c-mode-hook (global-set-key" \ C-c \ C-d "" \ C-a \ C- \ C-e \ M-w \ C-j \ C-y ")) – Jon

+0

Вид. Я отредактирую свой ответ. –

+0

Этот ответ немного смущен. (1) Использование «global-set-key» в режиме крюка не отличается от использования его вне режима hook - есть только одна глобальная раскладка клавиатуры, а мажорные/вспомогательные режимы крайне маловероятны для его модификации.(2) 'local-set-key' влияет не только на текущий буфер; он влияет на локальную ключевую карту текущего буфера *, которая в большинстве случаев обычно используется буферами * all *, использующими один и тот же основной режим. – phils

Смежные вопросы