ด้วย Bash + iTerm2 จะตั้งชื่อแท็บได้อย่างไร?


176

ใน iTerm2 (Build 1.0.0.20120203) ฉันมักจะเปิดหลายแท็บซึ่งแต่ละอันมีบานหน้าต่างแยกและเป็นหนึ่งในธีมเฉพาะของงานเช่นการควบคุมการแก้ไขการเข้ารหัสการจัดการไฟล์เทอร์มินัล mysql โดยทั่วไปฉันต้องสลับระหว่างแท็บ 5 แท็บขึ้นไปในโฟลว์งานของฉัน บางครั้งมันก็ยากที่จะจำหรือบอกได้ว่ามันคืออะไรโดยดูจากเนื้อหาของหน้าจอ ฉันต้องการตั้งชื่อแท็บอย่างใดอย่างหนึ่งเพื่อให้ฉันสามารถบอกได้อย่างรวดเร็วซึ่งเป็นที่โดยการจ้องมองอย่างรวดเร็ว เป็นไปได้ไหม


1
อาจเป็นไปได้ซ้ำกับชื่อเปลี่ยนหน้าต่างและแท็บ iTerm2 ใน zsh
Daniel Beck

ไม่ซ้ำกันทั้งหมด ดังนั้นวิธีเพิ่มแอปที่รันอยู่ในปัจจุบันเป็นส่วนหนึ่งของชื่อแท็บ แท็บใดที่กำลังใช้ emacs, mysql เป็นต้น?
qazwsx

1
เช่นแท็บทั้งหมดของฉันมีโฮสต์และผู้ใช้เดียวกัน ดังนั้นการใช้สิ่งเหล่านี้จะไม่ทำให้แท็บของฉันแตกต่าง
qazwsx

คุณหมายถึงคุณต้องการแสดงชื่องานปัจจุบันจากการตั้งค่าของ iTerm หรือไม่? โปรดทราบว่าหัวข้อที่ลิงก์ไม่เกี่ยวข้องกับชื่อผู้ใช้หรือโฮสต์
Daniel Beck

ใช่ฉันต้องการแสดงสิ่งที่โปรแกรมกำลังทำงานหรือทำงานในแต่ละแท็บ นอกจากนี้โซลูชันที่ให้ไว้ในโพสต์อื่น ๆ จะไม่ทำงานสำหรับ Bash + iTerm2
qazwsx

คำตอบ:


212

เนื่องจากคุณกำลังใช้ iterm2 บน mac เป็นอีกทางเลือกหนึ่งคือคุณก็สามารถตีพิมพ์อะไรบางอย่างและตีCmdIESC

โซลูชันเทอร์มินัลนั้นเร็วกว่านี้เล็กน้อย แต่ต้องการแจ้งให้คุณทราบ


11
ใช้งานได้หนึ่งวินาทีจนกว่าฉันจะส่งคืนสินค้าบนแท็บที่ฉันได้เปลี่ยนชื่อ
Stewie

15
@Stewie ในการตั้งค่า -> โปรไฟล์ -> เทอร์มินัลให้ยกเลิกการเลือก "อนุญาตให้เทอร์มินัลรายงานชื่อหน้าต่าง"
Max Cantor

3
มันไม่ถูกตรวจสอบ มันยังคงเปลี่ยนชื่อ
Stewie

6
@ SteveBennett ไม่ใช่ "ธีม" (จริงๆแล้วคำว่า "โปรไฟล์") นั้นเป็นของตัวเอง คำสั่ง CMD + I คือ "แก้ไขเซสชันปัจจุบัน ... " (ใต้เมนูมุมมอง) ดังนั้นมันจึงเป็นการเปลี่ยนอินสแตนซ์ของแท็บโปรไฟล์ Hitting Escape เพียงปิดหน้าต่างซึ่งจำเป็นเนื่องจากหน้าต่างนั้นไม่มีปุ่ม "บันทึก" อยู่
MidnightLightning

4
ถ้าคุณเปิดหลายบาน คุณต้องเปลี่ยนชื่อแต่ละชื่อเพื่อตั้งชื่อแท็บเองทั้งหมดหรือไม่
Theicfire

119

ฉันได้พบฟังก์ชั่นต่อไปนี้ที่วางไว้ในของฉัน~/.bashrcจะเป็นประโยชน์:

function title {
    echo -ne "\033]0;"$*"\007"
}

จากนั้นฉันสามารถโทรจาก bash prompt ของฉันดังนี้

> title I want a pony!

และแท็บของฉันได้รับชื่อตาม


1
ฉันลองสิ่งนี้ แต่ก็ยังใช้งานไม่ได้ ฉันใส่คำจำกัดความนี้bash_aliasesแล้วโหลดเข้าไป.profile( if [ -f ${HOME}/.bash_aliases ]; then . ${HOME}/.bash_aliases fi) แต่title dogไม่เปลี่ยนชื่อแท็บเป็น "dog"
qazwsx

