bash приглашение с фиксированной шириной

Я хотел бы установить для моего приглашения bash фиксированную ширину и компенсировать разницу в пространстве перед $, поэтому, независимо от того, длинное или короткое, мое приглашение остается одинаковой ширины:

[name@host] ~/Directory/Dir...Another/LastDir $ 
[name@host] ~/Directory(branch)               $ 

В настоящее время в коротком пути к каталогу мое приглашение выглядит примерно так:

[name@host] ~/Directory(branch) $ 

более глубокий путь к каталогу выглядит так:

[name@host] ~/Directory/Dir...Another/LastDir $ 

Вы можете видеть, что я обрезал PWD посередине, чтобы я мог видеть, где путь начинается и где он заканчивается. Я хотел бы компенсировать разницу до $.

Вот моя текущая подсказка:

# keep working directory to 30 chars, center tuncated
prompt_pwd() {
  local pwd_symbol="..."
  local pwd_length=30
  newPWD="${PWD/#$HOME/~}"
  [ ${#newPWD} -gt ${pwd_length} ] && newPWD=${newPWD:0:12}${pwd_symbol}${newPWD:${#newPWD}-15}
}
# set prompt
prompt_color() {
  PROMPT_COMMAND='prompt_pwd;history -a;title_git'
  PS1="${WHITEONMAGENTA}[\u@\h]${MAGENTA} \w\$(parse_git_branch) ${MAGENTABOLD}\$${PS_CLEAR} "
  PS1=${PS1//\\w/\$\{newPWD\}}
    PS2="${WHITEONTEAL}>${PS_CLEAR} "
}

При поиске я нашел подсказку Width of Your Term, который немного заполняет, но не может заставить его работать для этого конкретного приглашения.


person seaofclouds    schedule 27.05.2010    source источник


Ответы (3)


Если ваш путь слишком короткий ([ ${#newPWD} -le ${pwd_length} ]), вы можете использовать printf(1) для его расширения.

printf -v newPWD "%-*s" $pwd_length "$newPWD"

Это выровняет строку по левому краю в $newPWD с шириной поля $pwd_length.

printf(1) встроен в bash, поэтому запускать каждое приглашение не слишком дорого.

person camh    schedule 27.05.2010

Вы можете установить переменную среды BASH_COMMAND, которая позволит вам определить подсказку вручную. Вы можете использовать expand -t, чтобы получить желаемую длину.

person Marian    schedule 27.05.2010

Что я сделал, так это поместил свой каталог и тому подобное над моим приглашением, поэтому мне не нужно об этом беспокоиться:

myusername@mybox:/home/myusername/some/directory
$ 

Таким образом, я также могу получить дополнительное преимущество, скопировав приведенную выше строку для команд SCP и SSH без добавления примера user@host:/directory.

Вот моя переменная $PS1, если хотите попробовать:

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

person Nick Klauer    schedule 27.05.2010
comment
мне это нравится, но для истинного копирования и вставки я бы хотел заключить в кавычки любые каталоги с пробелами. - person seaofclouds; 03.06.2010
comment
@seaofclouds: Да, это то, с чем мне не приходилось слишком много работать, но я понимаю, откуда вы пришли. Однако по сравнению с вводом всего вручную или редактированием нескольких пробелов с помощью \, я все же думаю, что частичное решение лучше, чем ничего. Вероятно, есть способ аннотировать это, но я недостаточно знаю о переменных PS1, чтобы сделать это (пока). - person Nick Klauer; 03.06.2010
comment
Я пытаюсь использовать ваше исправление (Ubuntu 12.04). Чтобы сделать это исправление, вы редактируете .bashrc, чтобы он имел: export PS1=[\e]0;\w\a]\n[\e[32m]\u@\h [\e[33m]\w[\ е[0m]\n\$ ? Я сделал это редактирование, а затем снова открыл bash. Однако моя подсказка не изменилась. Вы случайно не знаете, что я делаю не так? - person Malcolm; 01.03.2013
comment
В зависимости от среды вам, возможно, придется поместить эту команду export PS1= в .profile вместо .bashrc, хотя я немного туманен в деталях. На работе пользуюсь .profile, дома .bashrc. YMMV - person Nick Klauer; 01.03.2013