Как я могу получить Terminal.app в OS X для отображения текущего каталога в заголовке окна или вкладки?
Я использую оболочку bash.
Как я могу получить Terminal.app в OS X для отображения текущего каталога в заголовке окна или вкладки?
Я использую оболочку bash.
Зависит от вашей оболочки.
Эта статья отображает несколько методов.
Я лично использую 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 игнорировать непечатные управляющие символы при расчете ширины приглашения. В противном случае команды редактирования строки будут сбиты с толку при размещении курсора.
Скопируйте и вставьте в файл ~/.profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"
Это установит заголовок текущей вкладки терминала на имя папки, в которой вы находитесь (НЕ весь путь).
Так...
Developer/Applications/Utilities/Bluetooth/
становится => Bluetooth
Начиная с 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.
Помимо рекомендации, вы должны использовать 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
Предполагая, что вы используете терминал 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
Решения 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 (акценты исчезнут, но основной латинский символ останется).
К сожалению, это не удастся для таких вещей, как китайский.
Введите это в ваш ~/.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.