ตั้งชื่อเรื่องของหน้าต่างเทอร์มินัลเป็นไดเรกทอรีปัจจุบัน


71

ฉันจะรับ Terminal.app ใน OS X เพื่อแสดงไดเรกทอรีปัจจุบันในหน้าต่างหรือชื่อแท็บได้อย่างไร

ฉันใช้เปลือกทุบตี


ฉันมักจะสงสัยว่าทำไมไม่แม้แต่คนที่ตอบคำถามอย่าลืมโหวตมันขึ้นมา
cregox

คำตอบ:


60

ขึ้นอยู่กับเปลือกของคุณ

นี้บทความแสดงหลายวิธี

ฉันเองใช้ zsh ซึ่งมีฟังก์ชั่น precmd () ที่สะดวกซึ่งจะทำงานก่อนการแจ้งแต่ละครั้ง

    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt

แม้ว่าคำถามอื่น ๆ รายการวิธีทุบตีพวกเขานามแฝง cd Bash จัดให้มีวิธีการที่แฝงอยู่ซึ่งเชื่อมโยงกับพรอมต์

ทุบตี

bash ระบุตัวแปร PROMPT_COMMAND ซึ่งมีคำสั่งให้เรียกใช้งานก่อนหน้าพรอมต์ ตัวอย่างนี้ (แทรกใน ~ / .bashrc) ตั้งชื่อเป็น "ชื่อผู้ใช้ @ hostname: ไดเรกทอรี":

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

โดยที่ \ 033 เป็นรหัสอักขระสำหรับ ESC และ \ 007 สำหรับ BEL โปรดทราบว่าการอ้างอิงมีความสำคัญที่นี่: ตัวแปรถูกขยายใน "... " และไม่ได้ขยายใน '... ' ดังนั้น PROMPT_COMMAND จะถูกตั้งค่าเป็นค่าที่ไม่ขยาย แต่ตัวแปรภายใน "... " จะถูกขยายเมื่อใช้ PROMPT_COMMAND

อย่างไรก็ตาม PWD จะสร้างพา ธ ไดเร็กทอรีแบบเต็ม หากเราต้องการใช้ชวเลข '~' เราจำเป็นต้องฝังสตริง escape ในพร้อมต์ซึ่งช่วยให้เราสามารถใช้ประโยชน์จากการขยายพรอมต์ต่อไปนี้โดยเชลล์:

\u          expands to $USERNAME
\h          expands to hostname up to first '.'
\w          expands to directory, replacing $HOME with '~'
\[...\]     embeds a sequence of non-printing characters

ดังนั้นต่อไปนี้จะสร้างพรอมต์ของ "bash $" และชื่อ xterm ของ "username @ hostname: directory" ...

 case $TERM in
     xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
     *)
        PS1="bash\$ "
        ;;
 esac

สังเกตการใช้ [... ] ซึ่งแจ้งให้ bash ละเว้นอักขระควบคุมที่ไม่พิมพ์เมื่อคำนวณความกว้างของพรอมต์ มิฉะนั้นคำสั่งแก้ไขบรรทัดจะสับสนขณะวางเคอร์เซอร์


ควรจะกล่าวถึงว่าฉันกำลังใช้ bash ฉันได้อัปเดตคำถามแล้ว
kareman

เพิ่มเมธอด bash จากลิงก์ที่แสดงรายการ
Darren Hall

1
ดีมาก. เพื่อให้ได้เพียงเส้นทางไปยังไดเรกทอรีปัจจุบันในชื่อและชื่อของไดเรกทอรีปัจจุบันในพรอมต์ฉันเพิ่งใช้ PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $"
kareman

