web-dev-qa-db-ja.com

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

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

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

71
kareman

シェルによって異なります。

これ article は複数のメソッドを表示します。

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

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

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

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に指示します。そうしないと、カーソルを置くときに行編集コマンドが混乱します。

60
Darren Hall

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

これにより、現在のターミナルタブのタイトルが、パス全体ではなく、現在のフォルダーの名前に設定されます。
そう...
Developer/Applications/Utilities/Bluetooth/は=> Bluetoothになります

32
Allisone

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エスケープシーケンスを使用してウィンドウタイトルとは別にタブタイトルの設定をサポートするようになったことにも言及する価値があるでしょう。

12
Chris Page

Apple端末固有のオペレーティングシステムコマンドエスケープシーケンスを使用することをお勧めします:_ESC ] Ps ; Pt BEL_ Ps is _7_ and Pt is a _file:_ URL; Mac OS X 10.11(おそらく10.7以降)に追加する価値があります。便利なupdate_terminal_cwd()を(なしで)定義するファイル_/etc/bashrc_Apple_Terminal_(10.11では編集不可)コメント):

_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
_
3
dlamblin

デフォルトの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
1
Kopz Kyoto

(少なくともSnow Leopardでは)ディレクトリにUnicode文字が含まれている場合、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になるラテン語アクセントにうまく機能します(アクセントは消えますが、基になるラテン文字は残ります)。

残念ながら、中国語のようなものでは完全に失敗します。

1
Michael Norrish

これを〜/ .profileまたは同等のファイルに入力します。

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

export PS1='\W \$ '

settitle `pwd`

最初の行には、コピー/貼り付けできない2つの特殊文字が含まれていますが、ここからテキストをダウンロードできます http://blog.nottoobadsoftware.com/files/setterminaltitle.sh

0
kareman