2
+1 - ฉันเพิ่มของฉันลงใน / etc / โปรไฟล์เพียงเพราะนั่นคือสิ่งที่ชื่อแทนของฉันคือ ... อย่าลืมที่จะแหล่งไฟล์หลังจากที่คุณทำเสร็จแล้ว หมายเหตุ: สามารถใช้งานได้ในเทอร์มินัล
blak3r

3
มีประโยชน์มาก ฉันต้องการม้า และฉันได้หนึ่ง!
SoEzPz

1
ฉันใส่ของฉันไว้ใน. bash_profile เริ่มต้นใหม่และทำงานได้เหมือนมีเสน่ห์
C Johnson

1
คนที่คิดว่ามันไม่ทำงานเพราะคำสั่งของคุณเปลี่ยนทันที ลองtitle dog && sleep 5แล้วคุณจะเห็นว่ามันใช้งานได้ จดคำตอบจาก @schpet เพื่อตอบคำถามนี้
มิคาอิล

45

เรียกใช้คำสั่งนี้เพื่อตั้งชื่อของแท็บหรือหน้าต่าง:

export PROMPT_COMMAND='echo -ne "\033]0;YOUR NAME HERE\007"'

ฉันได้เพิ่มสิ่งต่อไปนี้ในของฉัน~/.bash_profileเพื่อแสดงรายการไดเรกทอรีปัจจุบันที่สัมพันธ์กับ dir บ้านของฉัน:

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

มีประโยชน์เมื่อคุณมีเทอร์มินัลลดขนาด 100 ตัวใน Dock

หมวกปลายสู่โลกแม็ค


การหลบหนีจากคำสั่งการส่งออกนั้นไม่ได้ผลกับ bash ของฉันด้วยเหตุผลบางอย่าง (v5.0.7) นี่คือสิ่งที่ใช้ได้กับฉัน:export PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/\~}\007"'
Mike Fogel

18

ฉันใช้วิธีแก้ปัญหาที่คล้ายกับข้างบนมาระยะหนึ่งแล้ว แต่ฉันใช้แท็บมากพอที่ฉันต้องการให้โค้ดสีสำหรับการอ้างอิงด้วยภาพง่าย ๆ ดังนั้นผมจึง whipped up tabsetยูทิลิตี้การตั้งชื่อแท็บป้ายและสีขึ้นอยู่กับชนิดของงานที่ฉันทำในแต่ละแท็บ

ตัวอย่าง

มันต้องมีโหนดแต่ตอนนี้เป็นแพลตฟอร์มที่ติดตั้งทั่วไป ติดตั้ง:

npm install -g iterm2-tab-set

นี่มันเจ๋งมาก! ฉันชอบการตั้งค่าสีแท็บอัตโนมัติ ขอขอบคุณ!
Ashutosh Jindal

1
ว้าว! นี่เป็นเครื่องมือที่ยอดเยี่ยม!
dmulvi

ขณะนี้ฉันใช้วิธีนี้แทนวิธีที่อธิบายไว้ในคำตอบที่ยอมรับ (<kbd> Cmd </kbd> <kbd> ฉัน </kbd> พิมพ์บางสิ่งบางอย่างแล้วกด <kbd> ESC </kbd>)
qazwsx

but that is now a commonly installed platformฮ่า ๆ ๆ ๆ ๆ ๆ ๆ ๆ ๆ ๆ ...... เดี๋ยวก่อนคุณจริงจังเหรอ?
ชื่อปลอม

ใช่จริงจัง ผู้พัฒนาและผู้พัฒนา DevOps ทุกวันนี้กลุ่มเป้าหมายที่เป็นธรรมชาติของแอพพลิเคชั่นเทอร์มินัลมีการติดตั้ง node.js หรือสามารถติดตั้งได้ง่าย ผู้ที่ไม่สามารถ / ไม่สามารถยินดีที่จะถอยกลับไปสู่วิธีการที่ใช้ bash / zsh / ฯลฯ
Jonathan Eunice

16

เพิ่มฟังก์ชั่นนี้ลงใน~/.bash_profileไฟล์ของคุณและควรใช้งานได้

function title ()
{
    TITLE=$*;
    export PROMPT_COMMAND='echo -ne "\033]0;$TITLE\007"'
}

7

ฉันชอบอันนี้:

#setup terminal tab title
function title {
    if [ "$1" ]
    then
        unset PROMPT_COMMAND
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
    fi
}
title

มันจะช่วยให้คุณสลับชื่อแท็บระหว่างชื่อที่กำหนดเองและค่าเริ่มต้นของ CWD ของคุณ

title -> ชื่อแท็บของคุณจะเป็น ~/YOUR_CWD/

title hey there -> ชื่อแท็บของคุณจะเป็น hey there


โปรดทราบว่าตามที่เป็นอยู่นี้จะขัดขวางการรวมเชลล์ iTerm
Michael

