Le problème
Il y a deux façons pour un émulateur de terminal d'envoyer un message de type Alt (généralement appelée touche Meta car les terminaux actuels n'avaient pas de touche Alt). Elle peut soit envoyer des caractères 8 bits et activer le bit de poids fort lorsque la touche Alt est utilisée, soit utiliser des séquences d'échappement en envoyant Alt-a como <Esc>a
. Vim s'attend à voir le codage 8 bits plutôt que la séquence d'échappement.
Certains émulateurs de terminal tels que xterm peut être réglé pour utiliser l'un ou l'autre mode, mais Terminal Gnome n'offre pas un tel paramètre. Pour être honnête, à l'heure de l'édition Unicode, l'encodage 8 bits n'est de toute façon pas une si bonne idée. Mais les séquences d'échappement ne sont pas exemptes de problèmes non plus ; elles ne permettent pas de distinguer entre <Esc>j
signification Alt-j vs pressage Esc suivi par j .
Dans l'utilisation antérieure du terminal, la saisie de Escj était un autre moyen d'envoyer un Meta sur un clavier sans un Meta mais cela ne correspond pas à l'utilisation par vi de la touche Esc pour quitter insérer mode.
La solution
Il est possible de contourner ce problème en configurant vim de manière à ce que les séquences d'échappement correspondent à leurs combinaisons Alt.
Ajoutez ceci à votre .vimrc :
let c='a'
while c <= 'z'
exec "set <A-".c.">=\e".c
exec "imap \e".c." <A-".c.">"
let c = nr2char(1+char2nr(c))
endw
set timeout ttimeoutlen=50
La lettre Alt sera maintenant reconnue par vi dans un terminal ainsi que par gvim. Le site timeout
sont utilisés pour contourner l'ambiguïté des séquences d'échappement. Esc y j envoyés dans un délai de 50 ms seront mis en correspondance avec <A-j>
supérieures à 50 ms seront considérées comme des touches distinctes. Cela devrait être suffisant pour faire la distinction entre le codage Meta et la frappe de deux touches.
Si vous n'aimez pas avoir le paramètre timout, qui interrompt les autres séquences de touches mappées (après une seconde par défaut), vous pouvez alors utiliser ttimeout
Au lieu de cela, ttimeout s'applique uniquement aux codes clés et non aux autres mappings.
set ttimeout ttimeoutlen=50