วิธีการเปลี่ยนชื่อของหน้าต่างมิ้นต์?


35

MinTTY เป็นคอนโซลเริ่มต้นใหม่สำหรับ Cygwin

คำสั่งเชลล์คืออะไร (สิ่งที่ฉันสามารถใส่ใน. bashrc หรือดีกว่าใน. zshrc) เพื่อเปลี่ยนชื่อของหน้าต่าง MinTTY?

ฉันต้องการชื่อเรื่องของหน้าต่างเพื่อเป็นเส้นทางไปยังไดเรกทอรีปัจจุบันและได้รับการปรับปรุงเมื่อฉันสลับไดเรกทอรีภายในคอนโซล


1
การตั้งค่าพรอมต์เริ่มต้นของ Cygwin (เช่น$PS1) มีลำดับการควบคุมที่ตั้งชื่อหน้าต่างเป็น user @ machine: working_directory
ak2

MSYS2_packages / ระบบไฟล์ที่ผ่านมากระทำ 6e6310d (ระบบไฟล์: ตัวแปรเฉพาะใหม่ MSYS2_PS1, 2016-05-01) แนะนำสคริปต์พรอมต์ MSYS2_PS1 ซึ่งช่วยให้การกำหนดค่า Cygwin / MSYS2 แตกต่างกัน ผมเคยเสนอปรับแต่งเพื่อให้แน่ใจว่าใด ๆ PS1 ที่มีอยู่มีความสำคัญกลางgithub.com/Alexpux/MSYS2-packages/pull/651 หวังว่านี่จะช่วยได้
Philip Oakley

@Philip (ข้อความจากตนเอง) การปรับแต่งนั้นได้พิสูจน์แล้วว่ามีการถกเถียงและมีการเพิ่ม tweaks เพิ่มเติม (หรือลบออก) เพื่อสร้างการแก้ไขที่ทำงานได้ขั้นต่ำที่ครอบคลุมการใช้งานที่แตกต่างกัน
Philip Oakley

1
ที่เกี่ยวข้องหากคุณต้องการชื่อคงที่เช่น"Cygwin i686"หรือ"Cygwin x86_64"คุณสามารถใช้-T <title>คุณสมบัติทางลัดของ Windows ได้ mintty man pageยังเห็น
jww

คำตอบ:


50

เกิดอะไรขึ้น

คำสั่งต่อไปนี้ไม่ทำงานสำหรับฉัน:

echo -ne "\e]0;MYTITLE\a"

ปรากฎว่าการติดตั้ง Cygwin ที่เป็นค่าเริ่มต้นของฉันรวมถึงการกำหนดพรอมต์ต่อไปนี้ใน. bashrc:

PS1=\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$

โปรดทราบว่าส่วนแรกของพรอมต์ ( \e]0;\w\a) กำลังตั้งค่าชื่อหน้าต่างทุกครั้งที่มีข้อความปรากฏขึ้น

การแก้ไขปัญหา

เพิ่มบรรทัดเหล่านี้ในของคุณ.bashrcที่กำหนด 2 ฟังก์ชั่น:

function settitle() {
      export PS1="\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
      echo -ne "\e]0;$1\a"
}
function settitlepath() {
      export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
}

จากนั้นคุณสามารถตั้งชื่อแบบกำหนดเองด้วยคำสั่งนี้:

settitle "MYWonderfullTest here"

หรือคุณสามารถเปลี่ยนกลับไปใช้ค่าเริ่มต้นของ cygwin (เส้นทางปัจจุบัน) ด้วยคำสั่งนี้:

settitlepath

หวังว่านี่จะช่วยได้


1
เยี่ยมมากแก้ปัญหา PS1 ที่ผู้ใช้ส่วนใหญ่จะใช้ด้วยการตั้งค่า cygwin เริ่มต้น
Markku K.

3
ควรได้รับการยอมรับว่าเป็นคำตอบเพราะมันทำงานได้อย่างสมบูรณ์แบบซึ่งแตกต่างจากคำตอบที่ได้รับการโหวตสูงสุด
ปานจันทรา

1
ฉันรักคำตอบที่ฉันสามารถตัดและวางได้ และยังอธิบายอย่างชัดเจนว่าปัญหาคืออะไร
Darrel Lee

ฟังก์ชั่นเหล่านั้นใช้งานได้ดีสำหรับฉัน! โปรดจำไว้ว่าสำหรับ cygwin เพื่อโหลด. bashrc ของคุณใหม่คุณจะต้องรีสตาร์ท cygwin หรือเขียนsource ~/.bashrc- cygwin อื่นจะยังคงใช้ bashrc เวอร์ชันเก่าที่อยู่บนดิสก์เมื่อเริ่ม cygwin - ทดสอบแล้วCygwin version 2.8.1 (64 bit)- เวอร์ชั่น 2017
hanshenrik

ทำไมคำตอบนี้ไม่เคยยอมรับ
asmith

26

คุณสามารถเปลี่ยนได้ด้วยลำดับการควบคุม xterm สำหรับสิ่งนี้:

echo -ne '\e]0;Title\a'

อ้างถึง: http://code.google.com/p/mintty/issues/detail?id=241


4
ไม่มีผลกับฉัน: / อาจเป็นเพราะเคล็ดลับนี้พังในช่วง 6 เดือนที่ผ่านมา?
voltrevo

คุณใช้ทุบตีหรือไม่
James Fu

2
มันไม่มีผลเมื่อออกจากภายในหน้าจอ
ЯрославРахматуллин

