Как изменить заголовок мятного окна?

35

MinTTY - новая консоль по умолчанию для Cygwin.

Какая команда оболочки (что-то, что я могу поместить в .bashrc, или даже лучше, в .zshrc), чтобы изменить заголовок окна MinTTY?

Мне бы хотелось, чтобы заголовок окна был путем к текущему каталогу, и чтобы он обновлялся при переключении каталогов внутри консоли.

Леонель
источник
1
Настройка приглашения Cygwin по умолчанию (т. Е. $PS1) Уже содержит последовательность управления, которая устанавливает заголовок окна в user @ machine: working_directory.
ak2
В недавнем коммите 6e6310d MSYS2_packages / filesystem (файловая система: Новая специальная переменная MSYS2_PS1., 2016-05-01) был представлен сценарий приглашения MSYS2_PS1, позволяющий использовать различные конфигурации Cygwin / MSYS2. Я предложил настроить, чтобы любой существующий PS1 имел промежуточный приоритет github.com/Alexpux/MSYS2-packages/pull/651 . Надеюсь это поможет.
Филип Окли
@Philip, (примечание от самого себя) Этот твик оказался спорным, и добавляются (или удаляются) дополнительные твики, чтобы создать минимальное жизнеспособное исправление, которое охватывает различные виды использования.
Филип Окли
1
Связанные, если вам нужен только статический заголовок, такой как «Cygwin i686» или «Cygwin x86_64» , то вы можете использовать -T <title>в свойствах ярлыка Windows. Также см mintty man page.
jww

Ответы:

50

Что не так

Следующая команда не работает для меня:

echo -ne "\e]0;MYTITLE\a"

Оказывается, что моя установка Cygwin по умолчанию включает следующее определение приглашения в .bashrc:

PS1=\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$

Обратите внимание, что первая часть подсказки ( \e]0;\w\a) устанавливает заголовок окна каждый раз, когда появляется подсказка.

Решение

Добавьте эти строки в свой, .bashrcкоторые определяют 2 функции:

function settitle() {
      export PS1="\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
      echo -ne "\e]0;$1\a"
}
function settitlepath() {
      export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
}

Затем вы можете установить пользовательский заголовок с помощью этой команды:

settitle "MYWonderfullTest here"

или вы можете вернуться к Cygwin по умолчанию (текущий путь) с помощью этой команды:

settitlepath

Надеюсь это поможет

boly38
источник
1
Отличная работа, решение проблемы PS1, с которой большинство пользователей столкнется с настройками Cygwin по умолчанию.
Маркку К.
3
Это должно было быть принято как ответ, так как он отлично работает, в отличие от ответа с наибольшим количеством голосов
Тапан Чандра
1
Мне нравится ответ, который я могу просто вырезать и вставить. А также четко объясняет, в чем проблема на самом деле.
Даррел Ли
эти функции прекрасно работают для меня! помните, что для того, чтобы cygwin перезагрузил ваш .bashrc, вам придется перезапустить cygwin, ИЛИ записать source ~/.bashrc- иначе cygwin все равно будет использовать старую версию bashrc, которая была на диске при запуске cygwin. - проверено Cygwin version 2.8.1 (64 bit)- версия 2017 года
hanshenrik
Почему этот ответ никогда не принимался?
асмит
26

Вы можете изменить это с помощью управляющей последовательности xterm, например так:

echo -ne '\e]0;Title\a'

См. Http://code.google.com/p/mintty/issues/detail?id=241.

Джеймс Фу
источник
4
Не имеет никакого эффекта для меня: / Может быть, этот трюк сломался в последние 6 месяцев?
Вольтрево
Вы используете Bash?
Джеймс Фу,
2
Это не имеет никакого эффекта при выдаче изнутри экрана.
Ярослав Рахматуллин
10
Возможно, проблема в том, что командная строка уже настроена для обновления заголовка (например, с текущим путем), поэтому команда работает, но она неожиданно перезаписывается приглашением.
Андреа Полчи
2
Чтобы проверить это "echo -ne '\ e] 0; Title \ a' && cat". Этот метод предотвращает немедленное восстановление запроса. (Если это сработает, вы можете изменить PS1 в своем профиле, как описано в других ответах)
Кертис
3

Поместите это в .zshrc:

# Change title of MinTTY to current dir
function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function chpwd() {
    settitle $(cygpath -m `pwd`)
}

Последовательность спецсимволов в функции урегулирования заставляет MinTTY изменять заголовок окна.

В zsh , если вы определите функцию со специальным именем chpwd, она будет вызываться после каждого chdir .

Работает на WinXP, с Cygwin 1.7 и MinTTY под управлением zsh.

Леонель
источник
Также работает в WSL (за исключением Cygpath, конечно): settitle "$(pwd)@$HOST"
zzxyz
2

В bash переменная PROMPT_COMMAND может содержать множество команд, разделенных точками с запятой. Вы можете использовать это, чтобы сделать ту же самую настройку заголовка, как описано в другом ответе, который говорит о zsh.

неровный
источник
2
1) эхо $ PS1 и скопируйте эту строку в буфер обмена или текстовый редактор, как в
   echo $ PS1
2) отредактируйте ~ / .bash_profile и добавьте код оболочки ниже, при необходимости заменив $ PS1, но оставьте переменную $ {TERMINAL_TITLE} в «ложном» состоянии.
3) Сохраните файл и установите переменную окружения TERMINAL_TILE, как в
   export TERMINAL_TITLE = "Мой пользовательский заголовок"
4) Источник вашего профиля Bash, как в
   , ~ / .Bash_profile
наслаждаться

if [-z "$ {TERMINAL_TITLE}"]
тогда
  PS1 = '\ [\ e] 0; \ w \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \] \ n \ $ '
еще
  PS1 = '\ [\ e] 0; $ {TERMINAL_TITLE} \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \] ] \ n \ $ '
фи
орбита Эндрюс
источник
1

Я использовал ответ Леонеля, но обнаружил, что заголовок будет мерцать только при этом, что означает, что по крайней мере команда echo работает так, как задумано. Я запустил zsh в интерактивном режиме с включенным режимом отладки, используя

zsh -xv

Изменение каталога, очевидно, вызывает другую функцию, которая вызывается title()после, precmd()и chpwd()эффективно их переопределяет. Поэтому я подключил это к моему .zshrc, и это сработало.

function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}

Если вы предпочитаете использовать chpwd()или precmd()вместо этого, просто отключить функцию заголовка: title(){}.

user239512
источник
1

Просто хотел поделиться своим решением, так как я использую mintty для выполнения скрипта.

Мой мятный ярлык настроен как:

C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /usr/bin/bash.exe -l -c /scripts/connect.sh

Сценарий connect.sh, который я написал и который вызывается в ярлыке выше, предложит мне указать сервер, к которому я хочу подключиться, и выполнить функцию разрешений, определенную в сценарии.

connect.sh

#!/bin/bash

echo "Enter servername when prompted"
echo -n "servername: " 
read servername
function settitle() {
    echo -ne "\033]2;"$servername"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}
settitle
ssh my_username@$servername
user273306
источник
Почему вы определяете функцию, titleесли не используете ее?
Пабук
0

попробуйте добавить это в .bash_profile

export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}:${PWD/#$HOME/~}\007"'

Меня устраивает.

netawater
источник
2
Речь идет об изменении заголовка окна, а не командной строки.
Кенорб
1
пожалуйста, добавьте это в .bash_profile, это нормально для изменения названия, спасибо!
netawater