emacs keyboard-shortcuts

Globalmente anula el enlace de clave en Emacs



keyboard-shortcuts (8)

¿Cómo puedo establecer un enlace de clave que anula globalmente y tiene prioridad sobre todos los demás enlaces para esa clave? Quiero anular todos los mapas del modo principal / secundario y asegurarme de que mi enlace siempre esté vigente.

Esto por supuesto no funciona:

(global-set-key "/C-i" ''some-function)

Funciona en text-mode , pero cuando uso lisp-mode , Ci se rebota a lisp-indent-line .

Puedo revisar y anular este enlace en lisp-mode y en cualquier otro modo individualmente, pero debe haber una manera más fácil. Cada vez que instalo un nuevo modo para un nuevo tipo de archivo, tendría que volver atrás y verificar para asegurarse de que el nuevo modo no anule todas mis combinaciones de teclas.

Quiero hacer esto porque quiero emular enlaces que ya he aprendido y arraigados de otros editores.


A menos que realmente quiera hacer esto usted mismo, debe verificar y ver si alguien más ya lo ha hecho.

Hay un paquete para Emacs que proporciona combinaciones de teclas similares a las de Windows. Deberías poder encontrarlo a través de google.


Aunque la respuesta de scottfrazer es exactamente lo que usted solicitó, mencionaré para la posteridad otra solución.

Del manual de The Emacs :

"No defina la letra Cc como una clave en los programas Lisp. Las secuencias que constan de Cc y una letra (mayúscula o minúscula) están reservadas para los usuarios, son las únicas secuencias reservadas para los usuarios, así que no las bloquee".

Si vincula sus enlaces globales personales a Cc más una letra, entonces "debería" estar a salvo. Sin embargo, esto es simplemente una convención, y cualquier modo aún puede anular tus enlaces.


Como complemento de share , escribí lo siguiente para que mis combinaciones de teclas retuvieran la precedencia, incluso si las bibliotecas cargadas posteriormente incluyen nuevos mapas de teclas propios.

Debido a que los mapas de teclas se pueden generar en tiempo de compilación, la load parecía el mejor lugar para hacerlo.

(add-hook ''after-load-functions ''my-keys-have-priority) (defun my-keys-have-priority (_file) "Try to ensure that my keybindings retain priority over other minor modes. Called via the `after-load-functions'' special hook." (unless (eq (caar minor-mode-map-alist) ''my-keys-minor-mode) (let ((mykeys (assq ''my-keys-minor-mode minor-mode-map-alist))) (assq-delete-all ''my-keys-minor-mode minor-mode-map-alist) (add-to-list ''minor-mode-map-alist mykeys))))


Encontré esta pregunta mientras buscaba "emacs undefine org mode keybindings", porque quería desvincular el comportamiento Cc Cb existente para permitir que mi mapa global a bury-buffer funcione en un buffer orgánico.

Esto terminó siendo la solución más simple para mí:

(add-hook ''org-mode-hook (lambda () (local-unset-key (kbd "C-c C-b"))))


Instale use-package , eval y listo:

(require ''bind-key) (bind-key* "C-i" ''some-function)


No creo que puedas. Eso es más o menos equivalente a decir que desea definir una variable global que no pueda ocultarse mediante declaraciones de variables locales en funciones. El alcance simplemente no funciona de esa manera.

Sin embargo, puede haber una forma de escribir una función elisp para ir a través de la lista de modos y reasignarla en cada uno por usted.


Si desea "usar siempre los enlaces de teclado en el mapa, a menos que los anule explícitamente para un mapa de modo específico", y suponiendo que esté utilizando share , quiere:

(defun locally-override (key cmd) (unless (local-variable-p ''my-keys-minor-mode-map) (set (make-variable-buffer-local ''my-keys-minor-mode-map) (make-sparse-keymap)) (set-keymap-parent my-keys-minor-mode-map (default-value ''my-keys-minor-mode-map))) (define-key my-keys-minor-mode-map key cmd))

Asi que

(locally-override "/C-i" nil)

debería eliminar el enlace "/ Ci" del modo menor en el búfer actual solamente. Advertencia: esto no se ha probado por completo, pero parece ser el enfoque correcto. El objetivo de configurar el elemento primario en lugar de simplemente hacer frente al valor global de my-keys-minor-mode-map es que cualquier cambio posterior en el valor global se refleje automáticamente en el valor local.


Uso un modo menor para todas mis combinaciones de teclas "anular":

(defvar my-keys-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-i") ''some-function) map) "my-keys-minor-mode keymap.") (define-minor-mode my-keys-minor-mode "A minor mode so that my key settings override annoying major modes." :init-value t :lighter " my-keys") (my-keys-minor-mode 1)

Esto tiene el beneficio adicional de poder desactivar todas mis modificaciones de una sola vez (solo deshabilitar el modo menor) en caso de que alguien más maneje el teclado o si necesito ver lo que hace un enlace de tecla predeterminado.

Tenga en cuenta que puede necesitar apagar esto en el minibúfer:

(defun my-minibuffer-setup-hook () (my-keys-minor-mode 0)) (add-hook ''minibuffer-setup-hook ''my-minibuffer-setup-hook)