Liaisons de touches spécifiques à un tampon

13

Est-il possible de définir des raccourcis clavier spécifiques au tampon?

J'ai les éléments suivants dans l'un de mes fichiers d'organisation:

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

Mais cette liaison persiste également pour les autres fichiers en mode org. Si j'ouvre un fichier avec un mode majeur différent, ma liaison de touches par défaut entre en jeu.

Il semble que la local-set-keydéfinition de liaisons spécifiques au mode principal ne soit pas spécifique au tampon.

Comment puis-je avoir des liaisons qui s'activent uniquement dans un tampon particulier?

Kaushal Modi
la source
2
Oh wow, vous avez raison: "La liaison va dans la carte locale du tampon actuel, qui dans la plupart des cas est partagée avec tous les autres tampons dans le même mode principal." Je n'ai jamais su cela.
shosti
Maintenant que j'y pense, local-unset-keyaccroché org-mode-hookpourrait fonctionner si cela est exécuté avant la Local Variables:section.
Kaushal Modi
Ou vous pouvez créer un mode mineur avec un clavier semi-clairsemé et le basculer en utilisantLocal Variables:
Vamsi
@Vamsi Merci! C'est une solution élégante! J'ai mis à jour votre solution.
Kaushal Modi

Réponses:

17

Pour terminer, voici une réponse qui développe mon commentaire. Je définis un mode mineur avec le raccourci clavier requis et le bascule dans le tampon requis en utilisant des variables locales de fichier.

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

Vous pouvez le basculer dans les fichiers nécessaires en définissant la section des variables locales à la fin du fichier comme suit. Vous pouvez également modifier ou ajouter le raccourci clavier ici. Vous devrez toujours définir différents modes mineurs pour chaque tampon qui mappe la même séquence de touches à différentes commandes.

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:
Vamsi
la source
@kaushalmodi: Vous voudrez peut-être transformer vos modifications en une réponse distincte car elle est plus complète. En outre, vous ne pourriez pas mapper la même séquence de touches à deux fonctions différentes simultanément à moins d'utiliser un nom spécifique au tampon.
Vamsi
J'obtiens cette erreur: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapquand j'essaye d'exécuter ceci(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
incandescentman
J'obtiens également la même erreur. une idée?
zeltak
@incandescentman appel (make-keymap) avec :keymapmot-clé, consultez nullprogram.com/blog/2013/02/06
nichijou
5

Voici une manière générique de définir des liaisons de touches spécifiques au tampon.

  • Créer un mode temporaire mineur (enregistrez l'extrait ci - dessous pour temp-mode.elet requiredans votre init.el.
  • Activez ce temp-modemode mineur et définissez le clavier de ce mode mineur uniquement dans le (s) tampon (s) dont vous avez besoin.

Placez l' Local Variablesextrait ci-dessous dans le tampon où vous souhaitez la liaison de clé personnalisée. Voici des exemples de org-modefichiers.

Dans le tampon ONE

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

Si un autre tampon redéfinit la même liaison de clé à l'aide de,

Dans le tampon DEUX

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

la nouvelle liaison devient alors effective M-x revert-buffer.

C'est ce que je ferais si je dois basculer entre ces deux tampons très fréquemment et si je dois utiliser la F10liaison dans les deux:

  • Travaillez dans le tampon UN, C-x C-s(enregistrez) et passez au tampon DEUX
  • revert-buffer(actualisez les liaisons), travaillez dans le tampon DEUX C-x C-set passez au tampon UN
  • revert-buffer(actualisez les liaisons), travaillez dans le tampon UN C-x C-set passez au tampon DEUX

Mais je préfère lier les différentes commandes spécifiques au tampon à différentes clés.


Mode mineur temporaire

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

(provide 'temp-mode)
Kaushal Modi
la source