Переименовать имя окна 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'