bash: перенос строки с причудливым PS1, который выполняет позиционное эхо - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть что-то вроде этого в моем скрипте входа, который держит $ foo в правом верхнем углу моего терминала.Это работает, но с оговоркой.Если я наберу действительно длинную команду, она не переносится.(Ну, он будет перенесен, если его длина больше двух строк, но 2-я строка перезаписывает первую строку, если это имеет смысл.)

Кто-нибудь знает, как я могу сделать bash wrap (т.е. вставить новую строку) в$ POS?Или даже в $ COLUMNS?

trunc_pwd () { # See http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x783.html
   local pwdmaxlen=50 # Number of $PWD chars to keep
   local trunc_symbol="<" # Prepend to truncated $PWD
   if (( ${#PWD} > $pwdmaxlen )); then
      local pwdoffset=$(( ${#PWD} - $pwdmaxlen ))
      echo "${trunc_symbol}${PWD:$pwdoffset:$pwdmaxlen}"
   else
      echo ${PWD} | sed "s%^${HOME}%~%g"
   fi
}

foo="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

get_pos ()
{
   POS=$((COLUMNS-(${#foo}+4)))
}

if [[ ${PS1} ]]; then
   PROMPT_COMMAND='get_pos ; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:$(trunc_pwd)"; echo -ne "\007"'
   export PS1="\u@\h \W \$ \[\e[s\]\[\e[1;\$(echo -n \${POS})H\]$foo\[\e[u\]"
fi

1 Ответ

3 голосов
/ 30 сентября 2011

Bash использует экранирование \[ и \] в приглашении, чтобы определить длину строки и место для переноса. Если вы добавляете что-то, что не должно влиять на длину строки (escape-последовательности, $ foo и т. Д.), С теми, с кем у вас все должно быть в порядке.

Я не уверен, почему ваша подсказка не работает (и я не распознаю некоторые escape-последовательности, такие как \ e [s, возможно, вы используете что-то отличное от vt100), моя попытка работает просто штраф:

PS1='\[\e7\e[0;$((COLUMNS-(${#foo})))H$foo\e8\][\u@\h \W]\$ '

на самом деле пересматривает ваш, это может сработать, если вы измените PS1 на

PS1="\u@\h \W \$ \[\e[s\e[1;\$(echo -n \${POS})H$foo\e[u\]"

То есть, оборачивая \[ ... \] вокруг всего нестандартного материала.

...