zsh: đặt TERM = screen-256color trong tmux, nhưng xterm-256color không có tmux


17

Tôi cần tôi $TERMđể được xterm-256colorbên ngoài của tmux (trong thiết bị đầu cuối với zsh "đồng bằng"), nhưng screen-256colorbên trong tmux.

Đầu tiên tôi đã thử:

  • thêm export TERM='xterm-256color'để tôi ~/.zshrc.
  • thêm set -g default-terminal "screen-256color"vào của tôi~/.tmux.conf

Bây giờ, khi tôi mở thiết bị đầu cuối (nói, xterm), TERMxterm-256color, đó là chính xác. Nhưng khi tôi chạy tmux, TERMlà một lần nữa xterm-256color!

Sau đó, tôi đã cố gắng để nhận xét ra dòng trong của tôi ~/.zshrc. Bây giờ, khi tôi mở terminal, TERMxtermvà khi tôi chạy tmux, TERMscreen-256color. Vì vậy, có vẻ như nếu tôi đặt TERMtrong .zshrc, tmux trước hết bộ TERMđến screen-256color, chạy shell (đó là zsh), và zsh đọc .zshrcvà resets TERMđể xterm-256color.

Vì vậy, làm thế nào để có TERMđược xterm-256colortrong thiết bị đầu cuối "đơn giản" và screen-256colortrong tmux?


5
Đặt TERM cho xterm trong cấu hình xterm (tài nguyên X) và cho Tmux trong cấu hình tmux. Không có lý do gì bạn nên làm bất cứ điều gì trong zsh.
Stéphane Chazelas

Hmm, nhưng tôi cũng sử dụng các trình giả lập thiết bị đầu cuối khác: giả sử, bảng điều khiển thả xuống kiểu gnome-terminal và kiểu động đất "altyo" github.com/linvinus/AltYo , vẫn không thể tìm ra cách đặt chính xác TERMtrong các thiết bị đầu cuối này
Dmitry Frank

1
Vâng, những ứng dụng đó có trách nhiệm thiết lập HẠN của họ đúng cách. Đối với gnome-terminal, đó có lẽ là gnome-256color... Vì vậy, đó là những ứng dụng bạn cần cấu hình đúng, không phải zsh. Lý do họ sử dụng xtermcó lẽ là để tránh các vấn đề khi sshing với các máy không có các mục terminfo cụ thể hơn. Nếu bạn biết bạn chỉ sshing với các máy có cơ sở dữ liệu terminfo đầy đủ, thì bạn có thể và nên thay đổi điều đó trong chính các ứng dụng.
Stéphane Chazelas

Và nếu bạn cần thêm một .zshrc kydge, IMO, thì nên có trên các máy có cơ sở dữ liệu terminfo chưa hoàn chỉnh (để thay thế xterm-256color bằng xtermnếu xterm-256color không được hỗ trợ, mặc dù vậy sẽ tốt hơn nếu thêm các mục đó vào cơ sở dữ liệu ~ / .terminfo).
Stéphane Chazelas

Chúng ta nên đặt hạn trong trình giả lập thiết bị đầu cuối, không phải trong .zshrc. Nó không phải là cách chính xác.
18:00

Câu trả lời:


23

Biến môi trường TERM phải được đặt bởi ứng dụng đóng vai trò là thiết bị đầu cuối của bạn. Đây là toàn bộ vấn đề: cho phép các chương trình chạy bên trong chúng biết thiết bị đầu cuối nào đang được sử dụng và do đó nó hỗ trợ loại tính năng nào.

Zsh không phải là một thiết bị đầu cuối. Nó là một cái vỏ. Nó có thể quan tâm HẠN của bạn được đặt thành gì nếu nó muốn làm những việc đặc biệt, nhưng nó không chịu trách nhiệm cho việc thiết lập nó. Thay vào đó, nó chịu trách nhiệm thiết lập các biến như ZSH_VERSION có thể được sử dụng bởi các tập lệnh hoặc các quy trình con khác để hiểu hành vi nào mong đợi từ trình bao cha mẹ của chúng.

Thay vào đó, bạn cần kiểm tra cấu hình cho bất kỳ ứng dụng đầu cuối nào bạn đang sử dụng và yêu cầu nó báo cáo chính xác. Ví dụ: bạn có thể làm điều này cho xterm bằng cách thêm dòng này vào ~/.Xdefaultstệp mà nó sử dụng cho các giá trị cấu hình:

xterm*termName: xterm-256color

Dường như gnome-terminal thực hiện điều ngu ngốc khi đọc cấu hình xterm của bạn sẽ thay vì sở hữu nó. Điều này có thể giúp bạn trong một số trường hợp nhưng nên được đặt thành gnome-256color đúng hơn. Điều này dường như là một sự kìm kẹp lâu dài đối với nó (và một số trình giả lập thiết bị đầu cuối dựa trên VTE khác). Một cách phổ biến để hack xung quanh điều này là khai thác một giá trị khác mà nó đặt ra:

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

Nhưng điều này đưa bạn trở lại vấn đề của bạn với tmux, vì vậy bạn sẽ phải giải quyết vấn đề đó bằng cách không đặt lại TATE nếu nó đã là một cái gì đó như "screen-256color" hoặc "screen":

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

Đối với các thiết bị đầu cuối khác, bạn sẽ cần tìm kiếm các thói quen cấu hình phù hợp của chúng.


zshkhông chịu trách nhiệm thiết lập $SHELL. loginchịu trách nhiệm thiết lập nó và bạn có trách nhiệm thay đổi nó thành một thứ khác nếu bạn muốn nói với các ứng dụng ( xterm, vi...) lớp vỏ nào bạn muốn làm vỏ yêu thích của bạn. zshchịu trách nhiệm thiết lập $ZSH_VERSIONvà một vài biến shell đặc biệt được ghi lại, nhưng nó không chạm vào $SHELL.
Stéphane Chazelas

@ StéphaneChazelas Đó là sự cẩu thả của tôi, cảm ơn vì đã sửa chữa.
Caleb

Cảm ơn vì điều này, nó khiến tôi tìm cách konsoleđặt TATE thay vì đặt nó trong bashrc của mình. Tìm thấy nó được đặt trong tab Chung của hồ sơ, Môi trường, đã thay đổi nó xtermthànhxterm-256color
Mike Lippert

Đáng chú ý là dưới vani tôi deb10 cài đặt GNOME ga báo cáo truecolorthay vì gnome-terminalcho $COLORTERMvà do đó cơ chế phát hiện trên có thể không làm việc. XTERM hoàn toàn không xuất hiện để đặt giá trị này, nó có thể hợp lệ để kiểm tra bất kỳ giá trị nào. loại thuật ngữ này được thảo luận một phần trong ý chính này có thể ở nơi khác: gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson

8

Trong .zshrc của bạn, đặt

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

Và, bên trong .tmux.conf của bạn

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

2
Hoặc [[ $TMUX != "" ]] && export TERM="screen-256color" Cách này zsh sẽ chỉ đặt HẠN nếu được gọi trong phiên tmux
Titou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.