2012-10-27 3 views
14

Je veux utiliser un mode mineur qui lie de nouveau une clé majeure du mode que je veux vraiment garder. Comment puis-je redéfinir la clé sans la supprimer globalement de la carte en mode mineur? Je sais que je peux utiliser define-key pour cela, mais je voudrais garder la liaison pour les autres tampons/modes majeurs.liaisons tampon localement prioritaire clé en mode mineur dans Emacs

Quelqu'un peut-il aider?

Répondre

12

Il est un peu compliqué à faire. Vous pouvez faire quelque chose comme:

(add-hook '<major-mode>-hook 
    (lambda() 
    (let ((oldmap (cdr (assoc '<minor-mode> minor-mode-map-alist))) 
      (newmap (make-sparse-keymap))) 
     (set-keymap-parent newmap oldmap) 
     (define-key newmap [<thekeyIwanttohide>] nil) 
     (make-local-variable 'minor-mode-overriding-map-alist) 
     (push `(<minor-mode> . ,newmap) minor-mode-overriding-map-alist)))) 
+0

Grand, que le travail! Je suis surpris que cette tâche apparemment simple soit si lourde ... – sebhofer

+0

sebhofer: L'intention des cartes-clés spécifiques au mode est qu'elles * prennent * effet partout où ce mode est actif, donc je n'appellerais pas la tâche de contournant ce comportement "apparemment simple" du tout. Compte tenu de ces circonstances, cette solution semble assez élégante. – phils

+0

@phils Eh bien, d'un point de vue un peu naïf, la tâche est: Écraser une liaison de touches dans un tampon donné. Semble assez simple pour moi. – sebhofer

11

Voici une fonction pour gérer tous les bits encombrants.

(defun local-set-minor-mode-key (mode key def) 
    "Overrides a minor mode keybinding for the local 
    buffer, by creating or altering keymaps stored in buffer-local 
    `minor-mode-overriding-map-alist'." 
    (let* ((oldmap (cdr (assoc mode minor-mode-map-alist))) 
     (newmap (or (cdr (assoc mode minor-mode-overriding-map-alist)) 
        (let ((map (make-sparse-keymap))) 
         (set-keymap-parent map oldmap) 
         (push `(,mode . ,map) minor-mode-overriding-map-alist) 
         map)))) 
    (define-key newmap key def))) 

Ensuite, vous pouvez faire

(local-set-minor-mode-key '<minor-mode> (kbd "key-to-hide") nil) 
+0

Merci beaucoup, fonctionne comme prévu! – sebhofer

1

Dans mon cas, company-mode était Dérogation des liaisons pour cider-repl-modeM-p et M-n lorsque le menu Société achèvements montrait. Le keymap pour le menu achèvements est company-active-map, mais il n'y a pas de mode mineur qui lui correspond (company-mode est lorsque le menu est pas actif), donc je ne pouvais pas utiliser les réponses existantes.

Voici ce que je suis venu avec la place:

(add-hook 'cider-repl-mode-hook 
      (lambda() 
      (make-local-variable 'company-active-map) 
      (setq company-active-map (copy-tree company-active-map)) 
      (define-key company-active-map (kbd "M-p") nil) 
      (define-key company-active-map (kbd "M-n") nil))) 
Questions connexes