3

В bash для отображения названия текущей программы в строке жесткого экрана GNU Screen требуется всего две строки конфигурации. Сначала скажите экрану, как обычно выглядит конец вашей подсказки, и укажите заголовок по умолчанию для окна, когда вы сидите в оболочке:

shelltitle "$ |bash"

Затем поместите эту escape-последовательность в переменную PS1 перед символами, которые обычно заканчивают приглашение '$ ' в этом случае: \033k\033\\

Эта техника работает, в точку. Заголовок окна hardstatus обновляется до имени запущенной в данный момент программы, а затем переключается обратно на заголовок по умолчанию вскоре после завершения выполнения. Однако одной из основных проблем является то, что эта escape-строка сама по себе не экранирована, что вызывает проблемы переноса строк с командами длиннее начальной строки.

Это было раздражающим, поэтому я отправился на поиски решения. Оказывается, простое экранирование предыдущей escape-последовательности исправляет перенос строки: \[\033k\]\[\033\\\]

Большой! Заголовок моего окна со статусом hardstatus по-прежнему обновляется до имени запущенной в данный момент программы, и теперь мои более длинные команды правильно переносятся на вторую строку. Однако, с этой новой escape-последовательностью в моем PS1, экран обновляет заголовок окна с помощью фактической команды, которую я печатаю, а не просто имя текущей программы после ее выполнения.

Мне интересно, кто-нибудь получил это работает правильно - то есть перенос строки и правильное обновление заголовка окна hardstatus?

1 ответ1

4

Я не думаю, что экран является подходящим местом для обновления этой копии. Это действительно легко сделать из ваших конфигов оболочки. Вы можете определить функцию preexec() в вашем файле shellrc, которая отправляет подробную информацию о том, что он собирается запустить, прежде чем он это сделает. Вы можете распечатать оттуда, чтобы сказать экран, чтобы изменить текущий заголовок окна. Я использую zsh, а не bash, поэтому ваш пробег будет меняться, но я знаю, что там тоже можно делать то же самое. Для справки в моем файле zshrc у меня есть что-то вроде этого:

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\\"
}

# If in screen, blank the window title when displaying the prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\\"
}

На самом деле я делаю некоторую очистку команды, прежде чем отображать ее в качестве заголовка. Например, вы можете использовать print -Pn "^[k`echo $2|perl -pne 's!\s.*/! !g'|cut -c1-16`^[\\" в preexec() выше, чтобы показать намного более чистую информацию о том, что будет запущено. Это удаляет пути только к последнему компоненту и делает несколько трюков ниндзя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .