перейменувати ім'я вікна 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.