Posso mappare il tasto Alt in Vim?


90

Ho provato a mappare come aggiungendo la riga sottostante a .vimrc, ma non funziona. Ho controllato che il .vimrc sia caricato da Vim.

map <Alt-D> <C-D>

c'è qualche errore in questa mappatura?


Stai usando vim in un terminale o una versione gui (gvim, macvim)?
Nick Knowlson

Tieni inoltre presente che se le encodingmodifiche apportate dopo l'esecuzione della mappatura, ciò che ottieni dai tasti Alt potrebbe non corrispondere a ciò che hai impostato inizialmente.
dash-tom-bang

Risposte:


136

Per gli utenti Mac là fuori: per la mappatura ALT + hjkl, usa invece il carattere reale generato (scopri quale carattere usando la combinazione mentre sono in modalità INSERT), ad esempio con la mia tastiera ottengo:

<ALT+j> ==> ª
<ALT+k> ==> º

e così via. Soluzione trovata qui su StackOverflow.

L'ho usato per spostare le linee su e giù con ALT + k \ j, usando questo sul mio .vimrc:

nnoremap ª :m .+1<CR>==
nnoremap º :m .-2<CR>==

inoremap ª <Esc>:m .+1<CR>==gi
inoremap º <Esc>:m .-2<CR>==gi

vnoremap ª :m '>+1<CR>gv=gv
vnoremap º :m '<-2<CR>gv=gv

come spiegato qui .

Spero sia utile, divertiti con Vim :)

ADDENDUM DI Dylan_Larkin (2019): Perché funzioni su un Mac, " Usa opzione come metatasto " deve essere disattivato in Terminale-> Preferenze-> Tastiera


10
Questo è proprio quello per cui sono venuto qui (Alt + HJKL per spostare le divisioni)! Grazie!
Jamie Schembri

6
Un modo semplice per scoprire di che carattere si tratta è usare cat. Digita semplicemente cate all'interno della finestra del gatto la combinazione di tasti che desideri. Ho scoperto che alt + parentesi è 'e "sul mio Mac.
dvcrn

4
funziona benissimo come Alt + HJKL per spostarsi tra le spaccate, le mie dita lo adorano !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales

3
Queste mappature esatte potrebbero non funzionare come previsto nelle versioni future di OSX. Utilizzare sed -n lper vedere l'output di <Ak> e <Aj> prima di configurare la mappatura. Nel mio caso <Aj> è e <Ak> è˚
luk3thomas

