22

Мне бы очень хотелось, чтобы заголовок моего окна tmux автоматически переименовывался в prompt_command, ps1 или просто имя хоста машины, с которой я работаю в ssh . 9 открытых окон с пометкой "ssh" действительно бесполезны. Выполняя работу системного администратора, я открываю новые экраны и многое другое, чтобы вручную переименовать их.

Одна вещь, которую я заметил, это то, что tmux обновляет заголовок окна xterm поэтому я чувствую, что он должен это знать.

Любая помощь? Я бы даже хотел вернуться к screen если бы смог получить эту функцию.

10 ответов10

33

tmux rename-window -t${TMUX_PANE} "Title Text"

Это правильный способ установить заголовки tmux в окне. Переменная $ TMUX_PANE устанавливается tmux и используется для различения разных панелей.

15

Просто для людей, которые пришли сюда в поисках, как изменить заголовок сеанса tmux:

Ctrl + B, $

Это даст вам подсказку, где вы можете переименовать активную сессию.

Чтобы изменить активное окно, используйте вместо этого komma:

Ctrl + B,,

смотрите: Как мне переименовать сессию в tmux?

14

Я не знаю ни одного способа заставить его взглянуть на вашу PS1 напрямую.

Однако tmux понимает те же команды для установки имени окна, что и screen .

Таким образом, вы можете определить такую функцию в вашем ~/.bashrc или ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

а затем позвонить в любой settitle .

Например, вы можете включить его в переменную PS1 , например

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

или через PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Теперь я понимаю, что на вашем рабочем столе запущен tmux , и вы хотите, чтобы у команд ssh было имя хоста, а не ssh , это намного проще.

Учитывая, что вы добавили settitle в ваш локальный ~/.bashrc , все, что вы хотите сделать, это добавить это тоже:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

Замените bash на zsh или что-то более подходящее, если это необходимо.

7

Вместо exit или tmux rename-window "bash" вы можете использовать

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

Это повторно активирует обычную функцию, которая автоматически переименовывает окно для следующих команд.

Блок if предотвращает (без него) переименование текущего окна tmux из команд ssh используемых в других оболочках (вне tmux).

7

Комбинируя ответы Микеля и Юты Джархеда, я использовал следующее .zshrc для решения этой проблемы:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

У меня включено автоматическое переименование окон по умолчанию, и я не могу найти способ включить его после выхода из удаленного хоста. Таким образом, я просто полностью выхожу из окна - не проблема для моего рабочего процесса. Если вы предпочитаете переименовать его, скажем, в "bash", вы можете заменить строку exit на tmux rename-window "bash" .

1

Другим решением было бы переименовать активное окно в его предыдущее имя после сеанса ssh:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}
1

Я знаю, что на этот вопрос уже давным-давно ответили, но я подумал, что добавлю то, с чем я возился и нашел (основываясь на принятом ответе).. Я добавил это в /etc /bashrc всех моих серверов (легко сделать с помощью Fabric, Puppet и т.д.)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

И это автоматически устанавливает имя окна в screen или tmux.

0

Это работает в tmux 2.1 и с zsh локально и на серверах:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Мне пришлось отключить опцию allow-rename вручную перед изменением имени окна - в противном случае оно было изменено на текущий путь на большинстве моих серверов (также с использованием zsh там). Хорошая вещь: если вы снова включите опцию allow-rename, она заработает немедленно.

0

Я бы отметил во всех этих примерах:

command ssh "$@"

Возможно, вы захотите получить код выхода и выйти из функции вместе с ним, в противном случае такие вещи, как:

ssh server false

Вернет 0.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Выйдет из ssh с кодом возврата ssh.

0

Добавьте это в .profile или .bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}

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