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

25

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

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

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

user68782
источник

Ответы:

15

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

Mikel
источник
Это действительно не называет заголовок окна именем хоста удаленного блока без установки .bashrc на удаленном блоке. Спасибо, хотя я узнал немного ловкого.
user68782
Если вам нужно только имя хоста на вашей локальной стороне, это намного проще. Подожди секунду ...
Микель
блестящий! Спасибо. Извините, моя неспособность объяснить мой запрос привела к двум вопросам. еще раз спасибо!
user68782
Так как tmux меняет заголовок окна по прихоти, это может очень быстро перезаписаться обычными изменениями заголовка окна с помощью tmux.
UtahJarhead
Благодарность! Я использовал PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- так как с кодом @ Mikel я не получил ни имени хоста, ни -bash: : No such file or directoryошибки перед каждой командной строкой. Мне кажется, что $()это заставит bash попытаться выполнить все settitle возвраты . (Я использую bash для Linux.)
tuomassalo
35

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

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

UtahJarhead
источник
2
Поскольку это активное окно, я не думаю, что -t${TMUX_PANE}это необходимо (по крайней мере, это было не для меня).
Кристофер
8
@Christopher Если вы работаете, скажем, sleep 3и переключаете окна, в противном случае приглашение завершит работу с неправильным окном после завершения сна. (Это причина, почему я пришел сюда, +1).
Quornian
16

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

Ctrl+ B,$

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

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

Ctrl+ B,,

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

rubo77
источник
8

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

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

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

Кристофер
источник
1
Я использую tmux rename-window hostname -sпосле команды ssh "@ $", он в основном "сбрасывает" заголовок на мою машину "шлюза".
Андрей
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).

tarczewski
источник
Я пошел if env | grep -q "TMUX_PANE"; thenвместо ps -p...материала, но тот же принцип.
Atomicules
1

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

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

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

Брайан
источник
мы используем внутренние днс, поэтому hostname -sудаляем лишние доменные ресурсы, чтобы server1.internal.local отображался как просто server1
Брайан
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
}
Chimay
источник
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, она заработает немедленно.

FSchndr
источник
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
}
user536642
источник
0

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

command ssh "$@"

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

ssh server false

Вернет 0.

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

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

josefwells
источник