Come mappare il tasto Alt?


38

Sto cercando di mappare la Altchiave nel modo seguente:

:map <A-j> j
:map <A-k> k

ma non funziona (suona il campanello Alt + j/ Alt + k).

Cosa mi manca

Sto usando Terminal su OSX, lo stesso accade su Linux remoto.


Su Ctrl + v, Alt + jho: ?~H~F( quando encoding=utf-8).

Su Ctrl + v, Alt + kho: ?~Z( ˚quando encoding=utf-8).

L'esecuzione di vim senza plug-in ( -u NONE) non fa alcuna differenza.


1
Fa Alt(stampa, non attesa) e poi jil lavoro? Con xtermalmeno devo impostare metaSendsEscapeper true far funzionare queste sequenze ... Non so se hai lo stesso problema, e non uso OSX quindi non posso testare ...
Martin Tournoij

@Carpetsmoker Premere Alt, rilasciare, quindi jo qualsiasi altro tasto funziona normalmente. Ho controllato e trovato l'opzione 'Usa opzione come meta chiave' , l'ho abilitata e ora funziona. Quindi l'impostazione ha metaSendsEscapefatto il trucco, grazie.
Kenorb,

3
Questa domanda è stato precedentemente risposto (con una migliore risposta) qui: stackoverflow.com/questions/6778961/...
user3751385

Risposte:


36

È così che lo faccio su Linux o Cygwin:

Per prima cosa controlla quali caratteri vengono inviati dal tuo terminale quando premi ALT+ J:

Per fare ciò, vado alla console ed eseguo sed -n l(puoi anche usarlo cat). Quindi premo ALT+ Je vedo che i caratteri sullo schermo sono ^[j.

Sostituisco ^[con \e(perché è quello che viene inviato dal mio terminale quando premo esc) e la stringa finale per me è \ej.

Quindi lo scrivo al mio .vimrc:

execute "set <M-j>=\ej"
nnoremap <M-j> j

E la mappatura funziona.


4
Non riesco a trovare la documentazione per la :set <M-j>=\ejparte. Cosa dovrei cercare?
Evgeni Sergeev,

1
Grazie per la risposta, questa è stata l'unica soluzione che ha funzionato per me w / Iterm + vim
newUserNameHere

No, questo non funziona. A volte ESC-J fungerà da ALT-J
user3751385

1
@EvgeniSergeev See:help :set-termcap
Ricco

10

Con l'aiuto di Carpetsmoker , sembra che Terminal non sia configurato per 'Usa Alt / opzione come meta-chiave' (questo è particolarmente comune per i Terminali GUI).

Per Terminale su OSX, è in Preferenze -> Impostazioni -> scheda Tastiera -> 'Usa opzione come meta chiave' . Verifica: come posso cambiare Terminale per usare l'opzione come meta chiave? ( Mavericks ).

Per XTerm, controlla: Configurare XTerm su Default a Meta Sends Escape che dice:

Aggiungi questa riga ovunque nel tuo file .Xdefaults personale ( ~/.Xdefaults):

xterm*metaSendsEscape: true

Quindi ricaricare la configurazione con xrdb. Senza questo passaggio le modifiche in .Xdefaultsnon avranno effetto fino al successivo riavvio di X:

xrdb -l ~/.Xdefaults

Quindi mappature standard con Altchiave come:

:map <A-j> j
:map <A-k> k

funziona bene.

Per informazioni, vedere: :h :map-alt-keys.


4
Potrebbe anche voler considerare :h :map-alt-keysun'altra fonte di informazioni
Peter Rincker,

4

Simile alla risposta di Kossak ma un po 'più semplice, mappando le pressioni letterali dei tasti.

O in modalità normale dopo aver premuto :, o inserito nel tuo .vimrc, mappare l'input direttamente avviando la mappatura:

nnoremap 

quindi premere Ctrl+ Vquindi premere il tasto per registrare, ad es . Alt+ . Questo mostrerà qualcosa del genere:

nnoremap ^[[1;3D

ma ognuno ^[è un singolo carattere letterale di escape e l'evidenziazione della sintassi dovrebbe mostrarlo. Sostituisci la fuga o le lettere letterali con il testo <Esc>e aggiungi il comando che desideri utilizzare:

nnoremap <Esc>[1;3D <C-w>h

So che OP stava mappando Alt+ lettere, ma ho usato le frecce per mostrare come farlo per qualcosa che potrebbe non essere mappato per impostazione predefinita.


Ha funzionato come un fascino, grazie mille!
Aryndin,

2

Questo funziona per me sul terminale Ubuntu 16.04 xfce (e alacritty rust terminal)

Imposta il trigger dello snippet ultisnip su Meta-/(proprio come lo snippet di emacs)

let g:UltiSnipsExpandTrigger="^[/"

Qui ora ^[/scrivo vim

In modalità inserimento Ctrl-V Alt-/

( Metaè il Alttasto sulla tastiera del mio PC)


1

Se Control+Vseguito da ALT-xspettacoli ^[x(digita terminale) puoi risolverlo con questo piccolo script da vim.wikia.com :

for i in range(97,122)
  let c = nr2char(i)
  exec "map \e".c." <M-".c.">"
  exec "map! \e".c." <M-".c.">"
endfor

Aggiungi a .vimrc per tutte le mappature dei tasti alt.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.