Изменение заголовка, не изменяя подсказку на Cygwin

Прокрутите вниз в списке, об/мин перечислены наверху, архивы TAR внизу, пример Linux - Универсальные 2.6 (x86, 64-разрядные), Сжатый Архив TAR в нижней части списка

2
02.08.2013, 02:17
4 ответа

Добавьте

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

как длятся строку в Вашем ~/.bashrc и входят в систему снова или просто работают

source ~/.bashrc
1
27.01.2020, 22:14

Я думаю, что OP просит установить заголовок окна, в котором работает ваш эмулятор терминала. Меня смущают ссылки на PS1, так как я могу добиться этого, просто запустив это...

printf '\e]2;%s\a' "My Title"

По крайней мере, это работает с mintty 2.7 (+ Cygwin 2.8). (Возможно, за годы, прошедшие с момента первоначальной публикации вопроса, что-то изменилось.)

1
27.01.2020, 22:14

Если заголовки вообще не обновляются после входа на какой-либо SSH-сервер, попробуйте установить пакет OpenSSH из cygwin.

Для меня cygwin использовал некоторую внутреннюю версию OpenSSH для Windows 10 Pro, которая не пропускала escape-символы заголовка обратно через стек SSH.

Публикую это, чтобы кто-то не тратил на это час

1
24.03.2020, 20:44

У вас две проблемы:

  1. Переменные оболочки всегда следует заключать в кавычки. если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете. Итак, echo $PS1должно быть echo "$PS1". Это приводит к тому, что подсказка теряет пробел в конце; т. е. становится $, а не . В некоторых случаях это может вызвать другие проблемы.
  2. Bash использует \[\]для разграничения управляющих последовательностей; то есть символы, которые не отображаются на экране как часть подсказки. Это включает в себя escape-последовательность для установки заголовка окна, но также и escape-последовательности для изменения цвета в видимой подсказке (). Ваш скрипт делает

    s/ ^ \\\\\[.+ \\\\\] //g
    

    (с добавлением пробелов для ясности ). На первый взгляд, похоже, что это попытка удалитьвсе\[\]последовательности. (На самом деле, есть две причины, по которым этого не происходит. )Основная проблема в том, что .+соответствует максимально длинная строка из любых символов. Это означает, что он удаляет все с начала первой последовательности \[\]до конца последнего \[\]— другими словами, все до последнего изменения цвета.

    Мы хотим удалить только управляющую последовательность, чтобы установить заголовок окна. Обычно мы меняем .+(, где.соответствует любому символу ). в строку символов, отличных от ]. Но это осложняется тем, что управляющая последовательность для установки заголовка окнасодержитa ], поэтому нам нужно сопоставить второй ]:

    s/^\\\\\[[^]]+][^]]+\\\\\]//g
    

    Сейчас я покажу это в контексте…

  3. Это не проблема как таковая, но ``является устаревшим синтаксисом. Вместо этого рекомендуется использовать $(). В некоторых сообщениях предполагается, что они функционально взаимозаменяемы. Они не; применяются другие правила кавычек / экранирования. К счастью,в данном случае это работает в нашу пользу. Когда мы переключаемся на $(), мы можем изменить команду sed, чтобы использовать меньше обратной косой черты.
  4. Другая проблема :с использованием ключевого слова functionне рекомендуется. См. ниже предпочтительный синтаксис.

Итак, сложив воедино все вышеперечисленное, получаем вот что:

wtitle() {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=$(echo "$PS1" | sed -r 's/^\\\[[^]]+][^]]+\\\]//g')
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

Возможно, даже это не идеально. Это зависит от существующего значения PS1наличие escape-последовательности заголовка окна в первую очередь.

0
25.03.2020, 22:21

Теги

Похожие вопросы