zsh: ตั้งค่า TERM = screen-256color ใน tmux แต่ xterm-256color โดยไม่มี tmux


18

ฉันต้องการ$TERMให้ฉันอยู่xterm-256colorนอก tmux (ใน terminal "ธรรมดา" กับ zsh) แต่screen-256colorภายใน tmux

ก่อนอื่นฉันลอง:

  • เพิ่มของฉันexport TERM='xterm-256color'~/.zshrc
  • เพิ่มset -g default-terminal "screen-256color"ของฉัน~/.tmux.conf

ตอนนี้เมื่อฉันเปิดเทอร์มินัล (พูด xterm) TERMคือxterm-256colorซึ่งถูกต้อง แต่เมื่อฉันเรียกใช้ tmux TERMเป็นอีกครั้งxterm-256color!

~/.zshrcแล้วฉันพยายามที่จะแสดงความคิดเห็นออกมาในแนวของฉัน ตอนนี้เมื่อผมเปิด terminal, TERMเป็นxtermและเมื่อผมทำงาน tmux, คือTERM screen-256colorดังนั้นดูเหมือนว่าถ้าผมตั้งTERMใน.zshrc, tmux แรกชุดTERMที่จะscreen-256colorวิ่งเปลือก (ซึ่งเป็น zsh) และ zsh อ่าน.zshrcและการตั้งค่าใหม่เพื่อTERMxterm-256color

ดังนั้นวิธีที่จะทำให้TERMอยู่xterm-256colorในขั้ว "ธรรมดา" และscreen-256colorใน tmux?


5
ตั้งค่า TERM สำหรับ xterm ในการกำหนดค่า xterm (รีซอร์ส X) และ tmux ในการกำหนดค่า tmux ไม่มีเหตุผลที่คุณควรทำสิ่งนั้นใน zsh
Stéphane Chazelas

อืม แต่ฉันยังใช้เทอร์มินัลอีมูเลเตอร์อื่น: พูด gnome-terminal และดรอปดาวน์สไตล์คอนโซล "altyo" github.com/linvinus/AltYoยังไม่สามารถหาวิธีการตั้งค่าที่ถูกต้องTERMในเทอร์มินัลเหล่านี้
Dmitry Frank

1
ดีโปรแกรมเหล่านั้นมีความรับผิดชอบในการตั้งค่าของพวกเขาลงทุนอย่างถูกต้อง สำหรับการgnome-terminalที่อาจจะgnome-256color... zshดังนั้นมันเป็นโปรแกรมที่คุณต้องกำหนดค่าอย่างถูกต้องไม่ได้ เหตุผลที่พวกเขาใช้xtermอาจจะหลีกเลี่ยงปัญหาเมื่อ sshing ไปยังเครื่องที่ไม่มีรายการ terminfo เฉพาะเจาะจงมากขึ้น หากคุณรู้ว่าคุณกำลัง sshing ไปยังเครื่องที่มีฐานข้อมูล terminfo ครบถ้วนสมบูรณ์เท่านั้นคุณสามารถและควรเปลี่ยนแปลงสิ่งนั้นในแอปพลิเคชันด้วยตนเอง
Stéphane Chazelas

และถ้าคุณต้องการเพิ่ม. zshrc kludge, IMO, ที่ควรจะอยู่ในเครื่องที่มีฐานข้อมูล terminfo ที่ไม่สมบูรณ์ (เพื่อแทนที่ xterm-256color ด้วยxtermถ้า xterm-256color s ไม่ได้รับการสนับสนุน เป็นเจ้าของฐานข้อมูล ~ / .terminfo)
Stéphane Chazelas

เราควรกำหนดระยะในจำลอง terminal .zshrcไม่ได้อยู่ใน มันไม่ใช่วิธีที่ถูกต้อง
jdhao

คำตอบ:


24

ควรกำหนดตัวแปรสภาพแวดล้อม TERM โดยแอปพลิเคชันที่ทำหน้าที่เป็นเครื่องปลายทางของคุณ นี่เป็นจุดรวมของสิ่งต่าง ๆ : ให้โปรแกรมที่ทำงานอยู่ภายในรู้ว่าเทอร์มินัลใดกำลังใช้งานอยู่

