Saya perlu saya $TERM
berada di xterm-256color
luar tmux (di terminal "polos" dengan zsh), tetapi screen-256color
di 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), TERM
adalah xterm-256color
, yang benar. Tetapi ketika saya menjalankan tmux, TERM
sekali lagi xterm-256color
!
Lalu aku mencoba mengomentari kalimat di blogku ~/.zshrc
. Sekarang, ketika saya membuka terminal, TERM
adalah xterm
, dan ketika saya menjalankan tmux, TERM
adalah screen-256color
. Jadi sepertinya jika saya atur TERM
di .zshrc
, tmux pertama-tama diset TERM
ke screen-256color
, menjalankan shell (yang merupakan zsh), dan zsh membaca .zshrc
dan mengatur ulang TERM
ke xterm-256color
.
Jadi, bagaimana membuat TERM
menjadi xterm-256color
di terminal "polos", dan screen-256color
di tmux?
TERM
di terminal inignome-terminal
, itu mungkin seharusnyagnome-256color
... Jadi itu adalah aplikasi yang perlu Anda konfigurasi dengan benar, bukanzsh
. Alasan mereka menggunakanxterm
mungkin 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.xterm
jika xterm-256color tidak didukung, meskipun akan lebih baik untuk menambahkan entri tersebut di sendiri ~ / .terminfo database)..zshrc
. Itu bukan cara yang benar.Jawaban:
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
~/.Xdefaults
file yang digunakannya untuk nilai konfigurasi: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:
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":
Untuk terminal lain, Anda perlu mencari rutin konfigurasi yang tepat.
sumber
zsh
tidak bertanggung jawab atas pengaturan$SHELL
.login
bertanggung 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.zsh
bertanggung jawab untuk pengaturan$ZSH_VERSION
dan beberapa variabel shell khusus yang didokumentasikan, tetapi tidak menyentuh$SHELL
.konsole
mengatur JANGKA daripada meletakkannya di bashrc saya. Menemukannya diatur di tab Umum profil, Lingkungan, mengubahnya darixterm
menjadixterm-256color
truecolor
bukangnome-terminal
untuk$COLORTERM
dan 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-detectionDi dalam .zshrc Anda, masukkan
Dan, di dalam .tmux.conf Anda
sumber
[[ $TMUX != "" ]] && export TERM="screen-256color"
Dengan cara ini zsh akan menetapkan TERM hanya jika dipanggil dalam sesi tmux