Czy mogę zmapować klawisz Alt w Vimie?


90

Próbowałem zmapować jako dodanie poniższej linii do .vimrc, ale to nie działa. Sprawdziłem, czy .vimrc jest ładowany przez Vima.

map <Alt-D> <C-D>

czy jest jakiś błąd w tym mapowaniu?


Używasz Vima w terminalu, czy w wersji GUI (gvim, macvim)?
Nick Knowlson

Pamiętaj również, że jeśli encodingzmiany po uruchomieniu mapowania zostaną uruchomione, to, co uzyskasz z klawiszy Alt, może nie być zgodne z początkowo ustawionymi.
dash-tom-bang

Odpowiedzi:


136

Dla użytkowników komputerów Mac: do mapowania ALT + hjkl użyj zamiast tego prawdziwego wygenerowanego znaku (dowiedz się, który znak używając kombinacji w trybie INSERT), na przykład z moją klawiaturą otrzymuję:

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

i tak dalej. Rozwiązanie znalezione tutaj w StackOverflow.

Użyłem tego do przesuwania linii w górę iw dół za pomocą ALT + k \ j, używając tego na moim .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

jak wyjaśniono tutaj .

Mam nadzieję, że to przydatne, ciesz się Vimem :)

DODATEK DYLAN_LARKIN (2019): Aby to działało na Macu, należy wyłączyć opcjęUżyj opcji jako klucza meta ” w Terminal-> Preferencje-> Klawiatura


10
Właśnie po to tu przyszedłem (Alt + HJKL, aby przesunąć podziały)! Dzięki!
Jamie Schembri

6
Łatwym sposobem sprawdzenia, która to postać, jest użycie cat. Po prostu wpisz catw oknie kota żądaną kombinację klawiszy. Okazało się, że alt + nawiasy to „i” na moim Macu.
dvcrn

4
działa świetnie, jak Alt + HJKL, aby poruszać się między podziałami, moje palce to uwielbiają !! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales,

3
Te dokładne mapowania mogą nie działać zgodnie z oczekiwaniami w przyszłych wersjach OSX. Użyj, sed -n laby zobaczyć dane wyjściowe <Ak> i <Aj> przed skonfigurowaniem mapowania. W moim przypadku <Aj> jest, a <Ak> jest˚
luk3thomas

