Setel judul jendela terminal ke direktori saat ini

71

Bagaimana saya bisa mendapatkan Terminal.app di OS X untuk menampilkan direktori saat ini di jendela atau judul tab?

Saya menggunakan shell bash.

kareman
sumber
Saya selalu bertanya-tanya mengapa bahkan orang yang menjawab pertanyaan tidak ingat untuk memilihnya.
cregox

Jawaban:

60

Tergantung pada cangkang Anda.

Artikel ini menampilkan beberapa metode.

Saya pribadi menggunakan zsh yang memiliki fungsi precmd () yang nyaman yang dijalankan sebelum setiap prompt.

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

Meskipun pertanyaan lain mencantumkan metode bash, mereka alias cd. Bash menyediakan metode yang melekat yang hanya mematikan prompt.

pesta

bash memasok PROMPT_COMMAND variabel yang berisi perintah untuk dieksekusi sebelum prompt. Contoh ini (dimasukkan dalam ~ / .bashrc) menetapkan judul menjadi "nama pengguna @ hostname: direktori":

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

di mana \ 033 adalah kode karakter untuk ESC, dan \ 007 untuk BEL. Perhatikan bahwa kutipan itu penting di sini: variabel diperluas dalam "...", dan tidak diperluas dalam '...'. Jadi PROMPT_COMMAND diatur ke nilai yang tidak diperluas, tetapi variabel di dalam "..." diperluas ketika PROMPT_COMMAND digunakan.

Namun, PWD menghasilkan jalur direktori lengkap. Jika kita ingin menggunakan steno '~' kita perlu memasukkan string escape di prompt, yang memungkinkan kita untuk mengambil keuntungan dari ekspansi prompt berikut yang disediakan oleh shell:

\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

Jadi, yang berikut ini menghasilkan prompt "bash $", dan judul xterm dari "nama pengguna @ hostname: direktori" ...

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

Perhatikan penggunaan [...], yang memberitahu bash untuk mengabaikan karakter kontrol yang tidak mencetak saat menghitung lebar prompt. Kalau tidak, perintah pengeditan baris menjadi bingung saat menempatkan kursor.

Aula Darren
sumber
Seharusnya disebutkan saya menggunakan bash, saya telah memperbarui pertanyaan.
kareman
Menambahkan metode bash dari tautan yang tercantum.
Darren Hall
1
Baik sekali. Untuk mendapatkan hanya path ke direktori saat ini di judul dan nama direktori saat ini di prompt saya hanya menggunakan PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman
1
"Jika kita ingin menggunakan steno '~' kita perlu menyematkan string escape di prompt" Anda dapat menggunakan yang berikut ini untuk mengganti pathname direktori home lengkap dengan tilde: $ {PWD / # $ {HOME} / \ ~}}
Chris Page
1
@MattTagg Tentu, Anda hanya perlu memasukkannya ke ~/.profilefile Anda (atau yang setara) di mesin jarak jauh.
coredumperror
32

Salin & tempel ke file ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Ini akan mengatur judul tab terminal saat ini dengan nama folder tempat Anda berada (BUKAN seluruh jalur).
Jadi ...
Developer/Applications/Utilities/Bluetooth/menjadi =>Bluetooth

Allisone
sumber
3
Pada maverick file yang akan diedit adalah ~ / .bash_profile
Tom
11

Pada Mac OS X Lion 10.7, Terminal memiliki urutan pelarian yang eksplisit untuk mengatur direktori kerja, yang ditampilkan Terminal menggunakan ikon "proxy" jendela standar. Ini memungkinkan Anda untuk Command-Klik untuk melihat jalan, mengungkapkan di Finder, atau seret seperti folder lainnya. Selain itu, Terminal dapat menggunakan ini untuk membuat terminal lain di direktori yang sama, dan untuk mengembalikan direktori kerja ketika berhenti / memulai ulang Terminal (ketika Resume diaktifkan). Ini juga memungkinkan memulihkan direktori untuk Grup Jendela.

Itu adalah urutan melarikan diri yang sama dengan Perintah Sistem Operasi (OSC) seperti untuk judul jendela dan tab, tetapi dengan parameter pertama yang diatur ke 7. Nilai harus berupa "file:" URL, yang memungkinkan persen-penyandian karakter khusus sehingga dapat menangani semua nama jalur yang valid. Anda juga harus memasukkan nama host sehingga Terminal dapat menentukan apakah itu direktori lokal; Terminal akan menghindari menggunakannya sebagai direktori kerja saat ini jika berasal dari host yang berbeda.

Pada catatan terkait, Terminal juga mendukung pengaturan "file yang diwakili" menggunakan urutan escape OSC dengan parameter 6. Jika diatur, ikon proksi akan menampilkan ini alih-alih direktori yang berfungsi. Sebagai contoh, saya memiliki emacs dan kurang dikonfigurasi untuk mencerminkan file / buffer yang sedang ditampilkan di ikon proxy. Ini memungkinkan program berbasis tty ini menjadi lebih terintegrasi dengan OS di sekitarnya.

Perilaku direktori kerja diaktifkan secara default untuk bash (shell default pada Mac OS X). Lihat / etc / bashrc untuk kode yang relevan.

Mungkin juga perlu disebutkan bahwa Lion Terminal sekarang mendukung pengaturan judul tab secara independen dari judul jendela menggunakan urutan escape OSC.

Chris Page
sumber
The update_terminal_cwdfungsi akan mengatur ikon proxy untuk direktori kerja saat ini. Secara default $PROMPT_COMMANDadalah update_terminal_cwd.
jtbandes
@jtbandes Itulah yang saya maksud ketika saya menulis "Perilaku direktori kerja diaktifkan secara default untuk bash ...".
Chris Page
Ya. Saya baru saja menemukan cara kerjanya dan berpikir itu mungkin berguna untuk googler masa depan!
jtbandes
3

Selain merekomendasikan Anda menggunakan urutan melarikan diri Perintah Sistem Operasi spesifik Terminal Apple: di ESC ] Ps ; Pt BELmana Psada 7dan Ptmerupakan file:URL; ada baiknya menambahkan bahwa di Mac OS X 10.11 (dan mungkin sejak 10.7) ada file /etc/bashrc_Apple_Terminal(tidak dapat diedit di bawah 10.11) yang mendefinisikan kenyamanan update_terminal_cwd()sebagai (tanpa komentar):

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

