2010-03-12 9 views
7

Ich versuche meine erste Modifikation von Emacs. Ich nahm ein wenig Tastatur Makro- und hatte Emacs es spucken wie elisp aus, was zu:Fügen Sie die Tastaturbindung zum vorhandenen Emacs-Modus hinzu

(setq add-docstring 
    "\C-rdef\C-n\C-a\C-m\C-p\C-i\C-u6\"\C-u3\C-b") 
(global-set-key "\C-c\C-d" 'add-docstring)

die Emacs Referenz Suche ergab jedoch, dass C-c C-d bereits in Diff-Modus gebunden ist. Ich habe keine Plan auf Diff-Modus, aber die Zukunft ist unerkennbar und ich möchte nicht eine Falle für mich selbst zu legen. Daher möchte ich, dass diese Tastatur nur im Python-Modus funktioniert, in dem versucht wird, Docstrings hinzuzufügen. In meinem /usr/share/emacs/23.whatever/list/progmodes fand ich python.elc und python.el.gz. Ich entpackte python.el.gz und erhielt eine lesbare Version der elisp Datei. Jetzt wird die Dokumentation für mich undurchsichtig.

Wie kann ich meine Schlüsselbindung dem Python-Modus hinzufügen, anstatt global?

Ist es für Bonuspunkte möglich, die Änderungen im Python-Modus anzuwenden, ohne Emacs neu zu starten oder Dateien zu schließen? Es ist der selbstmodifizierende Editor, ich denke, es gibt eine gute Chance, dass es möglich ist.

+0

Das unvermeidliche Follow-up: Natürlich habe ich diff/ediff benutzt, also bin ich froh, dass die Antworten mich in die richtige Richtung wiesen. –

Antwort

15

Es stellt sich heraus, C-c C-d ist bereits in python-mode (bis 'python-pdbtrack-toggle-stack-tracking) gebunden, so dass Sie Ihre Wahl der Tastenkombination nochmals zu besuchen möchten.

Hinweis: Wenn Sie nur eine Lösung ausschneiden/einfügen möchten, springen Sie zum Ende der Antwort. Lesen Sie weiter für eine Erklärung, wie Sie dorthin kommen - falls Sie es wieder tun wollen.

Das Makro ist ein guter Anfang, aber was Sie haben, wird nicht ganz funktionieren. Um etwas, das Sie zu einem Schlüssel binden können, versuchen Mx insert-kbd-macro für das Makro, und Sie erhalten:

(fset 'add-docstring 
    (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("def ...unprintable characters...6\"3" 0 "%d")) arg))) 

(hm .... nicht druckbare Zeichen, ich kann‘ t schneiden/einfügen in SO, aber Sie können es selbst tun, um das Richtige zu bekommen). Mit ein wenig munging, was Sie zu diesem Äquivalent erhalten:

(fset 'add-docstring 
     (lambda (&optional arg) 
     "Keyboard macro." 
     (interactive "p") 
     (kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d") 
           arg))) 

dass der erste Schritt ist. Mit dem oben genannten können Sie M-x add-docstring tun und das gewünschte Verhalten erhalten.

Der nächste Schritt ist, was Sie gefragt haben - wie Sie lokal an Schlüssel binden.Die Dokumentation für keybindings begins here, und für Sie von Interesse ist die Local Keymaps section, was das führt folgende:

(add-hook 'python-mode-hook 
      (lambda() (define-key python-mode-map (kbd "C-c C-d") 'add-docstring))) 

Dies stellt eine anonyme Funktion aufgerufen werden, wenn python-mode eingeschaltet wird, und diese Funktion ist eine Sache - es richtet die gewünschte Schlüsselbindung in der Keymap speziell für den Python-Modus ein.

Wenn Sie die Keymaps section genau lesen, werden Sie sehen, dass Emacs die Konvention folgt, dass nur Benutzer commads an Cc ein binden sollte, wo ein ist jede untere oder Großbuchstaben (zB Cc dCc TCc p ist vorhanden), und Pakete constrain Modus-spezifische Bindungen an Cc%, wobei % ist jedes Interpunktionszeichen oder Steuertaste (zB Cc CcC-c [C-c C-z).

Also, wenn Sie Ihre Bindung zu C-c d ändern, dann sind Sie so ziemlich garantiert nicht mit irgendwelchen Paketen da draußen zu widersprechen. Die mit Emacs ausgelieferte Version python.el folgt diesen Konventionen ebenso wie die meisten (alle?) Pakete, die mit Emacs ausgeliefert werden.

Sie werden feststellen, dass ich kbd verwende, um die Tastenfolgen einzulesen. Es ist tragbar und ich finde es viel einfacher zu lesen.

Es gibt noch weitere Dinge, die Sie tun, könnte dies zu bereinigen:

  1. setzen die Anpassungen in einer named function
  2. rewrite the macro in elisp
  3. Verwendung eval-after-load anstelle des Hakens (diese Frage sehen)

Hier ist, was ich für # 1 tun würde, die Ihnen eine handliche Stelle gibt, um andere Anpassungen zu setzen:

Verwenden Sie eine benannte Funktion ist ein wenig sauberer in dem Sie später (remove-hook 'python-mode-hook 'my-python-customizations) tun können, wenn Sie dies wünschen. Wenn Sie sich den Wert für den Hook ansehen (C-h v python-mode-hook RET), ist es offensichtlich, was aufgerufen wird (die anonyme Funktion ist länger und schwieriger zu lesen).

Für die Bonuspunkte, nachdem Sie den Code in Ihre .emacs tun geklebt M-x eval-Region, die Emacs wird sagen Sie den Code in der Region zu bewerten. Um die Änderungen in Ihren vorhandenen Python-Puffern zu sehen, müssen Sie lediglich eine neue Python-Datei/einen neuen Puf- fer öffnen, der die für alle Python-Puf- fer übliche Änderung der Tastatureingaben auslöst.

Happy hacken.

+0

Guter Job, der die Frage beantwortet, die ich _meant_ stelle, anstatt zu fragen, was ich tatsächlich fragte. Dies, denke ich, weist mich in die richtige Richtung. –

4

Erstens, verwirren Sie nicht mit python.el. Sie möchten Ihre eigene benutzerdefinierte Bindung für den Python-Modus erstellen. Dies geschieht normalerweise in Ihrer .emacs Datei in Ihrem Home-Verzeichnis.

In dieser Datei so etwas wie die folgende hinzufügen (ich habe nicht getestet - so kann es einige Fehler in der Syntax und ich verwende mich nicht python)

(add-hook 'python-mode-hook 
    '(lambda() (define-key python-mode-map "\C-c\C-d" 'add-doc-string))) 

Dieser der Hakenmechanismus verwendet. Es ist eine Funktion, die jedes Mal aufgerufen wird, wenn Sie den Python-Modus aufrufen. Diese Funktion bindet nur C-c C-d an Ihre add-doc-string Funktion.

Diese Antwort ist sehr kurz. In der Emacs-Dokumentation finden Sie Informationen zur Emacs-Datei, Anpassungen und Hooks.

+0

Ich kam mit meiner Frage zu SO, weil ich schon versucht hatte, die Dokumentation zu kopieren und die Dinge keinen Sinn ergaben. –

Verwandte Themen