zsh: atur TERM = screen-256color di tmux, tapi xterm-256color tanpa tmux

18

Saya perlu saya $TERMberada di xterm-256colorluar tmux (di terminal "polos" dengan zsh), tetapi screen-256colordi dalam tmux.

Pertama saya mencoba:

  • tambahkan export TERM='xterm-256color'ke ~/.zshrc.
  • tambahkan set -g default-terminal "screen-256color"ke~/.tmux.conf

Sekarang, ketika saya membuka terminal (katakanlah, xterm), TERMadalah xterm-256color, yang benar. Tetapi ketika saya menjalankan tmux, TERMsekali lagi xterm-256color!

Lalu aku mencoba mengomentari kalimat di blogku ~/.zshrc. Sekarang, ketika saya membuka terminal, TERMadalah xterm, dan ketika saya menjalankan tmux, TERMadalah screen-256color. Jadi sepertinya jika saya atur TERMdi .zshrc, tmux pertama-tama diset TERMke screen-256color, menjalankan shell (yang merupakan zsh), dan zsh membaca .zshrcdan mengatur ulang TERMke xterm-256color.

Jadi, bagaimana membuat TERMmenjadi xterm-256colordi terminal "polos", dan screen-256colordi tmux?

Dmitry Frank
sumber
5
Atur TERM untuk xterm dalam konfigurasi xterm (sumber X) dan untuk tmux dalam konfigurasi tmux. Tidak ada alasan Anda harus melakukan semua itu di zsh.
Stéphane Chazelas
Hmm, tapi saya juga menggunakan emulator terminal lain: katakanlah, gnome-terminal dan konsol drop-down gaya "altyo" github.com/linvinus/AltYo , masih tidak dapat menemukan cara untuk mengatur yang benar TERMdi terminal ini
Dmitry Frank
1
Nah aplikasi tersebut bertanggung jawab untuk mengatur JANGKA mereka dengan benar. Sebab gnome-terminal, itu mungkin seharusnya gnome-256color... Jadi itu adalah aplikasi yang perlu Anda konfigurasi dengan benar, bukan zsh. Alasan mereka menggunakan xtermmungkin untuk menghindari masalah ketika sshing ke mesin yang tidak memiliki entri terminfo yang lebih spesifik. Jika Anda tahu Anda hanya menggunakan mesin dengan database terminfo lengkap, maka Anda dapat dan harus mengubahnya dalam aplikasi itu sendiri.
Stéphane Chazelas
Dan jika Anda perlu menambahkan .zshrc kludge, IMO, yang seharusnya ada pada mesin yang memiliki basis data terminfo yang tidak lengkap (untuk mengganti xterm-256color dengan xtermjika xterm-256color tidak didukung, meskipun akan lebih baik untuk menambahkan entri tersebut di sendiri ~ / .terminfo database).
Stéphane Chazelas
Kita harus menetapkan term di emulator terminal, bukan di .zshrc. Itu bukan cara yang benar.
jdhao

Jawaban:

24

Variabel lingkungan TERM harus ditetapkan oleh aplikasi yang bertindak sebagai terminal Anda. Inilah inti masalahnya: membiarkan program yang berjalan di dalamnya tahu terminal apa yang digunakan dan karenanya fitur apa yang didukungnya.

Zsh bukan terminal. Itu adalah shell. Mungkin peduli apa TERM Anda diatur untuk jika ingin melakukan hal-hal khusus, tetapi seharusnya tidak bertanggung jawab untuk mengaturnya . Alih-alih, ia bertanggung jawab untuk mengatur variabel seperti ZSH_VERSION yang dapat digunakan oleh skrip atau proses anak lainnya untuk memahami perilaku apa yang diharapkan dari shell induknya.

Sebagai gantinya, Anda perlu memeriksa konfigurasi untuk aplikasi terminal apa pun yang Anda gunakan dan memintanya untuk melaporkannya dengan benar. Misalnya Anda bisa melakukan ini untuk xterm dengan menambahkan baris ini ke ~/.Xdefaultsfile yang digunakannya untuk nilai konfigurasi:

xterm*termName: xterm-256color

Tampaknya gnome-terminal melakukan hal bodoh membaca apa konfigurasi xterm Anda daripada memiliki itu sendiri. Ini mungkin bisa membuat Anda bertahan dalam beberapa kasus tetapi seharusnya lebih baik diatur ke gnome-256color. Ini tampaknya merupakan keluhan yang bertahan lama terhadapnya (dan beberapa emulator terminal berbasis VTE lainnya). Cara umum untuk meretas ini adalah dengan mengeksploitasi nilai lain yang ditetapkan:

if [ "$COLORTERM" = "gnome-terminal" ]; then
    export TERM=gnome-256color
fi 

Tetapi ini membawa Anda kembali ke masalah Anda dengan tmux, jadi Anda harus memperhitungkannya dengan tidak mengatur ulang JANGKA WAKTU jika sudah seperti "screen-256color" atau "screen":

if [ "$COLORTERM" = "gnome-terminal" -a "$TERM" =~ xterm.* ]; then
    export TERM=gnome-256color
fi

Untuk terminal lain, Anda perlu mencari rutin konfigurasi yang tepat.

Caleb
sumber
zshtidak bertanggung jawab atas pengaturan $SHELL. loginbertanggung jawab untuk mengaturnya, dan Anda bertanggung jawab untuk mengubahnya ke sesuatu yang lain jika Anda ingin memberi tahu aplikasi ( xterm, vi...) shell mana yang Anda inginkan sebagai shell pilihan Anda. zshbertanggung jawab untuk pengaturan $ZSH_VERSIONdan beberapa variabel shell khusus yang didokumentasikan, tetapi tidak menyentuh $SHELL.
Stéphane Chazelas
@ StéphaneChazelas Itu ceroboh dari saya, terima kasih atas koreksinya.
Caleb
Terima kasih untuk ini, itu membuat saya mencari cara konsolemengatur JANGKA daripada meletakkannya di bashrc saya. Menemukannya diatur di tab Umum profil, Lingkungan, mengubahnya dari xtermmenjadixterm-256color
Mike Lippert
Perlu dicatat bahwa di bawah vanilla deb10 saya menginstal laporan Terminal GNOME truecolorbukan gnome-terminaluntuk $COLORTERMdan sehingga mekanisme deteksi di atas mungkin tidak berfungsi. XTERM tampaknya tidak mengatur nilai ini sama sekali, mungkin valid untuk memeriksa nilai apa pun. jenis istilah ini sebagian dibahas dalam inti ini kemungkinan di tempat lain: gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson
8

Di dalam .zshrc Anda, masukkan

[[ $TMUX = "" ]] && export TERM="xterm-256color"

Dan, di dalam .tmux.conf Anda

set -g default-terminal "screen-256color"
thiagowfx
sumber
2
Atau [[ $TMUX != "" ]] && export TERM="screen-256color" Dengan cara ini zsh akan menetapkan TERM hanya jika dipanggil dalam sesi tmux
Titou