Raccourcis clavier Alt ne fonctionne 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>

ça marche très bien à GVim. Mais quand j'exécute la même commande avec Vim dans le terminal gnome, ça ne marche pas.

donc je pense que le problème est avec le terminal, non?

Comment puis-je le réparer?

Merci

EDIT: j'ai Windows 7 est installé sur la même machine, et avec terminal server de Windows, il fonctionne très bien aussi.

42
demandé sur Jesse 2011-07-21 19:51:41

6 réponses

le problème

il y a deux façons pour un émulateur de terminal d'envoyer une clé Alt (habituellement appelée une clé Meta car les terminaux actuels n'avaient pas D'Alt). Il peut soit envoyer des caractères de 8 bits et régler le High bit quand Alt est utilisé, ou il peut utiliser des séquences d'évasion, en envoyant Alt-A comme <Esc>a . Vim s'attend à voir l'encodage 8 bits plutôt que la séquence d'échappement.

certains terminaux les émulateurs tels que xterm peuvent être configurés pour utiliser l'un ou l'autre mode, mais terminal Gnome n'offre pas un tel réglage. Pour être honnête en ces jours D'édition Unicode, l'encodage 8-bit n'est pas une si bonne idée de toute façon. Mais les séquences d'échappement ne sont pas sans problème non plus; elles n'offrent aucun moyen de distinguer entre <Esc>j qui signifie Alt-j vs pressage Esc suivi de j .

dans une utilisation antérieure du terminal, taper Esc j était une autre façon d'envoyer une méta sur un clavier sans une touche Meta , mais cela ne correspond pas bien avec l'utilisation de l'Esc par vi pour quitter le mode insert .

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 réglages timeout sont utilisés pour contourner l'ambiguïté des séquences d'échappement. Esc et j envoyé dans les 50ms sera associé à <A-j> , plus de 50ms comptent comme des clés séparées. Cela devrait être assez de temps pour distinguer entre le Méta-encodage et frapper deux touches.

si vous n'aimez pas que timout soit paramétré, ce qui correspond à d'autres séquences de clés mappées (après une seconde par défaut), vous pouvez utiliser ttimeout à la place. ttimeout ne s'applique qu'aux codes clés et non aux autres correspondances.

set ttimeout ttimeoutlen=50
79
répondu jpnp 2015-06-24 23:33:02

pour Gnome-terminal , utilisez plutôt:

imap ^[i <Esc>

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

Attention : vous avez besoin de yank et put dans Vim quand vous voulez le copier ailleurs. Si vous copiez simplement le mapping dans un éditeur comme gedit , le mapping sera probablement cassé.

EDIT ici est un exemple qui fait Alt-k ajouter une ligne vide au-dessus du curseur, et Alt-j ajouter 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
répondu ying17zi 2013-07-16 09:04:04

Essayer

<m-i>

Ou, si vous saisissez alt je insère un caractère (comme dans mon cas, il insère un carret: ˆ ) de la carte à un personnage:

:inoremap ˆ <esc>

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

2
répondu sidyll 2011-07-21 16:00:14

il m'arrive la même chose. 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 second lien est juste cette question)

donc, peut-être que vous pouvez essayer que:

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"
2
répondu aptx4869 2017-04-13 12:22:45

il se peut que les raccourcis viennent en fait du bureau Gnome. Essayez de regarder L'outil de raccourcis clavier Gnome (menu Système, Préférences, raccourcis clavier), qui vous permet de visualiser et de modifier les raccourcis définis sur le bureau Gnome. Si la combinaison de touches est assignée à une fonction sur le Bureau de Gnome, puis l'enlever et que la combinaison de touches devrait filtrer vers le bas à Vim correctement.

ou vous pouvez avoir raison que c'est un problème du terminal. Pas tous les terminaux soutenez tous les combos clés. Votre problème peut être celui décrit dans les vim help docs à :h map-alt-keys . Les docs fournissent une solution, mais pas très bonne.

1
répondu Herbert Sitz 2011-07-21 18:07:34

consultez 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 commute pas le byte envoyé de la manière que Vim attend. Le document semble indiquer qu'il n'y a pas vraiment d'autre solution que d'utiliser un autre terminal (tel que xterm).

c'est certainement frustrant car autant que je peux dire Linux les machines sont également incapables d'utiliser les fixations D (commande Mac ou Super Linux), 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 terminal Vim (au moins sans changer de terminal, vers lequel je suis peut - être trop entêté-gnome-terminal est tellement plus joli). J'ai cherché un moyen de contourner ça, mais j'ai été incapable de trouver quoi que ce soit.

1
répondu metasoarous 2012-01-23 02:50:22