Jak uzyskać Shift + strzałki i Ctrl + strzałki działające w Vimie w Tmuxie?

44

To wszystko znajduje się w iTerm2 na OS X.

Kiedyś miałem

export TERM='xterm-256color'

w moim .bashrc. Oznaczało to, że Vim w tmux używał 256 kolorów.

I kiedy dodałem

set -g xterm-keys on

wtedy skróty klawiaturowe z modyfikatorami działały poprawnie w Vimie. Mianowicie: shift+left/rightże zamapowałem, aby przełączyć karty Vima, ctrl+up/downże zamapowałem na linie ruchowe („bąbelkowe”), i shift+left/rightktóre wyskoczyły z pudełka, by przeskakiwać słowo po słowie w trybie wiersza poleceń (np. Podczas pisania czegoś podobnego :e foo bar baz).

Jednak w tej konfiguracji wystąpił problem polegający na tym, że kolor tła Vima pokazuje się tylko za tekstem, jak wspomniano tutaj .

Więc usunąłem

export TERM='xterm-256color'

od mojego .bashrci zamiast tego wstaw to do mojego .tmux.conf:

set -g default-terminal "screen-256color"

To naprawiło kolor tła Vima, ale złamało skróty klawiaturowe - zamiast tego robią nieoczekiwane rzeczy (przesuwają kursor, usuwają tekst).

Korzystając ctrl+vz wstawienia pełnego wyniku z kombinacji klawiszy (jak opisano tutaj ), byłem w stanie go obejść:

map [1;5A <C-Up>
map [1;5B <C-Down>
map [1;2D <S-Left>
map [1;2C <S-Right>
cmap [1;2D <S-Left>
cmap [1;2C <S-Right>

To sprawia, że ​​skróty działają, ale nie wydaje się, aby było to właściwe rozwiązanie. Czy ktoś mógłby mi powiedzieć, co się tutaj dzieje i jak to naprawić?

Henrik N.
źródło

Odpowiedzi:

68

Musisz ustawić opcję okna tmuxxterm-keys , aby tmux przekazywał te klucze do swoich terminali. Prawdopodobnie chcesz umieścić to w ~/.tmux.conf:

set-window-option -g xterm-keys on

Vim zazwyczaj automatycznie ustawia obsługę tych kluczy, gdy TERM jest xterm-sośc, ale pomija to, ponieważ TERM jest screen-256color. Możesz ręcznie skonfigurować te klucze w ~/.vimrcnastępujący sposób:

if &term =~ '^screen'
    " tmux will send xterm-style keys when its xterm-keys option is on
    execute "set <xUp>=\e[1;*A"
    execute "set <xDown>=\e[1;*B"
    execute "set <xRight>=\e[1;*C"
    execute "set <xLeft>=\e[1;*D"
endif

Przynajmniej w ten sposób nie musisz mapować wszystkich różnych kombinacji.

Chris Johnsen
źródło
Dziękuję Ci! To wygląda lepiej niż to, co miałem i doceniam wyjaśnienie. Jedną rzeczą, która została naprawiona przez to, co miałem, ale nie przez twoje linie, było to, że strzałki góra / dół nie działały we wtyczce Command-T, jak opisano tutaj: superuser.com/questions/237751/ ... Właśnie dodałem map <Esc>[B <Down>z jednego odpowiedzi. Wydaje się, że sama wtyczka ma złe założenia.
Henrik N
Żeby było jasne, twoje rozwiązanie plus map <Esc>[B <Down>z tego drugiego wątku oznacza, że ​​wszystko działa teraz dobrze.
Henrik N
@HenrikN Czy możesz wyjaśnić, co map <Esc>[B <Down>robi? Nie widzę żadnej różnicy, dodając go do mojego pliku .vimrc.
Francesco Boccardo
@Francesco Boccardo: Jeśli podążysz za linkiem z mojego poprzedniego komentarza, a następnie podążasz za linkiem stamtąd, przejdziesz do superuser.com/a/215181, który wydaje się wyjaśniać to dręcząco szczegółowo :)
Henrik N
@HenrikN Dzięki. Prawdopodobnie jest to problem związany z OSX, a może został rozwiązany przez te 7 lat, ponieważ naciśnięcie polecenia (kontrola?) + R nie psuje klawiszy strzałek w vimie w tmuxie dla mnie (jestem w systemie Linux).
Francesco Boccardo
8

Jak wyjaśniono tutaj , wyłącz wymazywanie koloru tła (BCE), usuwając t_utopcję terminala (uruchom :set t_ut=w Vimie, a następnie naciśnij Control+, Laby odświeżyć ekran terminala), aby schematy kolorów działały poprawnie, gdy Vim jest używany na ekranie tmux i GNU.

W ten sposób możesz zachować swoją TERMwartość jak w xterm-256colorprzypadku prawidłowego wykrywania klucza, a także uzyskać prawidłowe renderowanie schematu kolorów Vima! :-)

sunaku
źródło
1
Piękny! Świetna praca detektywistyczna.
Henrik N
2
Właśnie to dokładnie zmieniłem: github.com/henrik/dotfiles/commit/… Kolory i klawisze modyfikujące wydają się działać dobrze zarówno na zewnątrz, jak i wewnątrz tmux.
Henrik N