Встановіть заголовок вікна терміналу в поточний каталог


71

Як я можу змусити Terminal.app в OS X відобразити поточний каталог у його вікні чи заголовку вкладки?

Я використовую оболонку bash.


Мені завжди цікаво, чому навіть люди, які відповідають на питання, не пам'ятають, щоб проголосувати за це.
Крегокс

Відповіді:


60

Залежить від вашої оболонки.

У цій статті показано кілька методів.

Я особисто використовую zsh, який має зручну функцію precmd (), яка запускається перед кожним запитом.

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

Хоча в інших питаннях перелічені методи bash, вони псевдонім CD. Bash пропонує притаманний метод, який вимикає лише підказку.

баш

bash постачає змінну PROMPT_COMMAND, яка містить команду для виконання перед підказкою. Цей приклад (вставлений у ~ / .bashrc) встановлює заголовок "ім'я користувача @ ім'я хоста: каталог":

 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 $" і xterm назва "ім'я користувача @ ім'я хоста: каталог" ...

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

Зверніть увагу на використання [...], яке вказує bash ігнорувати недрукувальні контрольні символи під час обчислення ширини підказки. Інакше команди редагування рядків плутаються під час розміщення курсору.


Повинен був би згадати, що я використовую bash, я оновив питання.
kareman

Доданий метод bash із перерахованого посилання.
Даррен Хол

1
Дуже добре. Щоб отримати лише шлях до поточного каталогу в заголовку та імені поточного каталогу у запиті, я щойно використав PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman

1
"Якщо ми хочемо скористатися скорочуванням '~', нам потрібно вбудувати рядок втечі в підказку" Ви можете використати наступне, щоб замінити повне ім'я шляху домашнього каталогу tilde: $ {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, у Terminal є чітка послідовність відключення для встановлення робочого каталогу, яку Terminal відображає за допомогою стандартного значка "proxy" у вікні. Це дає змогу Command-Click її, щоб побачити шлях, виявити у Finder або перетягнути його, як і будь-яку іншу папку. Крім того, Terminal може використовувати це для створення іншого терміналу в тій самій каталозі та для відновлення робочого каталогу при виході / перезапуску терміналу (коли функцію Resume увімкнено). Це також дозволяє відновити каталоги для груп вікон.

Це та сама послідовність виходу команди Command Operating System (OSC), що і для заголовків вікон та вкладок, але з першим параметром, встановленим у 7. Значення має бути URL-адресою "file:", яка дозволяє відсотковим кодуванням спеціальних символів, щоб вона могла обробляти всі дійсні імена шляхів. Ви також повинні включити ім'я хоста, щоб Terminal міг визначити, чи це локальний каталог; Термінал уникне використання його як поточного робочого каталогу, якщо він має інший хост.

У відповідній примітці Термінал аналогічно підтримує встановлення "представленого файлу" за допомогою послідовності запуску OSC з параметром 6. Якщо встановлено, піктограма проксі відображатиме це замість робочого каталогу. Наприклад, у мене є emacs і менш налаштований для відображення поточного відображеного файлу / буфера в піктограмі проксі. Це дає змогу цим програмам на основі Tty бути більш інтегрованими з навколишньою ОС.

Поведінка робочого каталогу увімкнено за замовчуванням для bash (оболонка за замовчуванням у Mac OS X). Дивіться / etc / bashrc для відповідного коду.

Також, напевно, варто згадати, що Lion Terminal тепер підтримує встановлення заголовка вкладки незалежно від заголовка вікна, використовуючи послідовність запуску OSC.


update_terminal_cwdФункція буде встановити значок проксі для поточного робочого каталогу. За замовчуванням $PROMPT_COMMANDє update_terminal_cwd.
jtbandes

@jtbandes Це те, про що я мав на увазі, коли писав "Поведінка робочого каталогу увімкнено за замовчуванням для bash ...".
Кріс Пейдж

Так. Я щойно відкрив, як це працює, і подумав, що може бути корисним майбутнім гуглерам!
jtbandes

3

Крім того, щоб рекомендувати використовувати специфічну послідовність введення команди Command для операційної системи Apple, ESC ] Ps ; Pt BELде Psє 7і Ptє file:URL-адреса; варто додати, що в Mac OS X 10.11 (і, мабуть, з 10.7) є файл /etc/bashrc_Apple_Terminal(не редагується під 10.11), який визначає зручність update_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"
}

Ви можете використовувати це і на віддалених скриньках, якщо ви думали про це, а потім подряпати голову про правильне кодування URL-адреси файлу в bash.

І якщо ви змінилися 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

Рішення Bash, що включають PS1 та PROMPT_COMMAND, не спрацьовують, якщо в каталозі є символи Unicode (принаймні, у Snow Leopard). Найкраще рішення, яке я міг придумати, - це зробити еквівалент

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, у Terminal є чітка послідовність запуску для встановлення робочого каталогу. Він використовує URL-адресу, тому ви можете використовувати відсоткове кодування для спеціальних символів та підтримувати всі дійсні імена шляхів. Детальніше дивіться у моїй відповіді на це запитання.
Кріс Пейдж,

1

Якщо припустимо, що ви використовуєте MAC-термінал за замовчуванням, ви можете використовувати наступний в .profile, оскільки "set_prompt" сам по собі може надіслати вас у кореневу папку, коли ви відкриєте нову вкладку:

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
"Перший рядок містить два спеціальних символи, які неможливо скопіювати / вставити" Замість echoвикористання printf, що дозволяє виражати ці символи (ESC та BEL / Control-G) за допомогою послідовностей втечі:printf '\e]0;$@\a"
Chris Page
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.