2013-04-10 2 views
6

Вот общий сценарий в Emacs: я хочу привязать функцию к ключу, но я не уверен, может ли он конфликтовать с существующим привязкой к ключу (легко проверить) или привязкой клавиш в «популярном» модуле (трудно проверить, что «популярный»)Есть ли энциклопедия emacs для ключевых слов?

было бы неплохо иметь энциклопедию: Если бы я посмотрел C-c C-t, я хотел бы видеть, что это связано с:

  • org-todo в org-mode
  • sgml-tag в sgml-mode
  • ...

Есть ли такая вещь? Я знаю, что могу использовать C-c A через C-c-Z и т. Д., Но иногда приятно не нажимать и отпускать клавишу Ctrl.

ответ

7

Я никогда не сталкивался с ресурсом такого рода вещей. Авторы пакетов могут свободно добавлять и изменять привязки клавиш, как в своих собственных раскладках, так и в глобальной раскладке. Было бы сложно поддерживать индекс.

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

M-x describe-bindings расскажет вам о привязках клавиш, которые в настоящий момент загружен Emacs. Это длинный список! Функция show-key-bindings ниже будет обрезать это до привязок, которые используют ключи-модификаторы.

(defun get-bindings() 
    (with-temp-buffer 
    (describe-buffer-bindings (current-buffer)) 
    (buffer-string))) 

(defun format-binding (b) 
    (let ((ws (split-string b))) 
    (apply 'format "%s\t%s" (butlast ws) (last ws)))) 

(defun binding? (str) 
    (string-match-p (rx bol (any "C" "M" "H" "S")) str)) 

(defun join-string-lines (lines) 
    (mapconcat 'identity lines "\n")) 

(defun show-key-bindings() 
    "Show the active keybindings for the current buffer." 
    (interactive) 
    (let* ((bs (split-string (get-bindings) "\n" t)) 
     (fmt (mapcar 'format-binding (remove-if-not 'binding? bs)))) 
    (save-excursion 
     (let ((help-window-select t)) 
     (with-help-window "*active bindings*" 
      (princ (join-string-lines fmt))))))) 

Просто резюмировать, есть несколько функций, которые можно использовать для настройки привязок:

  • global-set-key

    Используйте это, когда вы хотите, чтобы некоторые команды, чтобы быть всегда доступны ,

  • local-set-key

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

  • define-key

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

Если вы обеспокоены случайно переопределения привязок A Режим в вас EMACS конфигурации, проще всего сделать, это выяснить, действительно ли вам нужна команда, чтобы быть глобальной. Используйте local-set-key, где вы можете.

Вы также можете изучить пакеты, такие как key-chord (M-x package-install key-chord), или определить свои собственные второстепенные режимы с помощью настраиваемых раскладок, если вы обнаружите, что у вас заканчиваются ключи.


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

В то же время следующая команда оболочки unix найдет все ссылки на вышеуказанные формы привязки ключей в дереве каталогов. Вы можете запустить это в своем .emacs.d, чтобы проверить привязки клавиш, установленные в ваших пакетах elpa.

tree -fxi -P '*.el' | xargs egrep -s 'local-set-key|define-key|global-set-key' 
+1

Просто уточнение, что 'местного установленный key' устанавливает ключ привязки для текущего буфера локальной * * (клавиатурной раскладки, которые могут быть распределены между многими буферами, как правило, это основной режим карты). Очевидно, это означало, но формулировка была немного неоднозначной. – phils

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