5

ฉันชอบคำตอบของ taylorstineแต่มันก็หยุดการรวมเชลล์ของ iTerm2 ซึ่งขึ้นอยู่กับPROMPT_COMMANDตัวแปร คุณสามารถแก้ไขโค้ดของ Taylor เพื่อแก้ไขสิ่งนี้ได้โดยเพิ่ม__bp_precmd_invoke_cmdกลับเข้าไปในPROMPT_COMMANDเวลาใดก็ได้ที่คุณคนจรจัดด้วย:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
    if [ "$1" ]
    then
        export PROMPT_COMMAND='__bp_precmd_invoke_cmd'
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/\~}\007";__bp_precmd_invoke_cmd'
    fi
}
title

3

ฉันชอบคำตอบของไมเคิล

แต่ถ้า.iterm2_shell_integration.bashไม่มีอะไรล่ะ

นี่คือของฉัน:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
  if [ "$1" ] ; then
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='iterm2_preexec_invoke_cmd' \
      || unset PROMPT_COMMAND
    echo -ne "\033]0;${*}\007"
  else
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007";iterm2_preexec_invoke_cmd' \
      || export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
  fi
}
title

1
โปรดทราบว่าใน v3.1 iterm2_preexec_invoke_cmdได้กลายเป็น__bp_precmd_invoke_cmd
ไมเคิล

2

หากคุณกำลังทำงานกับ Profiles (ซึ่งสะดวกมาก): การตั้งค่า -> ลักษณะที่ปรากฏ -> ชื่อหน้าต่างและแท็บ: ทำเครื่องหมาย 'แสดงชื่อโปรไฟล์':

ภาพ

นั่นเป็นวิธีที่จะดูแล:

ภาพขนาดย่อเชื่อมโยงกับภาพหลัก


2
Preferences -> Profiles -> Terminal
  uncheck Terminal may set Tab/Window title

ความคิดเห็นของแม็กซ์คันทอร์ทำงานให้ฉัน


1

ฉันคิดว่าการเปลี่ยนโปรไฟล์อัตโนมัติและตราสัญลักษณ์นั้นได้รับการออกแบบมาสำหรับสิ่งที่คุณต้องการ

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

ป้าย คุณสามารถใส่ตราสัญลักษณ์ที่ด้านบนขวาของเทอร์มินัลของคุณเพื่อแสดงข้อมูลเกี่ยวกับเซสชันปัจจุบัน มันสามารถแสดงชื่อผู้ใช้ชื่อโฮสต์หรือแม้แต่ข้อมูลที่กำหนดเองเช่นสาขา git ปัจจุบัน

ดังนั้นผลลัพธ์อาจเป็นเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่


โปรดอ้างอิงส่วนสำคัญของคำตอบจากลิงค์อ้างอิงเนื่องจากคำตอบอาจไม่ถูกต้องหากหน้าเชื่อมโยงมีการเปลี่ยนแปลง
DavidPostill

0

ฉันต้องการขยายคำตอบของบีเซเว่นเล็กน้อยเพื่อความกระจ่างใสแน่นอน

เนื่องจากเราส่วนใหญ่ต้องการทราบว่าจะตั้งชื่อแท็บได้อย่างไรแม้ว่าจะไม่ได้อยู่ในเชลล์ท้องถิ่นแทนที่จะเป็นเชลล์ระยะไกล (เช่นมากกว่าเชลล์)

ขั้นตอนที่ 1. Preferences -> Profiles -> Terminal uncheck Terminal may set Tab/Window title

ขั้นตอนที่ 2 สำหรับแต่ละแท็บ double click on the tab -> Session Title

ทีนี้ไม่ว่าคุณจะตั้งชื่ออะไรในเซสชั่น


-2

ยุกนามแฝงและฟังก์ชั่นเหล่านั้นทั้งหมด วิธีแก้ปัญหาที่ง่ายกว่า (ถ้าคุณรูท) ให้วางลงในเทอร์มินัล:

TARGET=/usr/bin/title
sudo tee "$TARGET" <<'EOF'
#!/usr/bin/env bash
echo -ne "\033]0;$*\007"
EOF
sudo chmod 755 "$TARGET"

หรือเพียงแค่ตั้งชื่อไฟล์จากที่ใดที่หนึ่งในเส้นทางของคุณหรือเส้นทางทั่วโลกแล้ววางสองบรรทัดระหว่าง EOF


12
"ยุกกับนามแฝงเหล่านั้นทั้งหมด" ผู้ตอบไม่สามารถจดจำหรือพิมพ์ด้วยมือได้
Dan

1
@Dan ไม่ได้บอกว่านี้เป็นที่ดีเพียงว่ามีความจำเป็นที่ต้องจำไว้ว่าเพราะมันเป็นเพียงแค่การสร้างสคริปต์ที่เรียกว่าในtitle /usr/bin
Emile Bergeron

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