Shift + Up n'est pas reconnu par Emacs dans un terminal

15

Très souvent, j'utilise Shift+ Up/Downpour sélectionner une région dans Emacs. Cela fonctionne très bien en mode GUI, mais quand emacsest invoqué avec l' -nwoption, je ne peux sélectionner les lignes qu'avec Shift+ Down. Le Shift+ Upne fonctionne pas, je reçois ce message d'erreur dans le mini-tampon:

<select> is undefined

Comment puis-je résoudre ce problème?

WeSenseASoulInSearchOfAnswers
la source

Réponses:

13

Un terminal texte ne transmet que des caractères (plus précisément, des octets), pas des clés. Les clés et les accords (clés avec modificateurs) sont codés sous forme de séquences de caractères. Les clés qui insèrent des caractères imprimables sont envoyées comme elles-mêmes; les touches de fonction sont envoyées sous forme de séquences d'échappement. La plupart des séquences d'échappement se composent du caractère Escape ( ?\edans la syntaxe Emacs) suivi de deux caractères imprimables ou plus. Voir les touches Contrôle et haut / bas dans le terminal pour une utilisation par emacs et Comment fonctionnent la saisie au clavier et la sortie du texte? pour plus d'informations.

Emacs dispose d'un mécanisme pour traduire les séquences d'échappement en sa propre notion de clés. La table de traduction input-decode-mapest initialisée au démarrage d'Emacs (ou plus précisément, lorsqu'une nouvelle trame est ouverte: cette variable a une valeur différente sur chaque terminal). Parfois, Emacs ne connaît pas toutes les séquences d'échappement envoyées par le terminal.

Dans votre cas, il semble qu'Emacs ait une mauvaise interprétation de la séquence d'échappement envoyée par Shift+ Up. Vous devez lui dire de l'interpréter S-upplutôt que select. Tout d'abord, déterminez quelle est la séquence d'échappement. Dans le *scratch*tampon, appuyez sur Ctrl+ Qpuis Shift+ Up. La commande C-qprovoque l'insertion littérale du caractère suivant, qui est le caractère d'échappement, suivi du reste de la séquence d'échappement. Disons que Shift+ Upenvoie \e[1;2Asur notre système, alors vous devrez redéfinir l'entrée correspondante dans input-mode-map:

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

En principe, input-decode-mapdoit être défini par terminal. En pratique, il est très rare d'avoir deux terminaux dans lesquels la même séquence d'échappement encode des clés différentes, donc un paramètre global fonctionnera correctement.

Gilles 'SO- arrête d'être méchant'
la source
Votre réponse semble répondre à ma question ici - emacs.stackexchange.com/questions/33988 . Are the (define-key ...)commandes censées entrer dans init.el? Y a-t-il un exemple détaillé quelque part que je peux regarder?
vfclists
Les define-keycommandes @vfclists vont dans votre fichier init. Cela peut être ~/.emacs.d/init.elou quelques autres emplacements. Vous trouverez de nombreux exemples d'utilisations de define-keyen recherchant define-key, mais trouver la carte à lier est une autre affaire. Plusieurs cartes sont impliqués: global-map, input-decode-map, function-key-map, keyboard-translate-map. Je ne sais pas comment répondre à votre question car je ne connais pas Spacemacs. Je ne recommande pas l'utilisation de packages tels que Spacemacs qui redéfinissent malencontreusement les interfaces standard.
Gilles 'SO- arrête d'être méchant'
Je suis passé à emacs régulier pour apprendre le mode org et j'ai réussi à travailler input-decode-mapaprès avoir trouvé quelques exemples. Puis-je prendre celui qui input-decode-maps'applique lorsque l'utilisateur entre du texte dans un tampon?
vfclists
@vfclists input-decode-mapest l'un des keymaps qui s'appliquent. Voir le manuel pour plus de détails.
Gilles 'SO- arrête d'être méchant'
5

Dans emacs, la région est délimitée par le point (curseur) et la marque (une position précédente du curseur, qui a été "marquée").

Ainsi, pour "sélectionner une région", vous devez placer cette marque, puis déplacer votre point.

Le moyen le plus simple de placer la marque est d'appuyer sur C-SPC. Ensuite, déplacez simplement le curseur, vous verrez la "région" s'étendre au fur et à mesure.

Pour "désélectionner la région", vous pouvez appuyer à C-SPCnouveau sur.

Étant donné que «Maj + mouvement» est une liaison de touches commune dans d'autres logiciels, par défaut, il émule ce comportement de «sélection de région». Cependant, cela ne fonctionne pas dans le terminal, car shift ne peut pas être envoyé à emacs comme touche de modification.

Notez que généralement, la C-SPCméthode est beaucoup plus puissante que les autres méthodes pour sélectionner une région: vous n'êtes pas limité à haut / bas / gauche / droite pour le mouvement (vous pouvez utiliser la recherche par exemple ...), et elle ne nécessite pas que vous maintenez une combinaison de touches inconfortable pendant longtemps.

T. Verron
la source