Terminal penceresinin başlığını geçerli dizine ayarlayın


71

Geçerli dizini kendi penceresinde veya sekme başlığında görüntülemek için OS X'deki Terminal.app'i nasıl alabilirim?

Beş kabuk kullanıyorum.


Neden her zaman soruyu cevaplayanların bile oylama yapmayı hatırlamadıklarını merak ediyorum.
cregox

Yanıtlar:


60

Kabuğuna bağlı.

Bu makalede birden çok yöntem gösterilmektedir.

Şahsen her istemden önce çalıştırılan uygun bir precmd () işlevine sahip olan zsh kullanıyorum.

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

Diğer sorular bash yöntemlerini listelemelerine rağmen, cd diğer adlarını kullanırlar. Bash, sadece bilgi istemi zincirleme yerel bir yöntem sağlar.

darbe

bash, komut isteminden önce çalıştırılacak bir komut içeren bir PROMPT_COMMAND değişkeni sağlar. Bu örnek (~ / .bashrc içine eklenmiş) başlığı "username @ hostname: directory" olarak ayarlar:

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

burada \ 033, ESC için karakter kodudur ve BEL için \ 007'dir. Burada alıntı yapmanın önemli olduğuna dikkat edin: değişkenler "..." ile genişletilir ve '...' ile genişletilmez. Böylece PROMPT_COMMAND genişletilmiş bir değere ayarlanır, ancak PROMPT_COMMAND kullanıldığında "..." içindeki değişkenler genişletilir.

Ancak, PWD tam dizin yolunu üretir. Eğer '~' kestirme yolunu kullanmak istiyorsak, kaçış dizisini kabuğun içine yerleştirmemiz gerekir; bu, kabuğun sağladığı aşağıdaki bilgi açılımlarından faydalanmamızı sağlar:

\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

Böylece, aşağıdaki "bash $" komut istemini ve "username @ hostname: directory" adlı bir xterm başlığı oluşturur ...

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

Bilgi isteminin genişliğini hesaplarken baskı yapmayan kontrol karakterlerini yoksaymasını bash söyleyen [...] kullanımına dikkat edin. Aksi halde imleci yerleştirirken satır düzenleme komutlarının kafası karışır.


Bash kullanıyorum demeliydim, soruyu güncelledim.
kareman

Listelenen bağlantıdan bash yöntemi eklendi.
Darren Hall

1
Çok iyi. Yalnızca başlıktaki geçerli dizine giden yolu ve istemdeki geçerli dizinin adını almak için PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $" komutunu kullandım.
kareman

