ฉันจะรับ Terminal.app ใน OS X เพื่อแสดงไดเรกทอรีปัจจุบันในหน้าต่างหรือชื่อแท็บได้อย่างไร
ฉันใช้เปลือกทุบตี
ฉันจะรับ Terminal.app ใน OS X เพื่อแสดงไดเรกทอรีปัจจุบันในหน้าต่างหรือชื่อแท็บได้อย่างไร
ฉันใช้เปลือกทุบตี
คำตอบ:
ขึ้นอยู่กับเปลือกของคุณ
นี้บทความแสดงหลายวิธี
ฉันเองใช้ 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 ละเว้นอักขระควบคุมที่ไม่พิมพ์เมื่อคำนวณความกว้างของพรอมต์ มิฉะนั้นคำสั่งแก้ไขบรรทัดจะสับสนขณะวางเคอร์เซอร์
~/.profile
ไฟล์ (หรือเทียบเท่า) บนเครื่องระยะไกล
คัดลอกและวางลงในไฟล์ ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"
สิ่งนี้จะตั้งชื่อของแท็บเทอร์มินัลปัจจุบันเป็นชื่อของโฟลเดอร์ที่คุณอยู่ (ไม่ใช่พา ธ ทั้งหมด)
ดังนั้น ...
Developer/Applications/Utilities/Bluetooth/
กลายเป็น =>Bluetooth
ในฐานะของ 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
นอกเหนือจากการแนะนำให้คุณใช้ลำดับการหลีกเลี่ยงคำสั่งระบบปฏิบัติการเฉพาะของ 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
วิธีแก้ไขปัญหา 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 เริ่มต้นคุณสามารถใช้สิ่งต่อไปนี้ใน. 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
ป้อนสิ่งนี้ลงในไฟล์ ~ / .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
echo
ใช้printf
ซึ่งช่วยให้คุณสามารถแสดงตัวอักษรเหล่านั้น (ESC และ BEL / Control-G) พร้อมลำดับการหลีกเลี่ยง:printf '\e]0;$@\a"