Я также столкнулся с той же проблемой при написании с помощью TextEdit. Итак, я попробовал команду cat, и она сработала отлично.
В 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
, хотя, как правило, более верно обратное.
В более новых версиях 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 $ _
Это можно улучшить, чтобы действовать как настоящий мягкий -дефис, учитывать автоматические поля терминала и уже существующие новые строки внутри подсказки и т. д.; но это сделает его более сложным, чем оно того стоит.