端末ウィンドウのタイトルを現在のディレクトリに設定します


71

OS XでTerminal.appを取得して、ウィンドウまたはタブタイトルに現在のディレクトリを表示するにはどうすればよいですか?

私はbashシェルを使用しています。


質問に答えた人でさえ、投票することを忘れないのはなぜだろうといつも思っています。
クレゴックス

回答:


60

シェルに依存します。

この記事では、複数の方法を紹介します。

私は個人的に、各プロンプトの前に実行される便利なprecmd()関数を持つzshを使用しています。

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

他の質問にはbashメソッドがリストされていますが、cdのエイリアスです。Bashは、プロンプトだけをチェーン化する固有のメソッドを提供します。

バッシュ

bashは、プロンプトの前に実行するコマンドを含む変数PROMPT_COMMANDを提供します。次の例(〜/ .bashrcに挿入)は、タイトルを「username @ hostname:directory」に設定します。

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

ここで、\ 033はESCの文字コード、\ 007はBELの文字コードです。ここでは、引用が重要であることに注意してください。変数は「...」で展開され、「...」では展開されません。したがって、PROMPT_COMMANDは展開されていない値に設定されますが、PROMPT_COMMANDを使用すると、「...」内の変数が展開されます。

ただし、PWDは完全なディレクトリパスを生成します。「〜」の短縮形を使用する場合は、プロンプトにエスケープ文字列を埋め込む必要があります。これにより、シェルが提供する次のプロンプト展開を利用できます。

\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 $」のプロンプトと「username @ hostname:directory」のxtermタイトルを生成します...

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

[...]の使用に注意してください。これは、プロンプトの幅を計算するときに、非印刷制御文字を無視するようにbashに指示します。そうしないと、カーソルの配置中に行編集コマンドが混乱します。


私はbashを使用していると述べたはずですが、質問を更新しました。
カレマン2009

リストされたリンクからbashメソッドを追加しました。
ダレンホール

1
とても良い。タイトルの現在のディレクトリへのパスとプロンプトの現在のディレクトリの名前のみを取得するには、PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $を使用しました。
カレマン09

1
「 '〜'の短縮形を使用する場合は、プロンプトにエスケープ文字列を埋め込む必要があります」次を使用して、ホームディレクトリの完全なパス名をチルダに置き換えることができます。$ {PWD /#$ {HOME} / \〜}
クリスページ

1
@MattTagg確か~/.profileに、リモートマシン上の(または同等の)ファイルに入れるだけです。
coredumperror

32

ファイル〜/ .profileにコピーして貼り付けます:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

これにより、現在の端末タブのタイトルが現在のフォルダーの名前に設定されます(パス全体ではありません)。
だから...に
Developer/Applications/Utilities/Bluetooth/なります=>Bluetooth


3
マーベリックスでは、編集するファイルは〜/ .bash_profileです
トム

11

Mac OS X Lion 10.7の時点で、ターミナルには作業ディレクトリを設定するための明示的なエスケープシーケンスがあり、ターミナルは標準ウィンドウの「プロキシ」アイコンを使用して表示します。これにより、コマンドキーを押しながらクリックしてパスを表示したり、Finderで表示したり、他のフォルダーと同じようにドラッグしたりできます。さらに、ターミナルはこれを使用して、同じディレクトリに別のターミナルを作成し、ターミナルを終了/再起動するとき(再開が有効な場合)に作業ディレクトリを復元できます。また、ウィンドウグループのディレクトリを復元することもできます。

これは、ウィンドウおよびタブタイトルと同じオペレーティングシステムコマンド(OSC)エスケープシーケンスですが、最初のパラメーターは7に設定されています。値は、「file:」URLである必要があります。すべての有効なパス名。また、ターミナルがローカルディレクトリかどうかを判断できるように、ホスト名も含める必要があります。ターミナルは、別のホストからのものである場合、現在の作業ディレクトリとして使用することを避けます。

関連する注意事項として、ターミナルは同様に、OSCエスケープシーケンスを使用してパラメーター6で「表示されたファイル」の設定をサポートします。設定すると、プロキシアイコンは作業ディレクトリではなくこれを表示します。たとえば、emacsがあり、プロキシアイコンに現在表示されているファイル/バッファを反映するように構成されています。これにより、これらのttyベースのプログラムを周囲のOSとより統合できます。

作業ディレクトリの動作は、bash(Mac OS Xのデフォルトのシェル)でデフォルトで有効になっています。関連するコードについては、/ etc / bashrcを参照してください。

Lion Terminalは、OSCエスケープシーケンスを使用して、ウィンドウタイトルとは別にタブタイトルの設定をサポートするようになったことに言及する価値があるでしょう。


このupdate_terminal_cwd関数は、プロキシアイコンを現在の作業ディレクトリに設定します。デフォルトで$PROMPT_COMMANDupdate_terminal_cwdです。
jtbandes 14

@jtbandes「bashの作業ディレクトリの動作はデフォルトで有効になっています...」と書いたときに言及していました。
クリスページ14

うん。私はちょうどそれがどのように機能するかを発見し、それが将来のグーグルに役立つかもしれないと考えました!
jtbandes 14

3

別に推薦から、あなたは、Appleターミナル、特定のオペレーティングシステムのコマンドエスケープシーケンスを使用します。あるとされるURLを、Mac OS X 10.11(およびおそらく10.7以降)には、(コメントなしで)便利なものを定義するファイル(10.11では編集不可)が追加されていることは価値があります。ESC ] Ps ; Pt BELPs7Ptfile:/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"
}

あなたがそうすることを考えていて、bashでファイル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

ディレクトリにUnicode文字が含まれている場合(少なくともSnow Leopardでは)、PS1とPROMPT_COMMANDを含むBashソリューションは両方とも失敗します。私が思いついた最良の解決策は、同等のことをすることでした

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を使用するため、特殊文字にパーセントエンコーディングを使用して、すべての有効なパス名をサポートできます。詳細については、この質問に対する私の答えをご覧ください。
クリスページ

1

デフォルトのMACターミナルを使用していると仮定すると、新しいタブを開くと「set_prompt」自体がルートフォルダーに送信するため、.profileで次のターミナルを使用できます。

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
代わりに使用しての「最初の行が貼り付け/コピーすることはできません2つの特殊文字が含まれている」echo使用することをprintfあなたはエスケープシーケンスでこれらの文字(ESCとBEL /コントロール-G)を発現することができますこれは、:printf '\e]0;$@\a"
クリス・ページ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.