1
"ถ้าเราต้องการใช้ '~' ชวเลขและเราต้องฝังสตริง escape ในพร้อมท์" คุณสามารถใช้สิ่งต่อไปนี้เพื่อแทนที่ชื่อพา ธ ของโฮมไดเร็กตอรี่เต็มด้วยตัวหนอน: $ {PWD / # $ {HOME} / \ ~}
Chris Page

1
@ MattTagg แน่นอนว่าคุณต้องใส่มันลงใน~/.profileไฟล์ (หรือเทียบเท่า) บนเครื่องระยะไกล
coredumperror

32

คัดลอกและวางลงในไฟล์ ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

สิ่งนี้จะตั้งชื่อของแท็บเทอร์มินัลปัจจุบันเป็นชื่อของโฟลเดอร์ที่คุณอยู่ (ไม่ใช่พา ธ ทั้งหมด)
ดังนั้น ...
Developer/Applications/Utilities/Bluetooth/กลายเป็น =>Bluetooth


3
ใน mavericks ไฟล์ที่จะแก้ไขคือ ~ / .bash_profile
Tom

11

ในฐานะของ Mac OS X Lion 10.7 เทอร์มินัลมีลำดับการหลีกเลี่ยงที่ชัดเจนสำหรับการตั้งค่าไดเรกทอรีการทำงานซึ่งเทอร์มินัลแสดงโดยใช้ไอคอน "พร็อกซี" หน้าต่างมาตรฐาน สิ่งนี้ช่วยให้คุณสามารถคลิกคำสั่งเพื่อดูเส้นทางเปิดเผยใน Finder หรือลากมันเหมือนกับโฟลเดอร์อื่น ๆ นอกจากนี้เทอร์มินัลสามารถใช้สิ่งนี้เพื่อสร้างเทอร์มินัลอื่นในไดเรกทอรีเดียวกันและเพื่อกู้คืนไดเร็กทอรีการทำงานเมื่อออกจาก / รีสตาร์ทเทอร์มินัล (เมื่อเปิดใช้งาน Resume) นอกจากนี้ยังช่วยให้กู้คืนไดเรกทอรีสำหรับกลุ่มหน้าต่าง

เป็นลำดับการหลีกเลี่ยงระบบปฏิบัติการ (OSC) เดียวกันกับชื่อหน้าต่างและแท็บ แต่ด้วยพารามิเตอร์แรกที่ตั้งค่าเป็น 7 ค่าควรเป็น "ไฟล์:" URL ซึ่งเปิดใช้งานอักขระพิเศษที่เข้ารหัสเปอร์เซ็นต์เพื่อให้สามารถจัดการได้ ชื่อพา ธ ที่ถูกต้องทั้งหมด คุณควรรวมชื่อโฮสต์เพื่อให้เทอร์มินัลสามารถตรวจสอบว่าเป็นไดเรกทอรีท้องถิ่นหรือไม่ เทอร์มินัลจะหลีกเลี่ยงการใช้มันเป็นไดเรกทอรีการทำงานปัจจุบันหากมาจากโฮสต์ที่แตกต่างกัน

ในบันทึกที่เกี่ยวข้องเทอร์มินัลก็สนับสนุนการตั้งค่า "ไฟล์แทน" โดยใช้ลำดับการหลบหลีกของ OSC ด้วยพารามิเตอร์ 6 หากตั้งค่าไอคอนพร็อกซีจะแสดงสิ่งนี้แทนไดเรกทอรีทำงาน ตัวอย่างเช่นฉันมี emacs และกำหนดค่าน้อยลงเพื่อแสดงไฟล์ / บัฟเฟอร์ที่แสดงในปัจจุบันในไอคอนพร็อกซี สิ่งนี้ทำให้โปรแกรมที่ใช้ tty เหล่านี้สามารถผนวกรวมกับระบบปฏิบัติการโดยรอบได้มากขึ้น

พฤติกรรมไดเรกทอรีการทำงานถูกเปิดใช้งานโดยค่าเริ่มต้นสำหรับทุบตี (เปลือกเริ่มต้นใน Mac OS X) ดู / etc / bashrc สำหรับรหัสที่เกี่ยวข้อง

นอกจากนี้ยังเป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าขณะนี้ Lion Terminal รองรับการตั้งค่าชื่อแท็บอย่างอิสระจากหัวเรื่องหน้าต่างโดยใช้ลำดับการหลบหลีกของ OSC


update_terminal_cwdฟังก์ชั่นจะตั้งไอคอนพร็อกซี่เพื่อไดเรกทอรีการทำงานปัจจุบัน โดยค่าเริ่มต้นคือ$PROMPT_COMMAND update_terminal_cwd
jtbandes

@ jtbandes นั่นคือสิ่งที่ฉันอ้างถึงเมื่อฉันเขียน“ พฤติกรรมไดเรกทอรีการทำงานถูกเปิดใช้งานโดยค่าเริ่มต้นสำหรับทุบตี…”
Chris หน้า

อ๋อ ฉันเพิ่งค้นพบวิธีการทำงานและคิดว่ามันอาจจะมีประโยชน์สำหรับผู้ใช้ Google ในอนาคต!
jtbandes

3

นอกเหนือจากการแนะนำให้คุณใช้ลำดับการหลีกเลี่ยงคำสั่งระบบปฏิบัติการเฉพาะของ Apple Terminal: ESC ] Ps ; Pt BELที่Psใด7และPtเป็นfile:URL; เป็นมูลค่าเพิ่มที่ใน Mac OS X 10.11 (และอาจตั้งแต่ 10.7) มีไฟล์/etc/bashrc_Apple_Terminal(ไม่มีการแก้ไขภายใต้ 10.11) ซึ่งกำหนดความสะดวกupdate_terminal_cwd()เป็น (โดยไม่ต้องแสดงความคิดเห็น):

