перейменувати ім'я вікна tmux в prompt_command, ps1 або віддалене ім'я хоста ssh?


25

Мені б хотілося, щоб моя назва вікна tmux автоматично перейменована в prompt_command, ps1 або просто ім'я хоста машини, на якій я ssh. відкрити 9 вікон із написом "ssh" - це справді марно. Виконуючи роботу з системою адмін, я відкриваю нові екрани і обшиваю їх, щоб перейменувати їх вручну.

Одне, що я помітив, - це tmuxоновлення назви xtermвікна, тому я відчуваю, що це повинен знати.

Будь-яка допомога? Я навіть хотів би повернутися до того, screenякби міг отримати цю функцію.

Відповіді:


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 або щось інше, якщо це необхідно.


Це дійсно не називає заголовок вікна ім'ям хоста віддаленого вікна, маючи налаштування .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 і використовується для розмежування різних панелей.


2
Оскільки це активне вікно, я не вважаю -t${TMUX_PANE}необхідним (принаймні, це не було для мене).
Крістофер

8
@Christopher Якщо ви працюєте, скажімо, sleep 3і перемикаєте вікна, підказки в іншому випадку видадуть команду в неправильне вікно, коли сон завершиться. (Ось чому я прийшов сюди, +1).
курінь

16

Просто для людей, які прийшли сюди, шукаючи, як змінити назву сесії tmux:

Ctrl+ B,$

Це дасть вам підказку, де ви можете перейменувати активний сеанс.

Щоб змінити активне вікно, замість цього використовуйте komma:

Ctrl+ B,,

див.: Як перейменувати сеанс у tmux?


8

Поєднуючи відповіді Мікеля та Юта Джерхеда, я .zshrcвирішив наступне :

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

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


1
Я використовую вікно перейменування tmux hostname -sпісля команди ssh "@ $", воно в основному "скидає" заголовок на мою машину "шлюз".
andrei

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).


Я пішов 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

І воно встановлює ім'я вікна автоматично на екрані чи tmux.


ми використовуємо внутрішні dns, тому 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
}

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
}

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


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
}

0

Я б зазначив у всіх цих прикладах:

command ssh "$@"

Ви можете захопити вихідний код і вийти з нього за допомогою функції, інакше такі речі:

ssh server false

Поверне 0.

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

Вийде з ssh з кодом повернення ssh.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.