Переименовать имя окна tmux в prompt_command, ps1 или имя удаленного хоста ssh?

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

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

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

11 ответов

Решение

Я не знаю ни одного способа заставить его взглянуть на тебя 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 или что-то более подходящее, если это необходимо.

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

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

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

Ctrl + B, $

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

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

Ctrl + B,,

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

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

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

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

Вместо 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).

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

command ssh "$@"

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

ssh server false

Вернет 0.

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

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

Другим решением было бы переименовать активное окно в его предыдущее имя после сеанса 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
}

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

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

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

Это работает для в tmux 2.1 а с зш локально и на серверах:

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, она заработает немедленно.

Добавьте это к .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
}

Сначала создайте функцию (обратного вызова) для установки/восстановления имени окна tmux, например, имя по умолчанию для восстановления: .

      set_tmux_window_name()
{
    [[ -z "$TMUX" ]] && return
    [[ -z "$1" ]] && tmux rename-window "bash" || tmux rename-window $1
}

а затем создайте оболочку ssh, которая восстановит имя окна tmux обратно вbashкак вы определили, после выхода из оболочки ssh из-за таких сигналов, как KILL/TERM/ABORT/..

      ssh_wrapper ()
{ 
    trap set_tmux_window_name SIGINT SIGQUIT SIGILL SIGABRT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGTERM

    ssh_cmd=$@
    [[ "$ssh_cmd" = "" ]] && return
    eval $ssh_cmd
}

теперь установите имя окна tmux перед настройкой ssh-соединения

      alias ssh1='set_tmux_window_name "ssh1"; ssh_wrapper username@hostname'
Другие вопросы по тегам