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

71

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

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

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

Ответы:

60

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

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

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

Даррен Холл
источник
Должен упомянуть, что я использую Bash, я обновил вопрос.
Кареман
Добавлен метод bash из указанной ссылки.
Даррен Холл
1
Отлично. Чтобы получить только путь к текущему каталогу в заголовке и имя текущего каталога в приглашении, я просто использовал PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
Кареман
1
«Если мы хотим использовать сокращение« ~ », нам нужно встроить escape-строку в приглашение». Вы можете использовать следующее, чтобы заменить полный путь к домашнему каталогу тильдой: $ {PWD / # $ {HOME} / \ ~}
Крис Пейдж
1
@ MattTagg Конечно, вам просто нужно поместить его в ваш ~/.profile(или эквивалентный) файл на удаленном компьютере.
coredumperror
32

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

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

Allisone
источник
3
На Маверикс файл для редактирования ~ / .bash_profile
Том
11

Начиная с 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 Это то, что я имел в виду, когда писал «Поведение рабочего каталога по умолчанию для bash…».
Крис Пейдж
Ага. Я только что узнал, как это работает, и подумал, что это может быть полезно для будущих гуглеров!
января
3

Помимо рекомендации, вы должны использовать 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
dlamblin
источник
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 (акценты исчезнут, но основной латинский символ останется).

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

Майкл Норриш
источник
Начиная с Mac OS X Lion 10.7, Terminal имеет явную escape-последовательность для установки рабочего каталога. Он использует 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 .

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