Définir la liaison de clé personnalisée pour le mode Emacs spécifique

Bien que je sache comment définir une liaison de clé globale dans Emacs, je trouve difficile de trouver le code pour une liaison de clé locale (en mode mineur). Par exemple, j’ai ce code dans mes .emacs :

 ;; PDFLaTeX from AucTeX (global-set-key (kbd "Cc Mp") (lambda () (interactive) (shell-command (concat "pdflatex " buffer-file-name)))) 

Je ne veux pas le définir globalement. Y a-t-il une fonction comme local-set-key ?

Pour lier une clé dans un mode, vous devez attendre que le mode soit chargé avant de définir la clé. On pourrait exiger le mode, ou utiliser eval-after-load

  (eval-after-load 'latex '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))) 

N’oubliez pas non plus – eval-after-load n’est pas une macro, il en a donc besoin.

J’utilise les éléments suivants:

 (add-hook 'LaTeX-mode-hook (lambda () (local-set-key (kbd "C-0") #'run-latexmk))) 

avoir une liaison définie pour le mode LaTeX seul.

Vous devez identifier la carte clé pour ce mode (par exemple, LaTeX-mode-map ) et utiliser la fonction define-key . A titre d’exemple, avec l’activation du mode outline-minor-mode dans le mode LaTeX, j’ai:

  (define-key LaTeX-mode-map [(tab)] 'outline-cycle)) 

Dans ce cas, le mode majeur (LaTeX) contient la liaison de la clé, mais il existe également un outline-minor-mode-map .

Aucune des autres réponses ne répondait à mes besoins. Cela peut donc aider d’autres personnes. Je voulais que Tab au début de la ligne si je suis dans le mode normal de Evil (essentiellement: cela signifie partout dans Emacs), mais je voulais plutôt le faire passer entre les états des éléments org si je suis dans un document org-mode.

Une option était de jouer avec des liaisons séparées et une reliure de liaison constante chaque fois que je changeais de tampon (parce que le mal n’autorisait qu’une liaison par clé dans son état normal).

Mais une option plus efficace était de faire exécuter par Tab mon propre code qui exécute la fonction requirejse en fonction du mode principal utilisé par le tampon actuel. Donc, si je suis dans un tampon org, ce code exécute org-cycle , sinon il s’exécute evil-first-non-blank (allez au premier caractère non blanc de la ligne).

La technique que j’ai utilisée ici peut également être utilisée en appelant votre fonction personnalisée via global-set-key , pour les personnes qui utilisent des Emacs non maléfiques classiques.

Pour ceux qui ne connaissent pas Emacs lisp, la première ligne après l’instruction “if” est l’action vraie, et la ligne après est la fausse action. Donc, si major-mode est égal à org-mode , on lance org-cycle , sinon on lance evil-first-non-blank dans tous les autres modes:

  (defun my/tab-jump-or-org-cycle () "jumps to beginning of line in all modes except org mode, where it cycles" (interactive) (if (equal major-mode 'org-mode) (org-cycle) (evil-first-non-blank)) ) (define-key evil-normal-state-map (kbd "") 'my/tab-jump-or-org-cycle)