2010-03-12 11 views
7

Estoy intentando hacer mi primera modificación de Emacs. I grabada un poco macro de teclado y tenía Emacs escupirla como elisp, resultando en:Agregar vinculación de teclado al modo de Emacs existente

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

Busca la referencia Emacs, sin embargo, reveló que C-c C-d ya está enlazado en modo diff. No hago plan usando el modo diff, pero el futuro es incognoscible y me gustaría no tender una trampa para mí. Así que me gustaría que este enlace solo funcione en modo python, donde intenta ayudarme a agregar cadenas de documentos.

En mi /usr/share/emacs/23.whatever/list/progmodes, encontré python.elc y python.el.gz. Descomprimé python.el.gz y obtuve una versión legible del archivo elisp. Ahora, sin embargo, la documentación se vuelve opaca para mí.

¿Cómo puedo agregar mi combinación de teclas al modo python, en lugar de hacerlo globalmente?

¿Es posible, para puntos de bonificación, aplicar los cambios al modo python sin reiniciar emacs o cerrar archivos abiertos? Es el editor de auto modificación, me imagino que hay una buena posibilidad de que sea posible.

+0

El inevitable seguimiento: por supuesto, comencé a usar diff/ediff, así que me alegro de que los que respondieron me indicaron la dirección correcta. –

Respuesta

15

Resulta, C-C-C d ya está enlazado en python-mode (a 'python-pdbtrack-toggle-stack-tracking), por lo que es posible que desee revisar su opción de asociación de teclas.

Nota: si solo quiere cortar/pegar una solución, salte hasta el final de la respuesta. Siga leyendo para obtener una explicación de cómo llegar, en caso de que quiera volver a hacerlo.

El macro es un buen comienzo, pero lo que tiene no funcionará del todo. Para conseguir algo que se puede unir a una tecla, tratar Mx insert-kbd-macro de esa macro, y obtendrá:

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

(hm .... caracteres no imprimibles, lo que pueda' corte/pegue en SO, pero puede hacerlo usted mismo para obtener lo correcto). Con un poco de munging, lo que obtienes es equivalente a esto:

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

Ese es el primer paso. Con lo anterior, puede hacer M-x add-docstring y obtener el comportamiento que desee.

El siguiente paso es lo que ha preguntado: cómo enlazar las claves localmente.La documentación para keybindings begins here, y de su interés es el Local Keymaps section, lo que conduce a lo siguiente:

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

Esto configura una función anónima que se llamará cuando python-mode está encendido, y que la función hace una cosa - configura el enlace de clave que desea en el mapa de teclas específicamente para el modo python.

Si usted lee la Keymaps section de cerca, verá que Emacs sigue la convención de que sólo los usuarios deben unirse a commads Cc a, donde un es cualquier letra inferior o mayúscula (por ejemplo Cc dCc TCc p están disponibles), y los paquetes de limitar fijaciones específicas del modo de Cc%, donde % es cualquier tecla de carácter puntuacion o de control (por ejemplo Cc CcC-c [C-c C-z].

Por lo tanto, si cambia su encuadernación a C-c d, entonces se garantiza que no entrará en conflicto con ningún paquete. El python.el enviado con Emacs cumple con estas convenciones, al igual que la mayoría de los paquetes enviados con Emacs.

Notarás que utilizo kbd para leer en las secuencias de teclas. Es portátil y me resulta mucho más fácil de leer.

Hay otras cosas que podría hacer para limpiar esto:

  1. poner las personalizaciones en un uso named function
  2. rewrite the macro in elisp
  3. eval-after-load en lugar del gancho (véase esta pregunta)

Esto es lo que haría por # 1, que le da un lugar útil para poner otras personalizaciones:

(add-hook 'python-mode-hook 'my-python-customizations) 
(defun my-python-customizations() 
    "set up my personal customizations for python mode" 
    ;; put other customizations in here 
    (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)) 
(defun add-docstring (&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)) 

El uso de una función nombrada es un poco más limpio ya que más adelante puede hacer (remove-hook 'python-mode-hook 'my-python-customizations) si lo desea. Además, si observa el valor del gancho (C-h v python-mode-hook RET), es obvio lo que se llama (la función anónima es más larga y más difícil de leer).

Para los puntos de bonificación, después de que ha pegado el código en su .emacs hacer M-x-eval región, que le dirá Emacs para evaluar el código de la región. Para ver los cambios en los búferes de python existentes, solo tiene que abrir un nuevo archivo/buffer de python, que desencadenaría el cambio de enlace de clave, que es común a todos los búferes de python.

Happy hacking.

+0

Buen trabajo para responder la pregunta que quiero formular en lugar de lo que realmente pedí. Esto, creo, me apunta en la dirección correcta. –

4

En primer lugar, no te metas con python.el. Lo que quiere hacer es crear su propio enlace personalizado para el modo python. Esto generalmente se hace en su archivo .emacs en su directorio personal.

En ese archivo añadir algo como lo siguiente (no he probado esto - lo que puede haber algún error en la sintaxis y yo no usar Python mismo)

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

Se trata de utilizar el mecanismo de gancho. Es una función que se invoca cada vez que se invoca el modo python. Esta función solo enlaza C-c C-d a su función add-doc-string.

Esta respuesta es muy breve. Lea sobre el archivo .emacs, personalizaciones y enlaces en la documentación de emacs.

+0

Llegué al SO con mi pregunta porque ya había intentado cambiar la documentación y las cosas no tenían sentido. –

Cuestiones relacionadas