10
อาจเป็นปัญหาได้ว่ามีการกำหนดค่าพรอมต์คำสั่งให้อัปเดตชื่อ (สำหรับ exmaple กับพา ธ ปัจจุบัน) ดังนั้นคำสั่งใช้งานได้ แต่มันจะถูกแทนที่ทันทีโดยพรอมต์
Andrea Polci

2
หากต้องการทดสอบ "echo -ne '\ e] 0; Title \ a' && cat" วิธีนี้จะป้องกันไม่ให้พรอมต์รีเซ็ตทันที (ถ้างานนั้นคุณสามารถปรับเปลี่ยน PS1 ในโปรไฟล์ของคุณตามที่อธิบายไว้ในคำตอบอื่น ๆ )
เคอร์ติ Yallop

3

วางสิ่งนี้ใน. zshrc:

# Change title of MinTTY to current dir
function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function chpwd() {
    settitle $(cygpath -m `pwd`)
}

ลำดับของอักขระพิเศษในการชำระฟังก์ชันทำให้ MinTTY เปลี่ยนชื่อเรื่องของหน้าต่าง

ในzshถ้าคุณกำหนดฟังก์ชั่นที่มีชื่อ chpwd พิเศษก็จะถูกเรียกหลังจากแต่ละ chdir

ทำงานบน WinXP โดยใช้ Cygwin 1.7 และ MinTTY ที่ทำงาน zsh


ยังทำงานใน WSL (ลบสิ่ง cygpath ของหลักสูตร): settitle "$(pwd)@$HOST"
zzxyz

2

ใน bash ตัวแปร PROMPT_COMMAND สามารถตั้งค่าให้เก็บคำสั่งจำนวนหนึ่งคั่นด้วยเครื่องหมายอัฒภาค คุณสามารถใช้การตั้งค่าชื่อเดียวกันกับที่อธิบายไว้ในการตอบกลับอื่น ๆ ที่พูดถึง zsh


2
1) echo $ PS1 และคัดลอกสตริงนั้นไปยังคลิปบอร์ดหรือโปรแกรมแก้ไขข้อความตามที่
   echo $ PS1
2) แก้ไข ~ / .bash_profile และเพิ่มรหัสเชลล์ด้านล่างแทนที่ $ PS1 ตามความจำเป็น แต่ให้ตัวแปร $ {TERMINAL_TITLE} อยู่ในสภาพ "false"
3) บันทึกไฟล์และตั้งค่าตัวแปรสภาพแวดล้อม TERMINAL_TILE ดังเช่น
   ส่งออก TERMINAL_TITLE = "ชื่อที่กำหนดเองของฉัน"
4) แหล่งที่มาของโปรไฟล์ทุบตีของคุณเช่นเดียวกับใน
   . ~ / .bash_profile
สนุก

ถ้า [-z "$ {TERMINAL_TITLE}"]
แล้วก็
  PS1 = '\ [\ e] 0; \ w \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \] \ n \ $ '
อื่น
  PS1 = '\ [\ e] 0; $ {TERMINAL_TITLE} \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \ ] \ n \ $ '
Fi

1

ฉันใช้คำตอบของลีโอเนล แต่ฉันพบว่าชื่อเรื่องจะสั่นไหวเมื่อทำสิ่งนี้ซึ่งหมายความว่าอย่างน้อยคำสั่ง echo จะทำงานตามที่ตั้งใจไว้ ฉันรัน zsh แบบโต้ตอบโดยใช้โหมดดีบักโดยใช้

zsh -xv

การเปลี่ยนไดเรกทอรีจะเรียกใช้ฟังก์ชันอื่นที่เรียกว่าtitle()after precmd()และchpwd()แทนที่อย่างมีประสิทธิภาพ ดังนั้นฉันจึงเสียบเข้ากับ. zshrc ของฉันและใช้งานได้

function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}

หากคุณชอบที่จะใช้chpwd()หรือแทนเพียงแค่ปิดการใช้งานฟังก์ชั่นชื่อ:precmd()title(){}


1

แค่อยากแบ่งปันวิธีแก้ปัญหาของฉันเมื่อฉันใช้มินต์ตี้เพื่อรันสคริปต์

ทางลัด mintty ของฉันตั้งค่าเป็น:

C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /usr/bin/bash.exe -l -c /scripts/connect.sh

สคริปต์ connect.sh ที่ฉันเขียนซึ่งเรียกว่าในทางลัดด้านบนจะแจ้งให้ฉันสำหรับเซิร์ฟเวอร์ที่ฉันต้องการเชื่อมต่อและเรียกใช้ฟังก์ชั่นการตั้งชื่อที่กำหนดไว้ในสคริปต์

connect.sh

#!/bin/bash

echo "Enter servername when prompted"
echo -n "servername: " 
read servername
function settitle() {
    echo -ne "\033]2;"$servername"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}
settitle
ssh my_username@$servername

ทำไมคุณถึงกำหนดฟังก์ชั่นtitleถ้าคุณไม่ได้ใช้?
pabouk

0

ลองเพิ่มสิ่งนี้ลงใน. bash_profile

export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}:${PWD/#$HOME/~}\007"'

มันใช้งานได้สำหรับฉัน


2
คำถามเกี่ยวกับการเปลี่ยนชื่อหน้าต่างไม่ใช่พรอมต์คำสั่ง
kenorb

1
โปรดเพิ่มสิ่งนี้ลงใน. bash_profile มันก็โอเคสำหรับชื่อการเปลี่ยนแปลงขอบคุณ!
netawater
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.