2012-05-18 11 views
5

este S-expresión en mi archivo .emacs no produce el resultado deseado:¿Cómo puedo enlazar C- = en emacs?

(define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop) 

Por qué no puedo enlazar un comando para Ctrl +=?

EDITAR de aclaración:

estoy usando emacs23-nox en la compilación estándar de urxvt-256colors para Debian, excepto que me han vuelto a compilar con --disable-iso405776 (o algo por el estilo) para que Ctrl + Shift no hace la cosa extraña de "insertar el carácter". No sé si esto afecta algo. Por ejemplo, C-M-i envía M-TAB, que no entiendo.

EDITAR II:

me disculpo por no hacer esto claro. La función djhaskin987-untab-to-tab-stop tiene la línea (interactive) en ella. Esta parte funciona

+1

C-i se traduce generalmente como 'TAB' en emacs. Así que no me sorprendería si 'C-M-i' se traduce como' M-TAB' – kindahero

Respuesta

6

En un terminal, TAB está representada por la misma secuencia de byte como C-i. Y típicamente el terminal no tiene una secuencia de bytes especial para C- =, por lo que enviará un =. No hay nada que Emacs pueda hacer al respecto. Pero es posible que pueda enseñar a su emulador de terminal a enviar una secuencia especial de bytes de su elección (consulte la documentación de su emulador de terminal para eso), después de lo cual puede enseñarle a Emacs a reconocerlo como C- = (con algo como (define-key input-decode-map "...thebytes..." [?\C-=])).

+1

gracias Stefan ... eso es muy útil ... Por ejemplo, en este paquete, alguien se tomó muchas molestias para que xterm funcionara mejor con emacs. http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/xterm-extras.el (vea el comentario del archivo .Xresource) – kindahero

+0

+1 Gracias por ayudarme a resolver mi problema. Puedo ver que este es el camino a seguir. – djhaskin987

+0

Quizás sea mejor editar en la solución real: el archivo vinculado se comprime y el enlace podría romperse fácilmente. ¿'C- =' es especial en terminales? La estrategia general parece ser convertir claves X en secuencias de escape de terminal no utilizadas y luego definir las claves de emacs para estos y otros escapes de terminal previamente indefinidos (y luego unir esas teclas a funciones). –

0

La función que vincula debe ser interactiva. Pruebe:

(define-key global-map (kbd "C-=") 
    (lambda() (interactive) (djhaskin987-untab-to-tab-stop))) 
+0

Me temo que no, pero gracias por la sugerencia. Cuando uso esta línea (o la mía) y presiono CTRL + =, simplemente escribe un '=' en el búfer. – djhaskin987

1

El problema es que utiliza emacs en el terminal. El terminal no permite "C- =". Pruebe su función en los emacs gráficos y funcionará. Tendrá que buscar otra combinación de teclas para el terminal.

+1

Me doy cuenta de esto, pero a efectos de preferencia personal (para que pueda acceder a emacs incluso a través de SSH, y para que todo mi material esté en el terminal), quiero que C- = funcione incluso en el terminal. – djhaskin987

5

La respuesta aceptada en combinación con link in the first comment to it es suficiente para comenzar una solución completa. Los pasos son:

  1. hacer sus códigos de escape de salida de terminal para la clave
  2. crea Emacs reconocen los códigos de escape como una pulsación de tecla estándar
  3. unen la pulsación de tecla en un mapa modo de

La primera es muy terminal y/o depende del sistema operativo.

El enlace en el primer comentario muestra algunos ejemplos para X Window System. Los nombres de las teclas están disponibles en /usr/X11R6/include/X11/keysymdef.h (o intente locate keysymdef.h), con el prefijo XK_ (que debe eliminarse para nuestros fines).Leí que los nombres simbólicos son preferibles a los literales clave.

que actualmente no ejecutan X pero creo que debería tener este aspecto en su caso:

XTerm.VT100.Translations: #override \ 
Ctrl ~Meta ~Shift <Key> equal:   string(0x1b) string("[emacs-C-=")\n 

La primera cadena es el escape, el segundo es de su elección.

En iTerm puede usar Preferences->Keys y elegir Send Escape Sequence como Action. Por ejemplo, tengo:

iTerm key mappings

Emacs Wiki lists some configuration methods para otros terminales.

Ahora puede enseñar a Emacs a reconocerlo como C- =. Primero define-key en input-decode-map. Tengo un par de funciones de ayuda:

(defun my/global-map-and-set-key (key command &optional prefix suffix) 
    "`my/map-key' KEY then `global-set-key' KEY with COMMAND. 
PREFIX or SUFFIX can wrap the key when passing to `global-set-key'." 
    (my/map-key key) 
    (global-set-key (kbd (concat prefix key suffix)) command)) 

(defun my/map-key (key) 
    "Map KEY from escape sequence \"\e[emacs-KEY\." 
    (define-key function-key-map (concat "\e[emacs-" key) (kbd key))) 

Entonces:

(my/global-map-and-set-key "C-=" 'some-function-to-bind-to) 

Algunas teclas (en la actualidad: ()\|;'`"#.,) tendrá que escapar de la cadena, como C-\..

Cuestiones relacionadas