Shift + Up no es reconocido por Emacs en una terminal

15

Muy a menudo uso Shift+ Up/Downpara seleccionar una región en Emacs. Funciona bien en modo GUI, pero cuando emacsse invoca con la -nwopción, puedo seleccionar líneas solo con Shift+ Down. El Shift+ Upno funciona, recibo este mensaje de error en el minibúfer:

<select> is undefined

¿Cómo puedo resolver este problema?

WeSenseASoulInSearchOfAnswers
fuente

Respuestas:

13

Un terminal de texto transmite solo caracteres (más precisamente, bytes), no claves. Las teclas y los acordes de teclado (teclas con modificadores) están codificados como secuencias de caracteres. Las claves que insertan caracteres imprimibles se envían como ellos mismos; Las teclas de función se envían como secuencias de escape. La mayoría de las secuencias de escape consisten en el carácter Escape ( ?\een la sintaxis de Emacs) seguido de dos o más caracteres imprimibles. Consulte Teclas de control y arriba / abajo en el terminal para uso de emacs y ¿Cómo funcionan la entrada del teclado y la salida de texto? para más información.

Emacs tiene un mecanismo para traducir secuencias de escape en su propia noción de claves. La tabla de traducción input-decode-mapse inicializa cuando se inicia Emacs (o más precisamente, cuando se abre un nuevo marco: esta variable tiene un valor diferente en cada terminal). A veces, Emacs no conoce todas las secuencias de escape enviadas por el terminal.

En su caso, parece que Emacs tiene una interpretación incorrecta para la secuencia de escape enviada por Shift+ Up. Necesitas decirle que lo interprete como en S-uplugar de select. Primero, descubra cuál es la secuencia de escape. En el *scratch*búfer, presione Ctrl+ Qluego Shift+ Up. El comando C-qhace que el siguiente carácter, que es el carácter de escape, se inserte literalmente, seguido del resto de la secuencia de escape. Digamos que Shift+ Upenvía \e[1;2Aen nuestro sistema, entonces deberá redefinir la entrada correspondiente en input-mode-map:

(define-key input-decode-map "\e[1;2A" [S-up])

En principio, input-decode-mapdebe establecerse por terminal. En la práctica, es muy raro tener dos terminales en los que la misma secuencia de escape codifique diferentes claves, por lo que una configuración global funcionará bien.

Gilles 'SO- deja de ser malvado'
fuente
Su respuesta parece responder a mi pregunta aquí: emacs.stackexchange.com/questions/33988 . Are the (define-key ...)Se supone que los comandos deben entrar en init.el? ¿Hay un ejemplo detallado en algún lugar que pueda mirar?
vfclists
Los define-keycomandos @vfclists van a su archivo init. Eso puede ser ~/.emacs.d/init.elo un par de otras ubicaciones. Encontrarás muchos ejemplos de usos define-keyal buscar define-key, pero encontrar qué mapa vincular es otra cuestión. Varios mapas están involucrados: global-map, input-decode-map, function-key-map, keyboard-translate-map. No sé cómo responder a tu pregunta porque no sé Spacemacs. No recomiendo el uso de paquetes como Spacemacs que redefinen desordenadamente las interfaces estándar.
Gilles 'SO- deja de ser malvado'
He cambiado a emacs normales para aprender el modo org y logré trabajar input-decode-mapdespués de encontrar algunos ejemplos. ¿Puedo considerar que se input-decode-mapaplica cuando el usuario ingresa texto en un búfer?
vfclists
@vfclists input-decode-mapes uno de los mapas de teclas que se aplican. Consulte el manual para más detalles.
Gilles 'SO- deja de ser malvado'
5

En emacs, la región está delimitada por el punto (cursor) y la marca (alguna posición anterior del cursor, que ha sido "marcada").

Por lo tanto, para "seleccionar una región", debe colocar esa marca y luego mover el punto.

La forma más fácil de colocar la marca es presionar C-SPC. Luego, simplemente mueva el cursor, verá que la "región" se extiende como lo hace.

Para "deseleccionar la región", puede presionar C-SPCnuevamente.

Dado que "shift + movimiento" es una combinación de teclas común en otro software, por defecto, emula este comportamiento de "seleccionar región". Sin embargo, no funciona en la terminal, porque shift no se puede enviar a emacs como una tecla modificadora.

Tenga en cuenta que, en general, el C-SPCmétodo es mucho más poderoso que otros métodos para seleccionar una región: no está limitado a arriba / abajo / izquierda / derecha para el movimiento (puede usar la búsqueda, por ejemplo ...), y no requiere que mantienes una combinación de teclas incómoda durante mucho tiempo.

T. Verron
fuente