Enlazando M-<arriba>/M-<abajo> en Emacs 23.1.1
gnu-screen key-bindings (6)
Intento poner una característica que echo de menos en Eclipse, donde Alt + [ Arriba / Abajo ] transpone las líneas hacia arriba o hacia abajo, pero no puedo imaginar cómo asignarlas correctamente. Lo estoy usando en modo -nw
(tan solo en una ventana de shell), y normalmente lo ejecuto en una sesión de pantalla.
Utilizando un enlace de clave global, puedo hacer que funcione con combinaciones de letras, como (kbd "Mm")
, pero cada combinación que he probado para las teclas de flecha solo me da un mensaje que no tiene sentido, siempre obtengo:
"ESC <up> is undefined"
Lo que he intentado:
(global-set-key (kbd "M-<up>") ''transpose-line-up)
(global-set-key (kbd "<escape>-<up>") ''transpose-line-up)
(global-set-key [M-up] ''transpose-line-up)
(global-set-key [/e /M-O A] ''transpose-line-up)
Y Ch c solo regresa:
ESC <up> (translated from ESC M-O A) is undefined
Ninguno de estos funciona, ya sea usando ESC o Alt .
¿Alguna idea de cómo puedo hacer que esto funcione? Preferiría tener estos como Alt + [ Arriba / Abajo ] solo porque eso es a lo que estoy acostumbrado.
Editar
De los comentarios:
Cq Up prints
^[OA
.Cq M-Up imprime
^[
y mueve el cursor hacia arriba en una línea.Ch k ( Alt + Arriba ) imprime
ESC <up> (translated from ESC MO A) is undefined
.
Gracias por las sugerencias, pero todas resultaron lo mismo.
fea solución:
He escrito Cq <M-up> que produjo ^[[1;3A
en la screen
dentro de la terminal dentro de emacs
.
(global-set-key (kbd "<M-up>") ''transpose-line-up)
(global-set-key (kbd "^[[1;3A") ''transpose-line-up)
Tengo un Lisp error: (void-function transpose-line-up)
para que funcionen las asociaciones de teclas.
Nota: Cq ejecuta el comando quoted-insert
.
Asumiendo que tiene las funciones transpose-line-up
y transpose-line-down
ya definidas (como parece ser del código de ejemplo en su pregunta original):
(global-set-key [(meta up)] ''transpose-line-up)
(global-set-key [(meta down)] ''transpose-line-down)
Emacs tiene un mecanismo complejo para manejar las vicisitudes de la clave de función y las codificaciones de modificador en varios tipos de terminales. No funciona de la caja en todos los casos. La siguiente configuración debería funcionar en su terminal:
(define-key input-decode-map "/e/eOA" [(meta up)])
(define-key input-decode-map "/e/eOB" [(meta down)])
(global-set-key [(meta up)] ''transpose-line-up)
(global-set-key [(meta down)] ''transpose-line-down)
Debería poder usar (kbd "<M-up>")
y (kbd "<M-down>")
en lugar de [(meta up)]
y [(meta down)]
, siempre y cuando haya hizo el paso de decirle a Emacs (a través de input-decode-map
) sobre las secuencias de escape que usa su terminal para codificar estas combinaciones de teclas.
Las siguientes líneas me funcionan en macOS 10.11.6 y GNU Emacs 25.2.1 :
(global-set-key (kbd "ESC <down>") ''end-of-buffer)
(global-set-key (kbd "ESC <up>") ''beginning-of-buffer)
Siempre utilizo Chk (clave) (es decir, describe-key
) para descubrir cómo se refiere Emacs (clave), y luego uso (kbd)
con esa misma cadena para utilizarla.
En este caso, describe-key
devuelve <M-up>
, así que usaría (global-set-key (kbd "<M-up>") ''transpose-line-up)
(exactamente como lo hizo JF Sebastian).
Editar:
Ejecutando emacs -nw
(pero no a través de la pantalla), describe los informes clave ESC <up> (translated from ESC M-[ A)
, y (kbd "ESC <up>")
es exitoso para enlazarlo.
Ejecutando la screen emacs -nw
, describe-key reports ESC <up> (translated from ESC MO A)
, que parece coincidir con lo que ves, y el enlace para (kbd "ESC <up>")
aún funciona para mí.
(nb Probado en Cygwin con la pantalla 4.00.03 y Emacs 23.2.1.)
(global-set-key [M-up] ''beginning-of-buffer)
(global-set-key [M-down] ''end-of-buffer)
En mi OSX, tengo esta definición para realizar Alt-up / down para saltar a la parte superior / inferior del buffer.