Schlüsselspezifische Schlüsselbindungen

13

Ist es möglich, pufferspezifische Tastenkombinationen festzulegen?

Ich habe Folgendes in einer meiner Organisationsdateien:

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

Diese Bindung bleibt jedoch auch für andere Dateien im Organisationsmodus bestehen. Wenn ich eine Datei mit einem anderen Hauptmodus öffne, wird meine Standardschlüsselbindung aktiviert.

Es sieht so aus, local-set-keyals würden Bindungen für den Hauptmodus und nicht für den Puffer festgelegt.

Wie kann ich Bindungen haben, die nur in einem bestimmten Puffer aktiviert werden?

Kaushal Modi
quelle
2
Oh wow, Sie haben Recht: "Die Bindung wird in der lokalen Karte des aktuellen Puffers gespeichert, die in den meisten Fällen mit allen anderen Puffern im selben Hauptmodus geteilt wird." Ich habe das niemals gewusst.
Shosti
Jetzt, wo ich darüber nachdenke, local-unset-keymit Haken org-mode-hookfunktionieren können , wenn diese ausgeführt wird , bevor der Local Variables:Abschnitt ist.
Kaushal Modi
Oder Sie könnten einen Nebenmodus mit einer halb spärlichen Keymap erstellen und diese mitLocal Variables:
Vamsi
@ Vamsi Danke! Dies ist eine elegante Lösung! Ich habe Ihre Lösung aktualisiert.
Kaushal Modi

Antworten:

17

Zum Abschluss hier eine Antwort, die meinen Kommentar erweitert. Ich definiere einen Nebenmodus mit der erforderlichen Tastenkombination und schalte ihn mithilfe lokaler Dateivariablen in den erforderlichen Puffer um.

  (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)

Sie können es in den erforderlichen Dateien umschalten, indem Sie den Abschnitt mit den lokalen Variablen am Ende der Datei wie folgt festlegen. Hier können Sie auch die Tastenkombination ändern oder hinzufügen. Sie müssen weiterhin verschiedene Nebenmodi für jeden Puffer definieren, der dieselbe Tastenfolge verschiedenen Befehlen zuordnet.

 # 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
quelle
@kaushalmodi: Möglicherweise möchten Sie Ihre Änderungen in eine separate Antwort umwandeln, da diese vollständiger ist. Außerdem können Sie dieselbe Tastenfolge nicht gleichzeitig zwei verschiedenen Funktionen zuordnen, wenn Sie keinen pufferspezifischen Namen verwenden.
Vamsi
Ich erhalte diesen Fehler: eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-mapWenn ich versuche, dies auszuführen(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)
Glühlampenmann
Ich bekomme auch den gleichen Fehler. irgendeine Idee?
Zeltak
@incandescentman Anruf (Make-Keymap) mit :keymapSchlüsselwort, überprüfen Sie nullprogram.com/blog/2013/02/06
Nichijou
5

Hier ist eine generische Methode zum Festlegen pufferspezifischer Schlüsselbindungen.

  • Erstellen Sie einen temporären Nebenmodus (speichern Sie das folgende Snippet in temp-mode.elund requirein Ihrem init.el.
  • Aktivieren Sie diese temp-modeMoll und definieren , dass eine leichte-Modus des keymap nur in den Puffer (n) die Sie benötigen.

Legen Sie das folgende Local VariablesSnippet in den Puffer, in dem Sie die benutzerdefinierte Schlüsselbindung durchführen möchten. Unten finden Sie Beispiele für org-modeDateien.

In Puffer EINS

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

Wenn ein anderer Puffer dieselbe Schlüsselbindung mit neu definiert,

Im Puffer ZWEI

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

dann wird die neue Bindung wirksam M-x revert-buffer.

Dies würde ich tun, wenn ich sehr häufig zwischen diesen beiden Puffern wechseln muss und wenn ich die F10Bindung in beiden verwenden muss:

  • Arbeiten Sie in Puffer EINS C-x C-s(Speichern) und wechseln Sie zu Puffer ZWEI
  • revert-buffer(Bindungen aktualisieren), arbeiten Sie in Puffer ZWEI C-x C-sund wechseln Sie zu Puffer EINS
  • revert-buffer(Bindungen aktualisieren), arbeiten Sie in Puffer EINS C-x C-sund wechseln Sie zu Puffer ZWEI

Aber ich würde lieber die verschiedenen pufferspezifischen Befehle an verschiedene Schlüssel binden.


Temporärer Moll-Modus

;; 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
quelle