58 votes

Les raccourcis de la touche Alt ne fonctionnent pas sur le terminal gnome avec Vim

J'utilise Vim sur un terminal gnome. Mais les mappages de la touche alt ne fonctionnent pas.
Par exemple (ce n'est qu'un exemple) :

:imap <A-i> <Esc>

Il fonctionne bien dans GVim. Mais lorsque j'exécute la même commande avec Vim dans le terminal gnome, cela ne fonctionne pas.
Donc je pense que le problème vient du terminal, non ?
Comment puis-je le réparer ?

Gracias

EDIT : J'ai installé Windows 7 sur la même machine, et avec le terminal Windows, cela fonctionne très bien aussi.

107voto

jpnp Points 612

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

8voto

ying17zi Points 312

Para Gnome-terminal utilisez plutôt ce qui suit :

imap ^[i <Esc>

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

Attention : Vous devez yank y put sur Vim lorsque vous voulez le copier ailleurs. Si vous copiez simplement le mappage dans un éditeur comme gedit la cartographie sera probablement rompue.

EDIT voici un exemple qui fait Alt-k ajoute une ligne vide au-dessus du curseur, et Alt-j ajoute une ligne vide après la ligne courante.

" 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 <silent><A-j> :set paste<CR>m`o<Esc>``:set nopaste<CR>
    nnoremap <silent><A-k> :set paste<CR>m`O<Esc>``:set nopaste<CR>
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 paste<CR>m`O<Esc>``:set nopaste<CR>
    nnoremap ^[j :set paste<CR>m`o<Esc>``:set nopaste<CR>
endif

2voto

sidyll Points 20176

Essayez

<m-i>

Ou, si vous tapez alti insère un caractère (comme dans mon cas, il insère un carret : ˆ ) ne font que correspondre à ce caractère :

:inoremap ˆ <esc>

Attention, car celle-ci ne fonctionnerait pas (du moins dans mon système, MacOS 10.6). La caret attend une lettre, parce que ce n'est pas exactement une caret, c'est un circonflexe .

2voto

aptx4869 Points 76

La même chose m'arrive. J'ai cherché sur Google avec "gnome terminal alt key", et j'ai trouvé que quelqu'un a posé 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 ne concerne que cette question)

Donc, peut-être que tu peux essayer ça :

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

2voto

Herbert Sitz Points 10657

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

Ou vous avez peut-être raison de dire qu'il s'agit d'un problème de terminal. Tous les terminaux ne prennent pas en charge toutes les combinaisons de touches. Votre problème est peut-être celui décrit dans la documentation d'aide de Vim à l'adresse suivante :h map-alt-keys . La documentation fournit une solution de contournement, mais elle n'est pas très bonne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X