Добавить новую строку в приглашение, если оно слишком длинное

Я также столкнулся с той же проблемой при написании с помощью TextEdit. Итак, я попробовал команду cat, и она сработала отлично.

3
24.08.2019, 23:15
2 ответа

В zshрасширение подсказки %<number>(l:<yes>:<no>)предназначено для этого. Когда число отрицательное, например -30, если до правого края экрана осталось не менее 30 символов, то выводится текст yes, иначе no, поэтому:

PS1=$'%~%-30(l::\n)$ '

Будет вставлена ​​новая строка, если для использования в строке осталось менее 28 символов. (30 минус "$ ").

Вы можете выполнить 50 и более с помощью:

PS1=$'%~%50(l:\n:)$ '

Но ИМО, полезнее гарантировать минимальное доступное пространство, чем максимальное неиспользуемое пространство.

Подробнее см. в руководстве . Вы найдете другие директивы для усечения длинных подсказок и замены многоточием, например, которые вы также можете найти полезными.

Обратите внимание, что расширение подсказки zsh полностью отличается от bash. На самом деле он ближе к tcsh, так что решения для bashвряд ли будут полезны для zsh, хотя, как правило, более верно обратное.

5
27.01.2020, 21:11

В более новых версиях bashвы можете комбинировать PROMPT_COMMANDс формой подстановки переменных ${var@P}("расширить, как если бы это было подсказкой" ).

Вот способ сделать это. Вы просто устанавливаете OPS1вместо PS1на желаемую подсказку. Эскейп\-внутри OPS1будет действовать как мягкий дефис:он будет расширяться до новой строки, когда подсказка будет длиннее COLUMNS / 2; в противном случае он будет удален:

generate_ps1(){
    local ps1=${OPS1@P}
    if [ "${#ps1}" -gt "$((COLUMNS / 2))" ]; then PS1=${OPS1//\\-/$'\n'}
    else PS1=${OPS1//\\-/}
    fi
}
OPS1=$PS1
PROMPT_COMMAND=generate_ps1

# after this, set OPS1 instead of PS1 to the prompt you want

$ OPS1='$long_var\-\$ '
$ long_var=$(printf 'foobar %.0s' {0..21})
foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foo
bar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
$ _
$ long_var=$(printf 'foobar %.0s' {0..2})
foobar foobar foobar $ _

Это можно улучшить, чтобы действовать как настоящий мягкий -дефис, учитывать автоматические поля терминала и уже существующие новые строки внутри подсказки и т. д.; но это сделает его более сложным, чем оно того стоит.

3
27.01.2020, 21:11

Теги

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