Zsh ไม่ใช่เทอร์มินัล มันเป็นเปลือกหอย มันอาจจะสนใจสิ่งที่ลงทุนของคุณตั้งค่าถ้ามันอยากจะทำสิ่งที่พิเศษ แต่มันไม่ควรจะเป็นผู้รับผิดชอบในการตั้งค่ามัน แต่มีหน้าที่รับผิดชอบในการตั้งค่าตัวแปรเช่น ZSH_VERSION ซึ่งสามารถใช้โดยสคริปต์หรือกระบวนการลูกอื่น ๆ เพื่อทำความเข้าใจพฤติกรรมที่คาดหวังจากเปลือกหลักของพวกเขา

แต่คุณต้องตรวจสอบการกำหนดค่าสำหรับแอปพลิเคชันเทอร์มินัลที่คุณใช้งานอยู่และขอให้รายงานตัวเองอย่างถูกต้อง ตัวอย่างเช่นคุณสามารถทำสิ่งนี้เพื่อ xterm โดยเพิ่มบรรทัดนี้ลงใน~/.Xdefaultsไฟล์ที่ใช้สำหรับค่าการกำหนดค่า:

xterm*termName: xterm-256color

ดูเหมือนว่า gnome-terminal จะทำสิ่งที่งี่เง่าในการอ่านสิ่งที่การกำหนดค่า xterm ของคุณจะแทนที่จะเป็นของตัวเอง ในบางกรณีคุณอาจได้รับสิ่งนี้ แต่ควรตั้งค่าให้ถูก gnome-256color มากขึ้น สิ่งนี้ดูเหมือนจะเป็นมือจับที่ยืนยาวต่อมัน (และตัวจำลองเทอร์มินัลตาม VTE อื่น ๆ ) วิธีการทั่วไปที่จะตัดรอบนี้คือการใช้ประโยชน์จากค่าอื่นมันไม่ตั้ง:

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

แต่สิ่งนี้จะนำคุณย้อนกลับไปสู่ปัญหาของคุณด้วย tmux ดังนั้นคุณจะต้องคำนึงถึงสิ่งนั้นด้วยการไม่รีเซ็ต TERM หากเป็นเช่น "screen-256color" หรือ "screen":

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

สำหรับเทอร์มินัลอื่นคุณจะต้องค้นหารูทีนการกำหนดค่าที่เหมาะสม


zsh$SHELLจะไม่รับผิดชอบต่อการตั้งค่า loginรับผิดชอบในการตั้งค่าและคุณมีความรับผิดชอบในการเปลี่ยนแปลงสิ่งนั้นหากคุณต้องการบอกแอพพลิเคชั่น ( xterm, vi... ) ซึ่งคุณต้องการให้เชลล์ใดเป็นเชลล์ที่คุณต้องการ zshเป็นผู้รับผิดชอบสำหรับการตั้งค่า$ZSH_VERSIONและไม่กี่เอกสารตัวแปรเปลือกพิเศษ $SHELLแต่มันไม่ได้สัมผัส
Stéphane Chazelas

@ StéphaneChazelasนั่นเลอะเทอะฉันขอบคุณสำหรับการแก้ไข
คาเลบ

ขอบคุณสำหรับสิ่งนี้มันทำให้ฉันมองหาวิธีkonsoleตั้งค่า TERM แทนที่จะใส่ไว้ใน bashrc ของฉัน พบว่ามันตั้งอยู่ในแท็บทั่วไปของโปรไฟล์, เปลี่ยนจากxtermเป็นxterm-256color
Mike Lippert

น่าสังเกตว่าภายใต้ vanilla deb10 ของฉันติดตั้งรายงานเทอร์มินัล GNOME truecolorแทนที่จะgnome-terminalเป็น$COLORTERMเช่นนั้นกลไกการตรวจจับข้างต้นอาจไม่ทำงาน XTERM ดูเหมือนจะไม่ตั้งค่านี้เลยมันอาจจะถูกต้องเพื่อตรวจสอบค่าใด ๆ คำนี้มีการกล่าวถึงบางส่วนในกระทู้นี้ซึ่งอาจเป็นที่อื่น ๆ : gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson

8

ใน. zshrc ของคุณใส่

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

และภายใน. tmux.conf ของคุณ

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

2
หรือ [[ $TMUX != "" ]] && export TERM="screen-256color" ด้วยวิธีนี้ zsh จะตั้งค่าเฉพาะเมื่อมีการโทรภายในเซสชัน tmux
Titou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.