Đặt tiêu đề của cửa sổ đầu cuối vào thư mục hiện tại


71

Làm cách nào tôi có thể lấy Terminal.app trong OS X để hiển thị thư mục hiện tại trong tiêu đề tab hoặc cửa sổ của nó?

Tôi đang sử dụng bash shell.


Tôi luôn tự hỏi tại sao ngay cả những người trả lời câu hỏi cũng nhớ bỏ phiếu.
cregox

Câu trả lời:


60

Phụ thuộc vào vỏ của bạn.

Bài viết này hiển thị nhiều phương pháp.

Cá nhân tôi sử dụng zsh có hàm premd () thuận tiện được chạy trước mỗi dấu nhắc.

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

Mặc dù các câu hỏi khác liệt kê các phương thức bash, chúng bí danh cd. Bash cung cấp một phương thức vốn có mà chỉ tắt dấu nhắc.

bash

bash cung cấp một biến PROMPT_COMMAND chứa lệnh để thực thi trước dấu nhắc. Ví dụ này (được chèn vào ~ / .bashrc) đặt tiêu đề thành "username @ hostname: thư mục":

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

trong đó \ 033 là mã ký tự cho ESC và \ 007 cho BEL. Lưu ý rằng trích dẫn rất quan trọng ở đây: các biến được mở rộng trong "..." và không được mở rộng trong '...'. Vì vậy, PROMPT_COMMAND được đặt thành một giá trị chưa được mở rộng, nhưng các biến bên trong "..." được mở rộng khi PROMPT_COMMAND được sử dụng.

Tuy nhiên, PWD tạo ra đường dẫn thư mục đầy đủ. Nếu chúng ta muốn sử dụng tốc ký '~', chúng ta cần nhúng chuỗi thoát trong lời nhắc, cho phép chúng ta tận dụng các mở rộng lời nhắc sau đây được cung cấp bởi trình bao:

\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

Do đó, phần sau đây tạo ra lời nhắc "bash $" và tiêu đề xterm của "username @ hostname: thư mục" ...

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

Lưu ý việc sử dụng [...], thông báo bash bỏ qua các ký tự điều khiển không in khi tính toán độ rộng của dấu nhắc. Nếu không, các lệnh chỉnh sửa dòng bị lẫn lộn trong khi đặt con trỏ.


Nên đã đề cập tôi đang sử dụng bash, tôi đã cập nhật câu hỏi.
kareman

Đã thêm phương thức bash từ liên kết được liệt kê.
Hội trường Darren

1
Rất tốt. Để chỉ nhận đường dẫn đến thư mục hiện tại trong tiêu đề và tên của thư mục hiện tại trong lời nhắc tôi chỉ sử dụng PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman

1
"Nếu chúng tôi muốn sử dụng tốc ký '~', chúng tôi cần nhúng chuỗi thoát trong lời nhắc" Bạn có thể sử dụng cách sau để thay thế tên đường dẫn thư mục nhà đầy đủ bằng dấu ngã: $ {PWD / # $ {HOME} / \ ~}
Chris Trang

1
@MattTagg Chắc chắn, bạn chỉ cần đặt nó vào ~/.profiletệp (hoặc tương đương) trên máy từ xa.
coredumperror

31

Sao chép và dán vào tệp ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Điều này sẽ đặt tiêu đề của tab thiết bị đầu cuối hiện tại thành tên của thư mục bạn đang ở (KHÔNG phải toàn bộ đường dẫn).
Vậy ...
Developer/Applications/Utilities/Bluetooth/trở thành =>Bluetooth


3
Trên mavericks, tệp cần chỉnh sửa là ~ / .bash_profile
Tom

11

Kể từ Mac OS X Lion 10.7, Terminal có trình tự thoát rõ ràng để đặt thư mục làm việc, mà Terminal hiển thị bằng biểu tượng "proxy" của cửa sổ tiêu chuẩn. Điều này cho phép bạn nhấn Command để xem đường dẫn, hiển thị trong Finder hoặc kéo nó như bất kỳ thư mục nào khác. Ngoài ra, Terminal có thể sử dụng điều này để tạo một thiết bị đầu cuối khác trong cùng thư mục và để khôi phục thư mục làm việc khi thoát / khởi động lại Terminal (khi Resume được bật). Nó cũng cho phép khôi phục các thư mục cho các nhóm cửa sổ.

Đó là trình tự thoát lệnh OSC) tương tự như đối với tiêu đề cửa sổ và tab, nhưng với tham số đầu tiên được đặt thành 7. Giá trị phải là URL "tệp:", cho phép các ký tự đặc biệt mã hóa phần trăm để nó có thể xử lý tất cả các tên đường dẫn hợp lệ. Bạn cũng nên bao gồm tên máy chủ để Terminal có thể xác định xem đó có phải là thư mục cục bộ hay không; Terminal sẽ tránh sử dụng nó làm thư mục làm việc hiện tại nếu nó từ một máy chủ khác.

Trên một lưu ý liên quan, Terminal tương tự hỗ trợ cài đặt "tệp được biểu diễn" bằng cách sử dụng chuỗi thoát OSC với tham số là 6. Nếu được đặt, biểu tượng proxy sẽ hiển thị thông báo này thay vì thư mục làm việc. Ví dụ: tôi có emacs và ít được cấu hình để phản ánh tệp / bộ đệm hiện đang hiển thị trong biểu tượng proxy. Điều này cho phép các chương trình dựa trên tty này được tích hợp nhiều hơn với HĐH xung quanh.

Các hành vi thư mục làm việc được bật theo mặc định cho bash (shell mặc định trên Mac OS X). Xem / etc / bashrc để biết mã liên quan.

Có lẽ cũng đáng đề cập rằng Lion Terminal hiện hỗ trợ thiết lập tiêu đề tab một cách độc lập với tiêu đề cửa sổ bằng cách sử dụng chuỗi thoát OSC.


Các update_terminal_cwdchức năng sẽ đặt biểu tượng proxy để thư mục làm việc hiện hành. Theo mặc định $PROMPT_COMMANDupdate_terminal_cwd.
jtbandes

@jtbandes Đó là những gì tôi đã đề cập đến khi tôi viết ra Các hành vi thư mục làm việc được bật theo mặc định cho bash Cuộc Hồi.
Chris Trang

Vâng. Tôi mới phát hiện ra cách nó hoạt động và nghĩ rằng nó có thể hữu ích cho những người làm việc trong tương lai!
jtbandes

3

Ngoài đề nghị bạn sử dụng cụ thể điều hành chỉ huy hệ thống thoát chuỗi của Apple Terminal: ESC ] Ps ; Pt BELnơi Ps7Ptlà một file:URL; thật đáng để thêm rằng trong Mac OS X 10.11 (và có lẽ kể từ 10.7) có một tệp /etc/bashrc_Apple_Terminal(không thể chỉnh sửa theo 10.11), định nghĩa sự tiện lợi update_terminal_cwd()là (không có nhận xét):

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"
}

Bạn cũng có thể sử dụng điều này trên các hộp từ xa của mình, trong trường hợp bạn nghĩ đến việc đó và sau đó gãi đầu về việc mã hóa chính xác URL tệp trong bash.

Và nếu bạn thay đổi PROMPT_COMMANDtrong chính bạn .bash_profilehoặc .bashrcbạn có thể quên gọi này. Trong cùng một tệp, họ cho thấy một ví dụ về việc xâu chuỗi nó tốt hơn một chút với:

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

Cá nhân .bash_profiletôi muốn thêm dấu nhắc git nên tôi đã làm điều này:

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

Các giải pháp Bash liên quan đến PS1 và PROMPT_COMMAND đều thất bại nếu thư mục có các ký tự Unicode trong đó (ít nhất là trên Snow Leopard). Giải pháp tốt nhất tôi có thể đưa ra là làm tương đương với

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

Thật không may, điều này không hoạt động trực tiếp, vì vậy thay vào đó tôi đã xác định một hàm shell để thực hiện trcuộc gọi:

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

Điều này hoạt động tốt đối với các dấu Latin, sẽ có trong Unicode NFD (các dấu sẽ biến mất nhưng ký tự Latin bên dưới sẽ vẫn còn).

Thật không may, nó sẽ hoàn toàn thất bại cho những thứ như Trung Quốc.


Kể từ Mac OS X Lion 10.7, Terminal có một chuỗi thoát rõ ràng để thiết lập thư mục làm việc. Nó sử dụng một URL, vì vậy bạn có thể sử dụng mã hóa phần trăm cho các ký tự đặc biệt và hỗ trợ tất cả các tên đường dẫn hợp lệ. Xem câu trả lời của tôi cho câu hỏi này để biết chi tiết.
Chris Trang

1

Giả sử bạn đang sử dụng MAC Terminal mặc định, bạn có thể sử dụng cái sau trong .profile vì "set_prompt" có thể tự gửi bạn đến thư mục gốc khi bạn mở tab mới:

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

Nhập tệp này vào ~ / .profile hoặc tệp tương đương của bạn:

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

export PS1='\W \$ '

settitle `pwd`

Dòng đầu tiên chứa hai ký tự đặc biệt không thể sao chép / dán, nhưng bạn có thể tải xuống văn bản từ đây: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .


1
"Dòng đầu tiên chứa hai ký tự đặc biệt không thể sao chép / dán" Thay vì sử echodụng printf, cho phép bạn thể hiện các ký tự đó (ESC và BEL / Control-G) với các chuỗi thoát:printf '\e]0;$@\a"
Chris Trang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.