68

Как я могу получить Terminal.app в OS X для отображения текущего каталога в заголовке окна или вкладки?

Я использую оболочку bash.

7 ответов7

59

Зависит от вашей оболочки.

Эта статья отображает несколько методов.

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

    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 выдает полный путь к каталогу. Если мы хотим использовать сокращение '~', нам нужно встроить escape-строку в приглашение, что позволяет нам использовать следующие расширения приглашения, предоставляемые оболочкой:

\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 «username @ hostname: directory» ...

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

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

31

Скопируйте и вставьте в файл ~/.profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Это установит заголовок текущей вкладки терминала на имя папки, в которой вы находитесь (НЕ весь путь).
Так...
Developer/Applications/Utilities/Bluetooth/ становится => Bluetooth

11

Начиная с Mac OS X Lion 10.7, Терминал имеет явную управляющую последовательность для установки рабочего каталога, который Терминал отображает с помощью значка стандартного окна "прокси". Это позволяет вам щелкнуть его, удерживая клавишу Command, чтобы увидеть путь, открыть его в Finder или перетащить его, как любую другую папку. Кроме того, Терминал может использовать это для создания другого терминала в том же каталоге и для восстановления рабочего каталога при выходе из / перезапуск Терминала (когда Resume включен). Это также позволяет восстанавливать каталоги для оконных групп.

Это та же escape-последовательность операционной системы (OSC), что и для заголовков окон и вкладок, но с первым параметром, установленным на 7. Значение должно быть URL-адресом «file:», который позволяет использовать специальные символы в процентах, чтобы он мог обрабатывать все допустимые имена путей. Вам также следует указать имя хоста, чтобы терминал мог определить, является ли он локальным каталогом; Терминал не будет использовать его в качестве текущего рабочего каталога, если он находится на другом хосте.

Что касается примечания, Терминал также поддерживает настройку "представленного файла" с использованием escape-последовательности OSC с параметром 6. Если установлено, значок прокси будет отображать это вместо рабочего каталога. Например, у меня есть emacs и менее настроенный для отображения текущего отображаемого файла / буфера в значке прокси. Это позволяет этим программам на основе tty быть более интегрированными с окружающей ОС.

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

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

2

Помимо рекомендации, вы должны использовать escape-последовательность команд операционной системы Apple Terminal: 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

Предполагая, что вы используете терминал 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
1

Решения Bash, включающие PS1 и PROMPT_COMMAND, терпят неудачу, если в каталоге есть символы Юникода (по крайней мере, на 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 (акценты исчезнут, но основной латинский символ останется).

К сожалению, это не удастся для таких вещей, как китайский.

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .