Les raccourcis clavier ne fonctionnent pas sur le terminal gnome avec Vim

Je cours Vim sur un terminal gnome. Mais les mappages de touches alt ne fonctionnent pas.
Par exemple (ceci est juste un exemple):

:imap   

Cela fonctionne bien dans GVim. Mais lorsque je lance la même commande avec Vim dans le terminal gnome, cela ne fonctionne tout simplement pas.
Donc, je pense que le problème est avec le terminal, non?
Comment puis-je le réparer?

Merci

EDIT: Windows 7 est installé sur le même ordinateur et avec le terminal Windows, ça marche aussi.

Le problème

Il existe deux manières pour un émulateur de terminal d’envoyer une touche Alt (généralement appelée clé Meta, car les terminaux n’ont pas de touche Alt). Il peut soit envoyer des caractères 8 bits et définir le bit haut lorsque Alt est utilisé, soit utiliser des séquences d’échappement, envoyant Alt-a comme a . Vim s’attend à voir le codage à 8 bits plutôt que la séquence d’échappement.

Certains émulateurs de terminaux tels que xterm peuvent être configurés pour utiliser l’un ou l’autre mode, mais le terminal Gnome n’offre pas ce type de paramètre. Pour être honnête ces jours-ci de l’édition Unicode, l’encodage 8 bits n’est pas une si bonne idée. Mais les séquences d’échappement ne sont pas sans problème non plus; ils n’offrent aucun moyen de distinguer j signifiant Alt-j contre une pression sur Esc suivi de j .

Dans une utilisation antérieure du terminal, taper Echap était un autre moyen d’envoyer un méta sur un clavier sans clé Meta , mais cela ne correspond pas bien à l’utilisation de Esc pour quitter le mode insertion .

La solution

Il est possible de contourner ce problème en configurant vim pour mapper les séquences d’échappement sur leurs combinaisons Alt.

Ajoutez ceci à votre .vimrc:

 let c='a' while c <= 'z' exec "set =\e".c exec "imap \e".c." " let c = nr2char(1+char2nr(c)) endw set timeout ttimeoutlen=50 

Alt-letter sera maintenant reconnu par vi dans un terminal ainsi que par gvim. Les parameters de timeout sont utilisés pour contourner l’ambiguïté avec les séquences d’échappement. Esc et j envoyés dans les 50ms seront mappés sur , plus de 50ms compteront comme des clés séparées. Cela devrait être assez de temps pour faire la distinction entre le codage Meta et la frappe de deux touches.

Si vous n’aimez pas avoir la temporisation définie, qui ttimeout pour d’autres séquences de touches mappées (après une seconde par défaut), vous pouvez utiliser ttimeout place. ttimeout s’applique uniquement aux codes clés et non aux autres mappages.

 set ttimeout ttimeoutlen=50 

Pour Gnome-terminal , utilisez plutôt ce qui suit:

 imap ^[i  

^[i devrais être tapé en appuyant sur Ctrl-v Alt-i

Attention : Vous devez yank et put Vim quand vous voulez le copier ailleurs. Si vous copiez simplement le mappage dans un éditeur comme gedit , le mappage sera probablement rompu.

EDIT est un exemple qui fait que Alt-k ajoute une ligne vide au-dessus du curseur et Alt-j ajoute une ligne vide après la ligne en cours.

 " Alt-j/k to add a blank line if has('gui_running') " the following two lines do not work in vim, but work in Gvim nnoremap  :set pastem`o``:set nopaste nnoremap  :set pastem`O``:set nopaste else " these two work in vim " shrtcut with alt key: press Ctrl-v then Alt-k " ATTENTION: the following two lines should not be " edited under other editors like gedit. ^[k and ^[j will be broken! nnoremap ^[k :set pastem`O``:set nopaste nnoremap ^[j :set pastem`o``:set nopaste endif 

Essayer

  

Ou, si vous tapez alt i, vous insérez un caractère (comme dans mon cas, il insère un carret: ˆ mappez simplement ce caractère:

 :inoremap ˆ  

Attention, celui-ci ne fonctionnerait pas (du moins dans mon système, MacOS 10.6). Le caret attend une lettre, car ce n’est pas exactement un caret, c’est un circonflexe .

La même chose m’arrive. J’ai cherché sur Google avec “gnome terminal alt key”, et j’ai constaté que quelqu’un posait presque la même question: ” Comment désactiver le comportement Alt-Hotkey sur le terminal gnome? ” Dans le premier lien trouvé. (Le deuxième lien est juste cette question)

Alors, peut-être que vous pouvez essayer cela:

 Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys" 

Il se peut que les raccourcis proviennent en réalité du bureau Gnome. Essayez de consulter l’outil Raccourcis clavier Gnome (menu Système, Préférences, Raccourcis clavier), qui vous permet d’afficher et de modifier les raccourcis définis sur Gnome Desktop. Si la combinaison de touches est affectée à une fonction sur Gnome Desktop, supprimez-la, puis cette combinaison de touches doit filtrer correctement vers Vim.

Ou vous avez peut-être raison de dire que c’est un problème du terminal. Tous les terminaux ne prennent pas en charge toutes les combinaisons de touches. Votre problème peut être celui décrit dans les documents d’aide de Vim à l’adresse :h map-alt-keys . Les documents fournissent une solution de contournement, mais pas une très bonne.

Jetez un coup d’œil à la section 1.10 de http://vimdoc.sourceforge.net/htmldoc/map.html . Il semble indiquer que gnome-terminal échappe automatiquement au modificateur Alt, de sorte qu’il ne bascule pas l’octet envoyé de la manière attendue par Vim. Le document semble indiquer qu’il n’y a pas vraiment moyen de contourner cela, sauf pour utiliser un terminal différent (tel que xterm).

Ceci est certainement frustrant car, pour autant que je sache, les machines Linux sont également incapables d’utiliser les liaisons D (Mac’s Command ou Linux’s Super), du moins en ce qui concerne le terminal, nous sums limités aux modificateurs Shift et Ctrl, frustrant si nous voulons nous assurer que nous pouvons utiliser toutes les commandes que nous utilisons dans Gvim sur le terminal Vim (du moins sans changer de terminal, vers lequel je suis peut-être trop têtu – gnome-terminal est tellement plus joli). J’ai cherché un moyen de contourner cela, mais je n’ai rien trouvé.