Gulir keluaran shell dengan mouse di tmux

256

Menggulir mouse tidak bekerja di tmux seperti cara kerjanya ketika saya menjalankan shell tanpa tmux (di Gnome Terminal). Tampaknya tmux mengirimkan acara gulir mouse seolah-olah saya menekan tombol Atas / Bawah. Tapi saya ingin menggulir melalui sejarah keluaran shell . Apakah ada cara untuk membuat tmux berfungsi seperti ini?

Catatan: Saya tahu cara menggulir dengan keyboard (terima kasih untuk pertanyaan lain di sini).

Saya mencoba menggulir mouse dalam dua versi tmux:

pengguna31494
sumber
1
Saya pikir jawaban bukzor memecahkan masalah Anda untuk tmux 1.5 dan yang lebih baru.
kynan

Jawaban:

252

Untuk menggulir dalam riwayat output Anda akan menggunakan ^b+ [ Anda kemudian dapat menggunakan M + V untuk halaman ke atas dan ^ V ke halaman ke bawah. Saya tidak tahu apakah Anda dapat menggunakan yang asli PgUpdan PgDownsebenarnya. Terminal saya tidak mengirim kunci-kunci ini ke tmux. Alih-alih itu bergulir sendiri dan bukan sejarah tmux.

Untuk keluar dari mode salin, tekan ESC

Untuk menggunakan mouse Anda dalam mode ini (disebut mode salin) tekan ^b+ : dan masukkan berikut ini:

setw -g mouse on

Catatan: Di tmux <2.1, opsi itu bernama mode-mouse, dan tidakmouse

Sekarang ketika Anda mengubah ke mode salin Anda dapat menggunakan mouse Anda untuk menggulirnya. Anda dapat menempatkan perintah ini di ~ / .tmux.conf Anda jika Anda menginginkannya setiap kali Anda menjalankan tmux.

Pembaruan: Pada tmux 1.5 opsi ini membuat menggunakan roda gulir secara otomatis beralih ke mode salin dan gulir kembali buffer tmux scrollback. Tidak perlu lagi menekan Ctrl-B+ [lagi. Menggulir kembali ke bawah ke prompt juga mengakhiri mode salin secara otomatis.

Pavlo
sumber
1
Perhatikan bahwa Anda mungkin harus memuat ulang file konfigurasi jika Anda sudah memiliki server tmux yang sedang berjalan. blog.sanctum.geek.nz/reloading-tmux-config tmux source-file ~ / .tmux.conf
Allan Nienhuis
7
Tidak bekerja untuk saya di OS X.
Ain
2
@ Ain - Sekarang ada 11 versi utama OS X. Versi mana yang tepatnya kita bicarakan?
Ramhound
10
Untuk tmux> = 2.1, lihat jawaban @ DannyRe (saat ini cukup jauh ke bawah).
joelostblom
3
set -g mouse onbekerja untuk saya di macOS tmux 2.1
Miguel Mota
123

Ada beberapa perubahan untuk Tmux 2.1

  • Mode mouse telah ditulis ulang. Sekarang tidak ada opsi lagi untuk:

    • panel mouse-ukuran
    • panel-pilih-mouse
    • mouse-pilih-jendela
    • mode-mouse

    Sebaliknya hanya ada satu opsi: 'mouse' yang menyalakan dukungan mouse sepenuhnya.

Itu akan menjadi

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
DannyRe
sumber
6
Terima kasih, sekarang memilih panel, dll berfungsi, tetapi menggulir tidak. Agar pengguliran berfungsi lagi, gunakan ini: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi
1
mengagumkan - ini bahkan bekerja di cygwin - tmux di WINDOWS 7
GWD
@ Mahdi Ini sepertinya tidak berfungsi di osx. Ada petunjuk?
DiTTiD
2
bindtampaknya tidak diperlukan lagi pada tmux 2.3
Theron Luhn
2
+1 untuk set -g mouse on. Komentar sebelumnya benar. Ikatan tidak lagi dibutuhkan.
Dakusan
63

Versi tmux (1.5) saat ini memungkinkan Anda cukup mengatur opsi mode-mouse, dan memungkinkan Anda untuk menggulir dengan roda mouse.

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

Di .tmux.conf saya:

set-window-option -g mode-mouse on
bukzor
sumber
Itu adalah perilaku yang Anda inginkan! Scroll mouse memungkinkan mode penyalinan, tidak hanya menggulir buffer pengganti shell. Itu akhirnya insentif untuk beralih dari layar ke tmux bagi saya. Apakah ada opsi untuk mendapatkan perilaku yang sama juga dengan Shift + PgUp?
kynan
1
@kynan: Saya pribadi cukup menekan C-A PgUpuntuk melakukan itu. Anda dapat mengikat kunci laman langsung dengan tmux bind-key -n PPage copy-mode -u. Thign serupa harus berfungsi untuk shift + pageup jika Anda melepaskan ikatannya dari terminal lokal Anda.
bukzor
1
Ini menghasilkan perilaku aneh di mana, ketika saya gulir kembali ke baris perintah, saya mendapatkan karakter tambahan dimasukkan ke dalam CLI, yang biasanya mengakibatkan perintah pertama saya salah. Cukup menyebalkan.
Chris R
Perhatikan bahwa, meskipun ini berfungsi dengan baik untuk memicu gulir dengan mouse, itu menyebabkan perilaku aneh ketika memilih teks yang akan disisipkan dengan klik tengah. Saya akhirnya memilih Cb pg-up / down (default) karena pengorbanan tidak dapat diterima.
h7r
@ Chris saya mendapatkan ini sedikit juga dan itu tidak cukup konsisten. Apakah ini tipe [M [M # [M [M # [M] [M # [M [M # [M] [M]]?
Elijah Lynn
53

Coba ini di .tmux.conf Anda

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

Diambil dari http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY

John L. Jegutanis
sumber
+1 untuk escape-timepengaturan
Dakusan
Untuk orang lain yang bertanya-tanya, file .tmux.conf ditempatkan di direktori home Anda.
user2647513
15

Seseorang (dari sumber yang saya hilangkan) menyarankan menambahkan yang berikut ke ~.tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Saya tidak tahu cara kerjanya atau apa fungsinya, tetapi sekarang ini memungkinkan saya untuk menggulir dengan roda mouse di dalam sesi tmux tanpa harus masuk ke mode salin tmux; Saya hanya gulir roda dan BAM! berhasil. Perhatikan bahwa saya menggunakan terminal.app, tapi saya ingat OP memberikan jawaban khusus untuk digunakan gnome-terminal.

Jed Daniels
sumber
1
Jed, terima kasih! Saran Anda juga berfungsi di terminal gnome. Saya akan mencoba menggunakan pengaturan ini untuk beberapa waktu. Tetapi memiliki kelemahan: menggulir mouse sekarang tidak berfungsi seperti yang diharapkan pada less. Jika saya memuat lessdi dalam tmux, gulir mouse tidak menggulung file yang dibuka less. Ini menggulung seluruh terminal. Anehnya, vimberperilaku seperti yang diharapkan di dalam tmuxdengan pengaturan Anda.
user31494
2
Perhatikan bahwa pada tmux 1.5 ini digantikan oleh setw -g mode-mouse onopsi, yang melakukan scrollback mode salin menggunakan roda mouse.
kynan
3
Penjelasannya adalah bahwa opsi ini menonaktifkan kunci gulir pada layar alternatif terminal, yang diinginkan dalam banyak kasus karena aplikasi yang meminta buffer layar alternatif (vi, kurang, tmux dll.) Menyediakan kemampuan gulir mereka sendiri. Mengganti kunci ini dalam tmux memungkinkan menggulir buffer layar alternatif terminal yang tidak memberikan hasil yang diinginkan dalam semua kecuali beberapa kasus. Lihat jawaban ini untuk kutipan dari man xtermpenjelasan layar alternatif.
kynan
Sayangnya, ini tidak berhasil di iTerm
Suan
Saya mendapat hasil positif dengan ini di iTerm 2
Keith Smiley
5

tmux 2.1 memperkenalkan ikatan mouse baru.

Saya menulis ikatan ini sekarang hari ini. Ini mulus mengikat roda mouse ke panah ketika tidak di Vim, karena Vim mampu menafsirkan kode roda mouse mentah (untuk tujuan seperti memilih jendela Vim mana yang akan digulirkan untuk Anda tergantung pada mana mouse Anda berakhir).

Ini berarti kita akhirnya dapat menggunakan mouse hanya untuk melihat banyak halaman manual dan apa pun yang menerima tombol panah. Anda dapat memperluas dan rantai iflogika yang diperlukan untuk menerapkan lebih banyak logika untuk aplikasi Anda.

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

Dengan kemampuan mengikat roda baru ini, Anda dapat membuat skrip roda mouse untuk melakukan perilaku sensitif konteks apa pun yang Anda sukai.

Steven Lu
sumber
Saya sekarang hanya semacam mempermainkan ide membuat roda mouse di perbatasan panel melakukan sesuatu yang menarik. Mungkin yang akan saya lakukan bukanlah memetakan roda di perbatasan tetapi memetakannya untuk menggilir jendela tmux ketika dilakukan melalui statusline.
Steven Lu
Apa tautan ke Github Anda? Saya ingin mengikuti upaya Anda! Fitur lain yang saya cari adalah memiliki klik dua kali menyalin kata ke clipboard X, seperti halnya di luar Tmux.
joeytwiddle
@ joeytwiddle Saya sangat merekomendasikan github.com/NHDaly/tmux-better-mouse-mode , lihat jawaban saya yang lain
Steven Lu
3

Gnome-terminal melakukan beberapa tipu daya yang menterjemahkan kejadian gulir mouse ke tombol panah Atas dan Bawah dalam kondisi pengguliran "biasa" yang terbatas. Sebagai contoh, ketika Anda melihat beberapa teks menggunakan less(ini terjadi khususnya ketika Anda sedang membaca seorang pria), Anda dapat menggulir konten menggunakan j, kdan tombol panah. Tetapi juga , dengan gnome-terminal, Anda dapat melakukannya dengan menggulir mouse, berkat trik yang disebutkan.

Jadi saya kira tmuxmelakukan beberapa "menangkap" terminal seperti less- dan mekanisme yang sama dalam gnome-terminaltendangan dalam: pengguliran mouse diterjemahkan ke dalam penekanan tombol panah Atas / Bawah.

Anda dapat mematikan fitur ini di pengaturan profil dan mendapatkan scrolling biasa dalam keadaan apa pun. Hanya hapus kotak centang terakhir di tab "bergulir": kotak centang.

ulidtko
sumber
Terima kasih atas penjelasannya, uldtko! Tapi itu tidak membantu masalah pengguliran mouse. Ya, dengan opsi dimatikan, gnome-terminalberhenti mengirim tiga kali lipat ^[[Adan ^[[Bmouse-scroll. Ini lebih baik dalam tmux(tidak ada jelek ^[[A^[[A^[[Adi beberapa program, tidak ada perintah-sejarah-gulir jelek), tetapi sekarang lessberhenti menggulir pada mouse-gulir.
user31494
1
Orang inggris? (menebak dengan ikarakter)
dotancohen
1

https://github.com/NHDaly/tmux-better-mouse-mode

Implementasi kontrol mouse yang dapat dikonfigurasi dan kaya fitur untuk tmux baru. sangat dianjurkan.

Anda mungkin ingin menggunakannya

set -g @emulate-scroll-for-no-mouse-alternate-buffer "on"

dengan itu juga.

Steven Lu
sumber
Saya menginstal ini tetapi saya tidak lagi dapat menyorot dan menyalin teks dengan mouse. Apakah kamu bisa melakukan ini?
Jonankanking
Ya, Anda mungkin memiliki konfigurasi tmux terkait mouse lainnya yang bertentangan dengannya.
Steven Lu
0

Anda dapat menggabungkan ide-ide yang mengikat dari jawaban lain untuk mendapatkan perilaku penggulir yang cukup memuaskan: bekerja dalam perubahan vim ke mode salin secara otomatis di terminal dan keluar ketika Anda mencapai bagian bawah masih memungkinkan Anda untuk menggunakan roda mouse secara manual, lebih sedikit dan jurnal.

Kode saya:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

Anda dapat menambahkan perintah lain yang memerlukan tombol panah untuk menggulir di bagian grep -e 'man'

saya menambahkan tombol-kirim beberapa kali, jadi satu centang pada roda mouse akan menggulir 4 baris sekaligus

mencuri
sumber
0

Jika Anda sudah dalam sesi tmux Anda dapat menjalankan perintah

set mouse on

Pengingat: untuk menjalankan perintah, gunakan awalan Anda kemudian :.

Robert
sumber