Вот моя адаптация / etc / bashrc для zsh. Я включил процентное кодирование всех символов URL, которые в нем нуждаются, что важно, если вы хотите, чтобы это работало со всеми допустимыми именами файлов и каталогов.
Это регистрирует precmd
ловушку, которая позволяет регистрировать более одной функции в других сценариях и файлах конфигурации.
ОБНОВЛЕНО март 2019 года: установлено LC_ALL
пустое значение, чтобы оно не перекрывалось LC_CTYPE
. Используется precmd
для обновления рабочего каталога в каждом приглашении, а не chpwd
для обновления его каждый раз, когда он изменяется - командные конвейеры могут временно его менять, и терминал не должен отображать их. Кроме того, может быть полезно, чтобы каждая подсказка обновляла состояние терминала, если оно было изменено во время предыдущей команды. Используется printf -v
для явной записи в переменную вместо использования синтаксиса subshell.
# Tell the terminal about the working directory whenever it changes.
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.
# Percent-encode the pathname.
local url_path=''
{
# Use LC_CTYPE=C to process text byte-by-byte. Ensure that
# LC_ALL isn't set, so it doesn't interfere.
local i ch hexch LC_CTYPE=C LC_ALL=
for ((i = 1; i <= ${#PWD}; ++i)); do
ch="$PWD[i]"
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch"
else
printf -v hexch "%02X" "'$ch"
url_path+="%$hexch"
fi
done
}
printf '\e]7;%s\a' "file://$HOST$url_path"
}
# Register the function so it is called at each prompt.
autoload add-zsh-hook
add-zsh-hook precmd update_terminal_cwd
fi