Bagaimana cara mendapatkan shift + panah dan ctrl + panah bekerja di Vim di tmux?

45

Ini semua ada di iTerm2 di OS X.

saya pernah mempunyai

export TERM='xterm-256color'

di saya .bashrc. Ini berarti Vim di tmux memang menggunakan 256 warna.

Dan begitu saya menambahkan

set -g xterm-keys on

kemudian pintasan keyboard dengan pengubah bekerja dengan baik di Vim. Yaitu: shift+left/rightbahwa saya memetakan untuk beralih tab Vim, ctrl+up/downbahwa saya memetakan untuk memindahkan ("gelembung") baris, dan shift+left/rightyang bekerja di luar kotak untuk melompat dengan kata dalam mode baris perintah (misalnya ketika mengetikkan sesuatu seperti :e foo bar baz).

Namun, pengaturan ini memiliki masalah bahwa warna latar belakang Vim hanya menunjukkan di belakang teks, seperti yang disebutkan di sini .

Jadi saya dihapus

export TERM='xterm-256color'

dari saya .bashrcdan alih-alih letakkan ini di .tmux.conf:

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

Itu memperbaiki warna latar belakang Vim, tetapi merusak pintasan keyboard - mereka melakukan hal-hal yang tidak terduga (memindahkan kursor, menghapus teks) sebagai gantinya.

Dengan menggunakan ctrl+vuntuk memasukkan keluaran kata demi kata dari kombinasi tombol (seperti dijelaskan di sini ), saya dapat mengatasinya:

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>

Ini membuat pintasan berfungsi, tetapi rasanya tidak seperti solusi yang tepat. Adakah yang bisa memberi tahu saya apa yang terjadi di sini dan bagaimana cara memperbaikinya?

Henrik N
sumber

Jawaban:

69

Anda perlu mengatur opsi jendela tmuxxterm-keys sehingga tmux akan meneruskan kunci-kunci ini ke terminal-terminalnya. Anda mungkin ingin meletakkan ini di ~/.tmux.conf:

set-window-option -g xterm-keys on

Vim biasanya akan secara otomatis mengatur penanganannya terhadap kunci-kunci ini ketika TERM sedang xterm-sesuatu, tetapi ini dilewati sejak TERM screen-256color. Anda dapat mengkonfigurasi kunci-kunci ini secara manual di ~/.vimrcseperti ini:

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

Setidaknya dengan begitu Anda tidak perlu memetakan semua kombinasi yang berbeda.

Chris Johnsen
sumber
Terima kasih! Itu terlihat lebih baik daripada yang saya miliki, dan saya menghargai penjelasannya. Satu hal yang diperbaiki oleh apa yang saya miliki, tetapi tidak oleh garis Anda, adalah bahwa panah atas / bawah tidak berfungsi di plugin Command-T seperti dijelaskan di sini: superuser.com/questions/237751/… Saya baru saja menambahkan map <Esc>[B <Down>dari satu dari jawaban. Sepertinya alasan ada beberapa asumsi buruk yang dibuat oleh plugin itu sendiri.
Henrik N
Supaya jelas, solusi Anda ditambah map <Esc>[B <Down>dari utas lainnya berarti semuanya sekarang berfungsi dengan baik.
Henrik N
@ HenrikN Bisakah Anda menjelaskan apa map <Esc>[B <Down>? Saya tidak melihat perbedaan dengan menambahkannya ke file .vimrc saya.
Francesco Boccardo
@Francesco Boccardo: Jika Anda mengikuti tautan di komentar saya sebelumnya, dan kemudian mengikuti tautan itu lagi dari sana, Anda bisa ke superuser.com/a/215181 yang tampaknya menjelaskannya dengan sangat mendetail :)
Henrik N
@ HenrikN Terima kasih. Jadi itu mungkin masalah terkait OSX, atau mungkin sudah diselesaikan dalam 7 tahun ini, karena menekan perintah (kontrol?) + R tidak mengacaukan tombol panah dalam vim di tmux untuk saya (saya di Linux).
Francesco Boccardo
8

Seperti yang dijelaskan di sini , nonaktifkan Background Color Erase (BCE) dengan menghapus t_utopsi terminal (jalankan :set t_ut=di Vim dan kemudian tekan Control+ Luntuk menyegarkan tampilan terminal) sehingga skema warna berfungsi dengan baik ketika Vim digunakan di dalam tmux dan layar GNU.

Dengan cara ini, Anda dapat mempertahankan TERMnilai Anda xterm-256coloruntuk deteksi kunci yang tepat sambil mendapatkan rendering skema warna Vim yang tepat juga! :-)

sunaku
sumber
1
Indah! Pekerjaan detektif yang bagus.
Henrik N
2
Inilah yang saya ubah dengan tepat: github.com/henrik/dotfiles/commit/... Warna dan tombol pengubah tampaknya berfungsi dengan baik baik di luar maupun di dalam tmux.
Henrik N