Ответ 1
Я считаю, что два подхода, которые вы описываете, менее разные, чем вы думаете.
Обратите внимание, что local-set-key
действительно оценивает (define-key map key command)
, где map
- это значение (current-local-map)
, которое обычно задается основным режимом.
Итак, хотя они могут делать разные вещи; большую часть времени единственное реальное различие будет в том, что функция hook с вызовом local-set-key
будет устанавливать эту же клавишу повторно/избыточно, тогда как другой подход устанавливает ее только один раз.
Вы можете продемонстрировать это себе, используя local-set-key
в режиме hook, удалив эту функцию hook после ее использования, а затем создав новый буфер в том же самом основном режиме и проверив привязку.
менее подвержен перерыву с новыми версиями emacs
Я думаю, вы могли бы утверждать, что имя ключевой карты может измениться в будущем, и поэтому не нужно знать имя, это преимущество, но вы можете сказать, что имя крючка режима может измениться. Я не думаю, что для этого достаточно заботы.
Следует отметить, что local-set-key
будет работать, даже если основной режим не установил current-local-map
, что, по моему мнению, делает его немного более надежным по сравнению с обобщенными подходами.
менее подвержен нарушению/нарушению активными второстепенными режимами
Нет никакой разницы. Все мажоранты с малым режимом имеют приоритет над всеми основными ключевыми картами режима, и ни один из подходов не будет иметь никакого эффекта на порядок minor-mode-map-alist
(который определяет приоритет клавиш мажорного режима).
более идиоматический/читаемый/доступный с другими
Они оба полностью читаемы мне, поэтому я не могу их отличить в этом аспекте.
Я говорю, просто используйте любой подход, который лучше всего подходит вам в каждом контексте. Я считаю, что хорошо иметь стандартный подход для большинства вещей ради согласованности вашего кода, но я сомневаюсь, что это важно, какой из них вы выберете. Очевидно, что экономия нескольких циклов ЦП должна выполняться без необходимости повторного вычисления одного и того же кода, но это должно иметь очень мало значения, чтобы не беспокоиться.
Я думаю, что наиболее очевидным случаем для одного над другим является тот, который вы уже упоминали, - если вы хотите применить одну и ту же привязку к нескольким режимам, используя общий крюк (но не ко всем режимам - для этого я настоятельно рекомендую создание настраиваемого второстепенного режима), тогда local-set-key
внутри этого крючка определенно подходит.