4
Su macOS, quando si imposta Use Option as Meta Keyo sul profilo iTerm ⌥ key to Esc+si comporterà come tradizionalmente (come su Linux / Unix). Quindi non è necessario impostare su Vim la mappa <^[j>, ma mapparla semplicemente su <A+j>o <M+j>e funziona.
goetzc

40

:help key-notationdescrive quale formato deve essere utilizzato per mappare chiavi diverse. Nel caso di alt, puoi usare o <A-o <M-. Quindi la tua mappatura sarebbe

map <M-d> <C-d>

Suggerirei anche di utilizzare la norevariante di :map(ad esempio noremap) a meno che non si desideri esplicitamente consentire la rivalutazione del lato destro per le mappature.


1
Questo ancora non ha alcun effetto. L'input Alt + D introduce ancora qualche strano carattere a Vim.
Thomson

9
Questa è una questione separata. Il tuo terminale sta inviando un carattere multibyte a Vim e Vim non sa interpretarlo come <A-d>. Probabilmente devi modificare le impostazioni del tuo terminale in modo che invii <A-d>come <Esc>d.
jamessan

1
@jamessan come si fa su iterm2?
Finn

33

Non sono sicuro che sia più "possibile". Si prega di leggere l'aggiornamento di seguito.

Sì, puoi anche in terminal vim, ma non c'è una vera risposta a tutti . Fondamentalmente devi seguire due passaggi:

  1. Assicurati che la <M-d>notazione esista e mappa esattamente ciò che il tuo terminale immette ( ^[è il carattere di escape):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Associa qualcosa alla tua nuova combinazione "creata":

    noremap <M-d> :echo "m-d works!"<cr>
    

Capendo come funziona, puoi espandere questo "trucco" ad altre combinazioni "strane", per esempio, sto usando la termite e vim non riconosce <S-F1>, usando il gatto che ottengo ^[[1;2P. Quindi, nel mio vimrc faccio:, execute "set <S-F1>=\e[1;2P"e quindi posso mapparlo su qualsiasi cosa.

Nota: non so perché, ma per alcune persone che usano \<Esc>works invece di \e.


Aggiornamento (febbraio 2016)

A seconda del terminale su cui gira il tuo terminale, forse potresti ... nella maggior parte dei terminali, "alt + h", per esempio, è mappato ^[h, che è: "escape + h". Quindi potrebbe sovrascrivere le chiavi. Ho appena provato (di nuovo) e sembra funzionare, ma credo che sia un'implementazione molto buggata e soggetta a errori.

Tuttavia, per i più coraggiosi, ecco un plugin sperimentale:


Invece delle execute "set...cose, puoi semplicemente usare direttamente set <M-d>=^[d. In ^[realtà è un carattere di escape immesso con C-v-Esc. Questo era necessario in rxvt / urxvt, ma xterm non dovrebbe aver bisogno del trattamento speciale. Maggiori informazioni su questo argomento nel wiki di vim .
Micah Elliott

Esiste un approccio analogo a questo che funzionerebbe con tmux in modo che, ad esempio, Md possa essere associato?
George,

2
Per me, <Esc>allora dora fa la stessa cosa di <Alt>+ d. Inoltre, puoi farlo semplicemente in una riga con Ctrl-v, <Esc>come qui .
Sparhawk

24

Tasto Alt mappa in Vim su Mac OSx:

Inizia visualizzando il codice chiave che il tuo terminale sta inviando a vim:

$ sed -n l
^[[1;9D 

Nell'esempio sopra, ho eseguito il comando e ho premuto Alt + Left.

La ^[[1;9Dè la sequenza sfuggito di essere inviato a vim, in modo che possiamo utente che per la nostra mappatura.

map <Esc>[1;9D 

3
Se stai usando l'app iTerm2, è bene controllare come sono mappate le chiavi in ​​Profilo> Chiavi.
fikovnik

1
Con il Optiontasto sinistro ( ) configurato come Esc+in iTerm2, potrei mappare alt+qper uscire da vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus

Puoi anche configurare iTerm2 per lavorare con quella rimappatura se vai in Preferenze> Profili, seleziona il tuo profilo corrente, vai alla scheda "chiavi" per quel profilo e cambia l'opzione che dice "Tasto sinistro Left" in "Esc +" (disponibile le opzioni sono "Normale", "Meta" e "Esc +").
Giovanni Benussi

12

Uso:

map <A-D> <C-D>

Vedi :help key-notation.


1
Sembra che ancora non funzioni. Alt + d introdurrà un carattere strano a Vim, che è lo stesso con il caso unmap.
Thomson

Funziona per me (lo sto usando gvimsu Windows)
Deqing

8

Il tuo terminale potrebbe non trasmettere "correttamente" l'Alt-D. Puoi usare CV per ottenere effettivamente la sequenza di escape effettiva inviata a Vim e usarla per creare la tua mappatura. Cioè, modifica il tuo .vimrc e sostituisci il reale digitando la seguente sequenza "CV Alt-D" così avrai la corretta sequenza di escape nel tuo vimrc. Non funzionerà se il tuo terminale non invia nulla a vim.


8

Il mio terminale produrrebbe ^[xcomandi (ad esempio per alt-x). Ciò che lo ha fatto funzionare all'interno di Vim è stato 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 correggere tutte le mappature dei tasti alt.


1

in seguito alla risposta di Bruno per gli utenti Mac, prova ad assicurarti che la tua chiave di opzione sia mappata su Esc+.

Questo ti darà il comportamento "normale" del Atasto option ( ) in Vim.

Ad esempio, in iterm2, questa opzione può essere trovata sotto Preferences > Profiles > Keys:

Screenshot delle preferenze di iterm2


Ho anche dovuto modificare la configurazione in nnoremap <Esc>j :m .+1<CR>==e simili ...
mihaipopescu

0

Ciao dopo nessuna buona soluzione dopo anni di test di tutto quanto sopra su Mac, ho continuato a cercare.

Ecco la mia soluzione:

Per creare una combinazione di tasti che includa Alt devi dichiarare la combinazione nelle preferenze> tastiera e usare quella combinazione nel file di installazione di vim (controlla l'opzione usa come meta tasto).

L'output deve essere un carattere insolito (no aad esempio) in modo da non sovrascrivere un carattere normale.

Nell'esempio seguente dovresti essere in grado di vimare abbastanza con ALT-Up.

impostazione vim: impostazione vim

impostazione mac: impostazione mac

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.