update_terminal_cwd () 
{ 
    local url_path='';
    { 
        local i ch hexch LC_CTYPE=C LC_ALL=;
        for ((i = 0; i < ${#PWD}; ++i))
        do
            ch="${PWD:i:1}";
            if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
                url_path+="$ch";
            else
                printf -v hexch "%02X" "'$ch";
                url_path+="%${hexch: -2:2}";
            fi;
        done
    };
    printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}

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

และถ้าคุณเปลี่ยนPROMPT_COMMANDด้วยตัวคุณเอง.bash_profileหรือ.bashrcคุณอาจลืมที่จะเรียกสิ่งนี้ ในไฟล์เดียวกันพวกเขาแสดงตัวอย่างของการผูกมัดมันได้ดีขึ้นด้วย:

PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

โดยส่วนตัวในฉัน.bash_profileฉันต้องการเพิ่มพรอมต์ git ดังนั้นฉันทำสิ่งนี้:

local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
  if [[ -f "$f" ]]; then
    . "$f"
  fi
done
get_sha() {
    git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
    export GIT_PS1_SHOWDIRTYSTATE=1
    GIT_PS1_SHOWSTASHSTATE=1
    GIT_PS1_SHOWUNTRACKEDFILES=1
    GIT_PS1_SHOWCOLORHINTS=1
    GIT_PS1_DESCRIBE_STYLE="branch"
    GIT_PS1_SHOWUPSTREAM="auto git"
    export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi

1

วิธีแก้ไขปัญหา Bash ที่เกี่ยวข้องกับ PS1 และ PROMPT_COMMAND ทั้งสองล้มเหลวหากไดเรกทอรีมีอักขระ Unicode อยู่ (อย่างน้อยใน Snow Leopard) ทางออกที่ดีที่สุดที่ฉันจะทำได้คือทำสิ่งที่เทียบเท่า

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "

น่าเสียดายที่นี่ใช้งานไม่ได้ดังนั้นฉันจึงกำหนดฟังก์ชันเชลล์เพื่อtrโทรออกแทน:

termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "

วิธีนี้ใช้งานได้ดีสำหรับสำเนียงละตินซึ่งจะอยู่ใน Unicode NFD (สำเนียงจะหายไป แต่ตัวอักษรละตินพื้นฐานจะยังคงอยู่)

น่าเสียดายที่มันจะล้มเหลวอย่างสิ้นเชิงสำหรับสิ่งต่างๆเช่นจีน


ในฐานะของ Mac OS X Lion 10.7 เทอร์มินัลมีลำดับการหลีกเลี่ยงที่ชัดเจนสำหรับการตั้งค่าไดเรกทอรีทำงาน มันใช้ URL ดังนั้นคุณสามารถใช้การเข้ารหัสเปอร์เซ็นต์สำหรับอักขระพิเศษและสนับสนุนชื่อพา ธ ที่ถูกต้องทั้งหมด ดูคำตอบของฉันสำหรับคำถามนี้เพื่อดูรายละเอียด
Chris หน้า

1

สมมติว่าคุณใช้เทอร์มินัล MAC เริ่มต้นคุณสามารถใช้สิ่งต่อไปนี้ใน. profile เนื่องจาก "set_prompt" ด้วยตัวเองอาจส่งคุณไปยังโฟลเดอร์รูทเมื่อคุณเปิดแท็บใหม่:

set_prompt () {
    BASE_PATH="${PWD##*/}"
    echo -ne "\033]0;$BASE_PATH\007"
}
set_my_tab () {
   update_terminal_cwd
   set_prompt
}

PROMPT_COMMAND=set_my_tab

0

ป้อนสิ่งนี้ลงในไฟล์ ~ / .profile หรือไฟล์ที่เทียบเท่าของคุณ:

function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }

export PS1='\W \$ '

settitle `pwd`

บรรทัดแรกมีสองตัวละครพิเศษที่ไม่สามารถคัดลอก / วาง แต่คุณสามารถดาวน์โหลดข้อความจากที่นี่: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh


1
"บรรทัดแรกมีอักขระพิเศษสองตัวที่ไม่สามารถคัดลอก / วางได้" แทนที่จะใช้การechoใช้printfซึ่งช่วยให้คุณสามารถแสดงตัวอักษรเหล่านั้น (ESC และ BEL / Control-G) พร้อมลำดับการหลีกเลี่ยง:printf '\e]0;$@\a"
Chris Page
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.