1
"'~' Kısayolunu kullanmak istiyorsak, kaçış dizesini komut satırına yerleştirmemiz gerekir" Tam dizindeki yol dizinin tam adını tilde ile değiştirmek için aşağıdakileri kullanabilirsiniz: $ {PWD / # $ {HOME} / \ ~}
Chris Sayfa

1
@MattTagg Tabii ki, sadece ~/.profileuzak makinedeki (veya eşdeğeri) dosyaya koymak gerekir .
coredumperror

32

Dosyaya kopyala ve yapıştır ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Bu, geçerli terminal sekmesinin başlığını bulunduğunuz klasörün adına ayarlayacaktır (tüm yol değil).
Yani ...
Developer/Applications/Utilities/Bluetooth/olur =>Bluetooth


3
Mavericks'te düzenlenecek dosya ~ / .bash_profile
Tom

11

Mac OS X Lion 10.7'den itibaren, Terminal'in standart pencere "proxy" simgesini kullanarak görüntülediği çalışma dizinini ayarlamak için açık bir kaçış dizisi vardır. Bu, yolu görmek, Finder'da göstermek veya başka bir klasör gibi sürüklemek için Komutla Tıklatmanıza olanak tanır. Ek olarak, Terminal bunu aynı dizinde başka bir terminal oluşturmak ve Terminal'den çıkarken / yeniden başlatırken (Devam et etkinken) çalışma dizinini geri yüklemek için bunu kullanabilir. Ayrıca Pencere Grupları için dizinlerin geri yüklenmesini sağlar.

Pencere ve sekme başlıkları ile aynı İşletim Sistemi Komutanlığı (OSC) çıkış sırası, ancak ilk parametre 7 olarak ayarlandı. Değer, yüzde kodlayan özel karakterleri işleyebilmesi için bir "dosya:" URL olmalıdır. tüm geçerli yol adları. Ana bilgisayar adını da eklemelisiniz, böylece Terminal yerel bir dizin olup olmadığını belirleyebilir; Terminal, farklı bir ana bilgisayardan geliyorsa, geçerli çalışma dizini olarak kullanmaktan kaçınacaktır.

İlgili bir notta, Terminal benzer şekilde OSC çıkış sırasını 6 parametresiyle kullanarak "temsil edilen dosyanın" ayarlanmasını desteklemektedir. Ayarlanırsa, proxy simgesi çalışma dizini yerine bunu gösterecektir. Örneğin, şu anda görüntülenen dosyayı / arabellek proxy simgesine yansıtacak şekilde daha az yapılandırılmış emac'larım var. Bu, bu tty tabanlı programların çevredeki işletim sistemi ile daha entegre olmasını sağlar.

Çalışma dizini davranışları bash için varsayılan olarak etkindir (Mac OS X'teki varsayılan kabuk). İlgili kod için bakınız / etc / bashrc.

Lion Terminal'in artık OSC kaçış dizisini kullanarak sekme başlığının pencere başlığından bağımsız olarak ayarlanmasını desteklediğini de belirtmekte fayda var.


update_terminal_cwdFonksiyon geçerli çalışma dizininin vekil simgesini ayarlayacaktır. Varsayılan $PROMPT_COMMANDolarak update_terminal_cwd.
jtbandes

@jtbandes “Çalışma dizini davranışları varsayılan olarak bash için etkinleştirildi…” yazdığımda bunu kastediyordum.
Chris Sayfa

Evet. Nasıl çalıştığını keşfettim ve gelecekteki çalışanlar için faydalı olabileceğini düşündüm!
jtbandes

3

Apple Terminaline özgü İşletim Sistemi Komutu kaçış sırasını kullanmanızı tavsiye etmekten başka : ESC ] Ps ; Pt BELnerede ve bir URL; Mac OS X 10.11’de (ve muhtemelen 10.7’den beri) , (yorum olmadan) uygun olarak tanımlayan bir dosya (10.11’in altında düzenlenemeyen ) olduğunu eklemeye değer :Ps7Ptfile:/etc/bashrc_Apple_Terminalupdate_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"
}

Bunu yapmayı düşündüğünüzde ve daha sonra da kafanızı dosya URL'sini bash'te doğru bir şekilde kodlamak için çizdiğiniz takdirde, uzak kutularınızda da kullanabilirsiniz.

PROMPT_COMMANDKendi başınıza değiştirirseniz .bash_profileveya .bashrcbunu aramayı unutabilirsiniz. Aynı dosyada biraz daha iyi zincirleme örneği gösteriliyor:

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

Şahsen .bash_profileben git istemi eklemek istedim, bu yüzden şunu yaptım:

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

PS1 ve PROMPT_COMMAND içeren Bash çözümlerinin her ikisi de, dizinde Unicode karakterleri varsa (en azından Snow Leopard'da) başarısız olur. Bulaşabileceğim en iyi çözüm, eşdeğerini yapmaktı.

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

Ne yazık ki bu doğrudan işe yaramıyor, bu yüzden trarama yapmak için bir kabuk işlevi tanımladım :

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

Bu, Unicode NFD'de olacak olan Latin aksanları için iyi çalışır (aksanlar kaybolacak, ancak temeldeki Latin karakteri kalacaktır).

Ne yazık ki, Çin gibi şeyler için tamamen başarısız olacak.


Mac OS X Lion 10.7'den itibaren, Terminal çalışma dizinini ayarlamak için açık bir kaçış dizisine sahiptir. Bir URL kullanır, böylece özel karakterler için yüzde kodlamasını kullanabilir ve tüm geçerli yol adlarını destekleyebilirsiniz. Ayrıntılar için bu soruya cevabımı görün.
Chris Sayfa

1

Varsayılan MAC Terminalini kullandığınızı varsayarsak, .profile dosyasında aşağıdakileri kullanabilirsiniz, çünkü "set_prompt", yeni bir sekme açtığınızda sizi kök klasöre gönderebilir:

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

Bunu ~ / .profile veya eşdeğer dosyaya girin:

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

export PS1='\W \$ '

settitle `pwd`

İlk satır, kopyalanamayan / yapıştırılamayan iki özel karakter içeriyor, ancak metni buradan indirebilirsiniz: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .


1
Bunun yerine kullanmanın "İlk satır yapıştırılan / kopyalanamaz iki özel karakterler içeriyor" echokullanımını printfEğer kaçış dizileri olanlarda karakterleri (ESC ve BEL / Kontrol-G) ifade olanak sağlayan:printf '\e]0;$@\a"
Chris Sayfa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.