4
W systemie MacOS podczas ustawiania Use Option as Meta Keylub w profilu iTerm ⌥ key to Esc+będzie zachowywać się w tradycyjny sposób (jak w systemie Linux / Unix). Więc nie musisz ustawiać w Vimie mapy <^[j>, po prostu zamapuj ją na <A+j>lub <M+j>i działa.
goetzc

40

:help key-notationopisuje, jakiego formatu należy użyć do odwzorowania różnych kluczy. W przypadku alt możesz użyć albo <A-lub <M-. Więc twoje mapowanie będzie

map <M-d> <C-d>

Polecam również użycie norewariantu :map(np. noremap), Chyba że wyraźnie chcesz zezwolić na ponowne oszacowanie prawej strony pod kątem mapowań.


1
To nadal nie ma żadnego efektu. Wejście Alt + D nadal wprowadza jakiś dziwny znak do Vima.
Thomson

9
To osobna kwestia. Twój terminal wysyła wielobajtowy znak do Vima, a Vim nie wie, jak go zinterpretować <A-d>. Prawdopodobnie musisz zmienić ustawienia terminala, aby wysyłał <A-d>jako plik <Esc>d.
jamessan

1
@jamessan jak to zrobić w iterm2?
Finn,

33

Nie jestem pewien, czy jest już „możliwe”. Przeczytaj aktualizację poniżej.

Tak, możesz nawet w terminalowym vimie, ale nie ma prawdziwej odpowiedzi na wszystkie pytania. Zasadniczo musisz wykonać dwa kroki:

  1. Upewnij się, że <M-d>notacja istnieje i dokładnie odwzoruj dane wejściowe terminala ( ^[jest to znak ucieczki):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Przypisz coś do nowo „utworzonej” kombinacji:

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

Rozumiejąc, jak to działa, możesz rozszerzyć tę "sztuczkę" na inne "dziwne" kombinacje, na przykład, ja używam termitu, a vim nie rozpoznaje <S-F1>, używając kota, którego dostałem ^[[1;2P. Następnie w moim vimrc robię:, execute "set <S-F1>=\e[1;2P"a potem mogę mapować to na cokolwiek.

Uwaga: nie wiem dlaczego, ale dla niektórych osób używa \<Esc>zamiast tego \e.


Aktualizacja (luty 2016)

W zależności od terminfo obsługiwanego przez twój terminal, być może mógłbyś ... w większości terminali mapowane jest na przykład "alt + h" ^[h, czyli: "escape + h". Więc może nadpisać klucze. Właśnie spróbowałem (ponownie) i wydaje się, że działa, ale uważam, że jest to implementacja bardzo błędna i podatna na błędy.

Niemniej jednak, dla odważnych, oto eksperymentalna wtyczka:


Zamiast tego execute "set...możesz po prostu bezpośrednio użyć set <M-d>=^[d. W ^[rzeczywistości jest to znak zmiany znaczenia wprowadzony za pomocą C-v-Esc. Było to konieczne w rxvt / urxvt, ale xterm nie powinien wymagać specjalnego traktowania. Więcej informacji na ten temat w wiki vim .
Micah Elliott,

Czy istnieje analogiczne podejście do tego, które działałoby z tmuxem, aby np. Można było powiązać Md?
George

2
Dla mnie, <Esc>po czym dteraz robi to samo co <Alt>+ d. Możesz to również zrobić w jednej linii za pomocą Ctrl-v, <Esc>jak tutaj .
Sparhawk

24

Mapuj klawisz Alt w Vimie na Mac OSx:

Zacznij od przejrzenia kodu klucza, który Twój terminal wysyła do vim:

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

W powyższym przykładzie uruchomiłem polecenie i nacisnąłem Alt + Left.

Jest ^[[1;9Dto sekwencja ucieczki wysyłana do vima, więc możemy użyć jej do naszego mapowania.

map <Esc>[1;9D 

3
Jeśli korzystasz z aplikacji iTerm2, dobrze jest sprawdzić, jak przypisane są klawisze w menu Profile> Keys.
fikovnik

1
Z lewym Optionklawiszem ( ) skonfigurowanym jak Esc+w iTerm2, mogłem zmapować alt+qwyjście z vima: nnoremap <silent> <Esc>q :qa!<cr>
ryenus

Możesz także skonfigurować iTerm2 do pracy z tym przemapowaniem, jeśli przejdziesz do Preferencje> Profile, wybierzesz bieżący profil, przejdź do zakładki „klucze” tego profilu i zmień opcję „Lewy ⌥ klawisz” na „Esc +” (dostępne dostępne opcje to „Normalny”, „Meta” i „Esc +”).
Giovanni Benussi

12

Posługiwać się:

map <A-D> <C-D>

Zobacz :help key-notation.


1
Wygląda na to, że to nadal nie działa. Alt + d wprowadzi dziwny znak do Vima, tak samo jak w przypadku unmap.
Thomson

Działa dla mnie (używam gvimw systemie Windows)
Deqing

8

Twój terminal może nie przesyłać „poprawnie” Alt-D. Możesz użyć CV, aby faktycznie otrzymać aktualną sekwencję ucieczki wysłaną do Vima i użyć jej do stworzenia swojego mapowania. To znaczy, wyedytuj swój plik .vimrc i zastąp rzeczywisty wpisując następującą sekwencję "CV Alt-D", abyś miał poprawną sekwencję ucieczki w swoim vimrc. To nie zadziała, jeśli twój terminal nie wyśle ​​niczego do vima.


8

Mój terminal produkowałby ^[xpolecenia (np. Dla alt-x). To, co sprawiło, że działał w Vimie, to ten mały skrypt z 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

Dodaj do .vimrc, aby naprawić wszystkie mapowania klawiszy alt.


1

jako kontynuacja odpowiedzi Bruno dla użytkowników komputerów Mac, spróbuj upewnić się, że klucz opcji jest zmapowany Esc+.

To da ci "normalne" zachowanie Aklawisza option ( ) w Vimie.

Na przykład w programie iterm2tę opcję można znaleźć pod Preferences > Profiles > Keys:

zrzut ekranu preferencji iterm2


Musiałem też zmienić konfigurację na nnoremap <Esc>j :m .+1<CR>==i podobne ...
mihaipopescu

0

Witam, po wielu latach testowania wszystkich powyższych rozwiązań na Macu, bez dobrego rozwiązania, szukałem dalej.

Oto moje rozwiązanie:

Aby stworzyć kombinację klawiszy, w tym Alt, musisz zadeklarować kombinację w preferencjach> klawiatura i użyć tej kombinacji w pliku konfiguracyjnym vima (zaznacz opcję use jako klawisz meta).

Wynik musi być nietypowym znakiem ( ana przykład nie), aby nie nadpisywać zwykłego znaku.

W poniższym przykładzie powinieneś być w stanie całkiem vimować z ALT-Up.

ustawienie vim: ustawienie vim

ustawienie mac: ustawienie mac

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.