2013-08-07 2 views
1

На OS X, с .emacs, содержащими только строки:Предпочитая одна функция, когда KeyBinding в двух EMACS пакетов перекрываются

(require 'dired) 

(add-hook 'dired-load-hook 
     (function (lambda() 
       (load "dired-x")))) 

dired-omit-mode в dired-x и ns-open-file-using-panel в ns-win борьбе за KeyBinding М-о.

Я понимаю выше .macs, указав, что dired-x должен быть загружен сразу после укутания, и, следовательно, привязка M-o в dired-x должна быть принята при запуске emacs. Это не тот случай. По какой-то причине выигрыш в ns-win выигрывает.

Как я могу принудительно выполнить привязку клавиш при запуске?

Редактировать

(предложение следующих Phils') Если мой .emacs также загружает два других пакетов, которые определяют Mo

(require 'ns-win) 
(require 'facemenu) 
(require 'dired) 

(add-hook 'dired-load-hook 
     (function (lambda() 
       (load "dired-x")))) 

даже если Dired загружен последним, связывание в facemenu еще берет на себя.

ответ

0

Сначала загрузите ns-win, чтобы он установил привязку. Тогда это:

(add-hook 
'dired-mode-hook 
(lambda() 
    (require 'dired-x) 
    (define-key dired-mode-map (kbd "M-o") 'dired-omit-mode))) 

dired-mode-hook перекроет все, что было ранее , связанный с М-о для dired-mode.

+0

Это необходимо? dired-x.el уже имеет (определение-ключ dired-mode-map "\ M-o" 'dired-omit-mode). – Calaf

+0

Тогда я не понимаю, о чем вы спрашиваете. Какую функцию следует вызывать M-o? –

+0

Мой выбор слов был, возможно, не очень хорошим. Я отредактировал вопрос, чтобы прояснить его. – Calaf

0

Редактировать: А, извините, мой ответ не был уместным.

Во-первых, dired-x добавляет привязки к карте основного режима (карта с цифровым режимом), а все карты второстепенного режима имеют приоритет над основной картой режима.

Во-вторых, мое предположение о том, что ваш ns-win использовал вспомогательный режим, также может быть недействительным. Я действительно должен был сказать вам, чтобы вы сначала связались с этим (вы всегда должны ссылаться на нестандартные библиотеки).

Google предлагает использовать глобальную раскладку ключей, в этом случае он никогда не должен переопределять устаревшую карту, но также и то, что она использует супер, а не мета как ключ-модификатор, поэтому я совсем не уверен, что я ищу в версии, которую вы используете.

Если ваш ns-win действительно предоставляет второстепенный режим, то самым простым вариантом является, возможно, сближение привязки второстепенного режима с пользовательской функцией, которая проверяет основной режим, а затем либо вызывает функцию оригинала, либо функцию dired-x, если это необходимо.

Вы можете использовать подход Emacs key binding fallback, чтобы минимизировать количество допущений. Ваш тест будет (eq major-mode 'dired-mode).


Оригинальный ответ; на самом деле не имеет отношения к вопросу:

Недостаточный приоритет карты памяти контролируется порядком записей в minor-mode-map-alist, и это зависит от порядка загрузки библиотек.Самый последний загруженный режим имеет самый высокий приоритет (новые записи добавляются в начале списка).

См. https://stackoverflow.com/a/5340797/324105 для примера использования этого алиста для того, чтобы дать конкретный приоритет режима (в вашем случае вы, скорее всего, захотите использовать eval-after-load для выполнения теста, так как это одноразовый).

В качестве альтернативы вы можете просто принудительно загрузить/потребовать обе библиотеки в нужной последовательности. Emacs занимает дробное дольше, чтобы начать, но вам не нужно беспокоиться о том, чтобы возиться с alist.

Я бы предложил использовать любой подход, с которым вам удобно.

+0

Взятие немного больше при запуске не является проблемой (1. Я делаю это один раз в день 2. С 1000 + line .emacs emacs все еще загружается мгновенно). Поэтому я попробовал вторую из двух предложенных вами идей (загрузка пакетов) - без успеха. Я изменил вопрос, чтобы отразить это. – Calaf

+0

'dired-load-hook 'уже запущен, прежде чем пытаться его использовать, поэтому ваш код никогда не запускается. Упростить в этом случае '(require 'dired-x)' после вашего '(require' dired)' и избавиться от крючка. – phils

+0

С .emacs, содержащим (требуется «ns-win») (требуется «facemenu») (требуется «потанцевано») (нагрузка «dired-x») M-o все еще вызывает функцию в ns-win. – Calaf