web-dev-qa-db-fra.com

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

J'exécute Vim sur un terminal gnome. Mais les mappages de touches alt ne fonctionnent pas.
Par exemple (ce n'est qu'un exemple):

:imap <A-i> <Esc>

Cela fonctionne très bien dans GVim. Mais lorsque j'exécute la même commande avec Vim dans le terminal gnome, cela ne fonctionne tout simplement pas.
Je pense donc que le problème est avec le terminal, non?
Comment puis-je le réparer?

Merci

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

49
Jesse

Le problème

Il existe deux façons pour un émulateur de terminal d'envoyer un Alt (généralement appelée clé Meta car les terminaux réels n'avaient pas 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, en envoyant Alt-a comme <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 peuvent être configurés pour utiliser l'un ou l'autre mode, mais terminal Gnome n'offre pas un tel paramètre. Pour être honnête de nos jours avec l'édition Unicode, l'encodage 8 bits n'est de toute façon pas une bonne idée. Mais les séquences d'échappement ne sont pas non plus sans problème; ils n'offrent aucun moyen de distinguer entre <Esc>j sens Alt-j vs pressage Esc suivi par j.

Dans une utilisation antérieure du terminal, en tapant Escj était une autre façon d'envoyer un Meta sur un clavier sans Meta , mais cela ne correspond pas bien à l'utilisation de vi par Esc pour quitter le mode insérer.

La solution

Il est possible de contourner cela en configurant vim pour mapper les séquences d'échappement à 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

Alt-letter sera désormais reconnu par vi dans un terminal ainsi que par gvim. Les paramètres timeout sont utilisés pour contourner l'ambiguïté avec les séquences d'échappement. Esc et j envoyé dans les 50 ms sera mappé sur <A-j>, supérieur à 50 ms comptera comme clés distinctes. Cela devrait être assez de temps pour faire la distinction entre l'encodage Meta et frapper deux touches.

Si vous n'aimez pas avoir un délai d'expiration défini, qui expire pour les autres séquences de touches mappées (après une seconde par défaut), vous pouvez utiliser ttimeout à la place. ttimeout s'applique uniquement aux codes clés et non aux autres mappages.

set ttimeout ttimeoutlen=50
86
jpnp

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

imap ^[i <Esc>

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

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

MODIFIER voici un exemple qui fait Alt-k ajoutez 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
6
ying17zi

La même chose m'arrive. J'ai recherché sur Google avec "gnome terminal alt key", et j'ai trouvé que quelqu'un posait presque la même question: " Comment désactiver le comportement alt-hotkey sur gnome terminal? " dans le premier lien trouvé. (Le deuxième lien est juste cette question)

Alors, vous pouvez peut-être essayer ça:

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

Essayer

<m-i>

Ou, si vous tapez alti insère un caractère (comme dans mon cas, il insère un carret: ˆ) associez simplement ce caractère:

:inoremap ˆ <esc>

Soyez prudent, car celui-ci ne fonctionnerait pas (au moins dans mon système, MacOS 10.6). Le curseur attend une lettre, car ce n'est pas exactement un curseur, c'est un circonflexe .

2
sidyll

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

C'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), donc au moins en ce qui concerne le terminal, nous sommes limités aux modificateurs Shift et Ctrl, ce qui est frustrant si nous voulons nous assurer que nous pouvons utiliser toutes les commandes que nous utilisons dans Gvim sur le terminal Vim (au 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é.

1
metasoarous

Il se peut que les raccourcis proviennent en fait du bureau Gnome. Essayez de regarder 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 devrait filtrer correctement vers Vim.

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

1
Herbert Sitz