bind-map — это пакет Emacs, предоставляющий bind-map
, который можно использовать для того, чтобы сделать раскладку ключей доступной для различных «лидерных ключей», включая те, которые привязаны к злым состояниям. По сути, это обобщение идеи ведущего ключа, используемого в vim или пакете злого лидера Emacs, и допускает произвольное количество «ведущих ключей». Вероятно, лучше всего это объяснить на примере.
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:evil-keys ( " SPC m " " , " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
Это сделает my-base-leader-map
(автоматически создающей карту, если она еще не определена) доступной под префиксами (или лидерами) Mm
и SPC
, где последний привязан только к нормальному состоянию, состоянию движения или визуальному состоянию зла. Второе объявление делает my-elisp-map
доступным по указанным ключам, когда активен один из указанных основных режимов. Во втором случае используемые злые состояния также представляют собой нормальное движение и визуальное состояние, поскольку это значение по умолчанию, как указано в bind-map-default-evil-states
. Можно сделать привязки зависящими от загрузки второстепенных режимов или сочетания основных и второстепенных режимов. Поскольку используются символы режимов, нет необходимости гарантировать, что какой-либо из пакетов режима загружен до этого объявления. Дополнительные параметры см. в строке bind-map
.
Этот пакет будет использовать зло только в том случае, если указано одно из ключевых слов, связанных со злом. Например, эта декларация не использует злой пакет.
(bind-map my-elisp-map
:keys ( " M-m m " " M-RET " )
:major-modes ( emacs-lisp-mode
lisp-interaction-mode))
Идея этого пакета заключается в том, что вы хотите организовать свои личные привязки в виде серии раскладок клавиш отдельно от встроенных карт режимов. Вы можете просто добавить ключи, используя, например, встроенный define-key
в my-elisp-map
, и объявление, подобное приведенному выше, позаботится о том, чтобы эти привязки были доступны в правильных местах.
Вы можете использовать встроенный define-key
, который будет работать по назначению. еще один вариант bind-key
(часть use-package). Если вам нужен другой интерфейс, вы можете использовать ключевое слово :bindings
в макросе bind-map
или две предоставленные функции bind-map-set-keys
и bind-map-set-key-defaults
, которые просто используют define-key
внутри, но позволяет использовать несколько привязок без особого синтаксиса.
(bind-map my-base-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual)
:bindings ( " c " 'compile
" C " 'check ))
(bind-map-set-keys my-base-leader-map
" c " 'compile
" C " 'check
; ; ...
)
; ; is the same as
; ; (define-key my-base-leader-map (kbd "c") 'compile)
; ; (define-key my-base-leader-map (kbd "C") 'check)
; ; ...
(bind-map-set-key-defaults my-base-leader-map
" c " 'compile
; ; ...
)
; ; is the same as
; ; (unless (lookup-key my-base-leader-map (kbd "c"))
; ; (define-key my-base-leader-map (kbd "c") 'compile))
; ; ...
Вторая функция добавляет привязки только в том случае, если для этого ключа не существует привязки. Вероятно, это полезно только для общих конфигураций, где вы хотите предоставить привязку по умолчанию, но не хотите, чтобы эта привязка перезаписывала привязку, созданную пользователем. Обратите внимание, что ключи в обеих функциях представляют собой строки, которые передаются в kbd
перед их привязкой.
Если вы используете несколько объявлений bind-map
вы можете обнаружить, что повторяетесь такие свойства, как :evil-keys
и :evil-states
. Вы можете использоватьbind bind-map-for-mode-inherit
для автоматического извлечения этих свойств из родительской карты, как показано в следующем примере. Дополнительную информацию смотрите в строке документации.
(bind-map my-leader-map
:keys ( " M-m " )
:evil-keys ( " SPC " )
:evil-states (normal motion visual))
(bind-map-for-mode-inherit my-markdown-map my-leader-map
:major-modes ( markdown-mode ))