Установить заголовок окна терминала на текущий каталог

38168
kareman

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

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

68
Мне всегда интересно, почему даже люди, которые отвечают на вопрос, не забывают проголосовать за него. cregox 14 лет назад 0

7 ответов на вопрос

59
Darren Hall

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

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

Я лично использую 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;$@$: $\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 игнорировать непечатные управляющие символы при расчете ширины приглашения. В противном случае команды редактирования строки будут запутаны при установке курсора.

Должен упомянуть, что я использую Bash, я обновил вопрос. kareman 14 лет назад 0
Добавлен метод bash по указанной ссылке. Darren Hall 14 лет назад 0
Отлично. Чтобы получить только путь к текущему каталогу в заголовке и имя текущего каталога в приглашении, я просто использовал PS1 = "\\ [\ 033] 0; \ w \ 007 \\] \ W \ $". kareman 14 лет назад 0
Для меня пример (PROMPT_COMMAND = 'echo -ne "\ 033] 0; $ @ $ : $ \ 007"') работал только в том случае, если ** установлено для ~ / .profile **. cregox 14 лет назад 0
«Если мы хотим использовать сокращение« ~ », нам нужно встроить escape-строку в приглашение». Вы можете использовать следующее, чтобы заменить полный путь к домашнему каталогу тильдой: $ / \ ~} Chris Page 12 лет назад 1
Любая идея, если это может работать с SSH и удаленными оболочками? cavalcade 9 лет назад 0
@ MattTagg Конечно, вам просто нужно поместить его в файл `~ / .profile` (или эквивалентный) на удаленном компьютере. CoreDumpError 8 лет назад 1
30
Allisone

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

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

На Маверикс файл для редактирования ~ / .bash_profile Tom 9 лет назад 3
11
Chris Page

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

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

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

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

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

Функция update_terminal_cwd установит значок прокси в текущий рабочий каталог. По умолчанию `$ PROMPT_COMMAND` равно` update_terminal_cwd`. jtbandes 9 лет назад 0
@jtbandes Это то, что я имел в виду, когда писал «Поведение рабочего каталога по умолчанию для bash…». Chris Page 9 лет назад 0
Ага. Я только что обнаружил, как это работает, и подумал, что это может быть полезно для будущих гуглеров! jtbandes 9 лет назад 0
2
dlamblin

Apart from recommending you use the Apple Terminal specific Operating System Command escape sequence: ESC ] Ps ; Pt BEL where Ps is 7 and Pt is a file: URL; it's worth adding that in Mac OS X 10.11 (and probably since 10.7) there's a file /etc/bashrc_Apple_Terminal (uneditable under 10.11) which defines the convenient update_terminal_cwd() as (without the comments):

update_terminal_cwd () { local url_path=''; { local i ch hexch LC_CTYPE=C LC_ALL=; for ((i = 0; i < ${#PWD}; ++i)) do ch="$"; if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then url_path+="$ch"; else printf -v hexch "%02X" "'$ch"; url_path+="%$"; fi; done }; printf '\e]7;%s\a' "file://$HOSTNAME$url_path" } 

You could use this on your remote boxes too, in case you were thinking of doing so and then scratching your head on correctly encoding the file URL in bash.

And if you change PROMPT_COMMAND in your own .bash_profile or .bashrc you might forget to call this. In the same file they show an example of chaining it a bit better with:

PROMPT_COMMAND="update_terminal_cwd$" 

Personally in my .bash_profile I wanted to add the git prompt so I did this:

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$"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"' fi 
1
Michael Norrish

Решения 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 (акценты исчезнут, но основной латинский символ останется).

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

Начиная с Mac OS X Lion 10.7, Terminal имеет явную escape-последовательность для установки рабочего каталога. Он использует URL, поэтому вы можете использовать процентное кодирование для специальных символов и поддерживать все допустимые имена путей. Смотрите мой ответ на этот вопрос для деталей. Chris Page 12 лет назад 0
1
Kopz Kyoto

Предполагая, что вы используете терминал MAC по умолчанию, вы можете использовать следующий файл в .profile, так как «set_prompt» сам по себе может отправить вас в корневую папку при открытии новой вкладки:

set_prompt () { BASE_PATH="$" echo -ne "\033]0;$BASE_PATH\007" } set_my_tab () { update_terminal_cwd set_prompt }  PROMPT_COMMAND=set_my_tab 
0
kareman

Введите это в ваш ~ / .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 .

«Первая строка содержит два специальных символа, которые нельзя скопировать / вставить» Вместо использования «echo» используйте «printf», который позволяет вам выразить эти символы (ESC и BEL / Control-G) с помощью escape-последовательностей: «printf» \ е] 0; $ @ \ а "` Chris Page 12 лет назад 1