Anda bisa menggunakan ini di kotak jauh Anda juga, kalau-kalau Anda berpikir untuk melakukannya dan kemudian menggaruk-garuk kepala Anda pada pengkodean URL file dengan benar di bash.

Dan jika Anda mengubahnya PROMPT_COMMANDsendiri .bash_profileatau .bashrcAnda mungkin lupa menyebutnya. Dalam file yang sama mereka menunjukkan contoh merantai sedikit lebih baik dengan:

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

Secara pribadi di saya, .bash_profilesaya ingin menambahkan prompt git jadi saya melakukan ini:

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
dlamblin
sumber
1

Solusi Bash yang melibatkan PS1 dan PROMPT_COMMAND keduanya gagal jika direktori memiliki karakter Unicode di dalamnya (setidaknya di Snow Leopard). Solusi terbaik yang dapat saya temukan adalah melakukan yang setara

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

Sayangnya ini tidak berfungsi secara langsung, jadi alih-alih saya mendefinisikan fungsi shell untuk melakukan trpanggilan:

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

Ini berfungsi baik untuk aksen Latin, yang akan berada di Unicode NFD (aksen akan menghilang tetapi karakter Latin yang mendasarinya akan tetap).

Sayangnya, itu akan benar-benar gagal untuk hal-hal seperti bahasa Cina.

Michael Norrish
sumber
Pada Mac OS X Lion 10.7, Terminal memiliki urutan pelarian yang eksplisit untuk mengatur direktori kerja. Ini menggunakan URL, sehingga Anda dapat menggunakan persen-encoding untuk karakter khusus dan mendukung semua nama path yang valid. Lihat jawaban saya untuk pertanyaan ini untuk detailnya.
Chris Page
1

Dengan asumsi Anda menggunakan Terminal MAC default, Anda dapat menggunakan yang berikut ini di. Profil karena "set_prompt" dengan sendirinya dapat mengirim Anda ke folder root ketika Anda membuka tab baru:

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
Kopz Kyoto
sumber
0

Masukkan ini ke file ~ / .profile atau yang setara:

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

export PS1='\W \$ '

settitle `pwd`

Baris pertama berisi dua karakter khusus yang tidak dapat disalin / ditempelkan, tetapi Anda dapat mengunduh teks dari sini: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .

kareman
sumber
1
"Baris pertama berisi dua karakter khusus yang tidak dapat disalin / ditempelkan" Alih-alih menggunakan echopenggunaan printf, yang memungkinkan Anda mengekspresikan karakter tersebut (ESC dan BEL / Control-G) dengan urutan pelarian:printf '\e]0;$@\a"
Chris Page