web-dev-qa-db-fra.com

Définir une liaison de touches personnalisée pour un mode Emacs spécifique

Bien que je sache comment définir une liaison de clé globale dans Emacs, j'ai du mal à égaler Google le code d'une liaison de clé locale (spécifique au mode mineur). Par exemple, j'ai ce code dans mon .emacs:

;; PDFLaTeX from AucTeX
(global-set-key (kbd "C-c M-p")
        (lambda ()
          (interactive)
          (Shell-command (concat "pdflatex " buffer-file-name))))

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

53
aL3xa

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, elle en a donc besoin.

47
Rémi

J'utilise ce qui suit:

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

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

41
Dror

Vous devez identifier le mappage de clés pour ce mode (par exemple, LaTeX-mode-map) et utilisez la fonction define-key. Par exemple, en plus d'activer outline-minor-mode en mode LaTeX, j'ai:

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

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

5
Kirk Kelsey

Aucune des autres réponses n'a satisfait mes besoins. Cela peut donc aider d'autres personnes. Je voulais que Tab saute au début de la ligne si je suis en mode normal d'Evil (en gros: cela signifie partout dans Emacs), mais je voulais plutôt qu'il passe d'un org à l'autre l'élément indique si je suis dans un document en mode organisation.

Une option était de jouer avec des liaisons distinctes et des liaisons de reliure constantes chaque fois que je commutais des tampons (car evil ne permet qu'une seule liaison par clé dans son état normal).

Mais une option plus efficace était de faire en sorte que Tab exécute mon propre code qui exécute la fonction requise en fonction du mode principal utilisé par le tampon actuel. Donc, si je suis dans un tampon d'organisation, ce code s'exécute org-cycle, sinon il s'exécute evil-first-non-blank (aller au premier caractère non blanc sur 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 à la place, pour les personnes qui utilisent régulièrement des Emacs non malveillants.

Pour ceux qui ne connaissent pas Emacs LISP, la première ligne après l'instruction "si" est la vraie action, et la ligne après c'est la fausse action. Donc si major-mode équivaut à org-mode, nous courrons org-cycle, sinon nous exécutons 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 "<tab>") 'my/tab-jump-or-org-cycle)
3
gw0