Tout d'abord, un peu d'histoire. Autrefois, lorsque vous tapiez du texte sur un terminal , chaque touche envoyait un caractère à l'application. Au fur et à mesure que les machines auxquelles le terminal était connecté devenaient plus puissantes, les terminaux standardisaient sur une touche de commande , qui envoyaient des caractères spéciaux, qui n'étaient pas imprimés mais avaient une sorte de fonction. Le jeu de caractères finalement triomphant était ASCII , avec 128 caractères dont 32 sont des caractères de contrôle. Appuyer Ctrlavec une lettre ou un autre symbole écrit 10xxxxx₂ (notation binaire) envoie le caractère de contrôle dont le code est 00xxxxx₂, par exemple Ctrl+ [envoie le numéro de caractère 27₁₀ = 0011011₂ parce que [
91₁₀ = 1011011₂.
Quelques touches de fonction sur les terminaux ont envoyé des caractères de contrôle:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = onglet horizontal)
- Linefeed=
Ctrl-J
(LF = Line Feed) (peu de terminaux ont jamais eu cette clé)
- Returnou Enter=
Ctrl-M
(CR = retour chariot)
- Escape=
Ctrl-[
(ESC = échapper)
Lorsque les terminaux avaient plus de touches de fonction, il n'y avait pas assez de caractères de contrôle pour les représenter tous. Donc , ils ont envoyé des séquences de caractère, et la convention universelle est que ces séquences de caractères commencent par le caractère d'échappement, Ctrl-[
.
Au fil du temps, les terminaux matériels sont devenus de plus en plus rares; de nos jours, il existe de nombreux niveaux de traduction entre le clavier et l'application . La limitation du nombre de caractères disponibles et les correspondances codées en dur entre certaines combinaisons de touches et certains caractères de contrôle ne sont plus pertinentes. Cependant, les applications sont restées compatibles avec les terminaux existants et les terminaux sont restés compatibles avec les applications existantes, ce qui a rendu difficile tout changement.
Ainsi, même aujourd'hui, sur les systèmes de type Unix, les applications s'exécutant dans un émulateur de terminal reçoivent le caractère Ctrl-I
lorsque l'utilisateur appuie sur la Tabtouche, le caractère Ctrl-[
lorsque l'utilisateur appuie sur Esc, etc. Si Vim s'exécute sur un terminal Unix, il ne peut pas distinguer entre <Esc>
et <Ctrl-[>
parce que le terminal envoie les mêmes informations.
Vim fonctionnant dans d'autres environnements n'a pas cette limitation, donc en principe il leur serait possible d'envoyer des informations différentes. Étant donné que Vim utilise le Ctrl-[
personnage pour représenter <Esc>
dans de nombreux endroits, changer cela serait impossible; au lieu de cela Ctrl+ [pourrait être fait pour envoyer un événement d'entrée différent.
Je ne connais aucune version de Vim elle-même qui différencie entre Escet Ctrl+ [(mais ce n'est pas comme si j'en avais jamais utilisé). Gvim, pour sa part, semble émuler un terminal de variétés de jardin .
Ironiquement, votre meilleur pari peut être Vim fonctionnant dans un émulateur de terminal. Certains émulateurs de terminal vous permettent de personnaliser les séquences d'échappement envoyées par les clés et les clés. Ainsi, vous pourriez organiser pour Ctrl+ [d'envoyer non pas le caractère ␛ ( Ctrl-[
), mais une séquence d'échappement. Xterm, l'émulateur de terminal «de référence» pour les systèmes de type Unix, prend en charge deux de ces schémas. Par exemple:
- Escenvoie
␛
et Tabenvoie ␉
, dans toutes les configurations.
- Avec
?.VT100.modifyOtherKeys: 0
(par défaut) ou ?.VT100.modifyOtherKeys: 1
, Ctrl+ [envoie ␛
et Ctrl+ Ienvoie ␉
. ?.VT100.modifyOtherKeys: 1
affecte uniquement les méta-combinaisons et les combinaisons de contrôles qui n'ont pas de caractère ASCII.
- Avec
?.VT100.modifyOtherKeys: 2
et ?.VT100.formatOtherKeys: 0
(par défaut), Ctrl+ [envoie ␛[27;5;91~
et Ctrl+ Ienvoie ␛[27;5;105~
.
- Avec
?.VT100.modifyOtherKeys: 2
et ?.VT100.formatOtherKeys: 1
, Ctrl+ [envoie ␛[91;5u
et Ctrl+ Ienvoie ␛[105;5u
.
La prise en charge peut être activée en définissant la modifyOtherKeys
ressource lors du démarrage de xterm (et formatOtherKeys
pour sélectionner entre les deux schémas), ou elle peut être activée et désactivée dynamiquement par l'application.
Vim n'a pas de support intégré à ma connaissance. Vous pouvez écrire vos propres liaisons pour ces séquences d'échappement. Il peut être possible d'obtenir Vim pour mettre automatiquement le terminal en modifyOtherKeys
mode en lui fournissant une définition de terminal modifiée, mais cela dépasse le cadre de cette réponse.
Neovim a un support intégré pour l'une des variantes . Pour autant que je sache, il n'active pas le support si le terminal le prend en charge, c'est à l'utilisateur de le faire.
¹ De plus en plus et le plus souvent de nos jours, Backspaceenvoie le caractère 127.
Esc
ouC-[
, vous n'avez donc pas de chance, mais vous pouvez peut-être faire quelque chose avec une version GUI de Vim ou en reconfigurant votre terminal.