Обрезка длинных строк в zsh

Обрезка длинных строк в zsh

Я хотел бы установить подсказку на что-то вроде %1~ \#, которая будет показывать текущий каталог без полного пути (за которым следует %или #). Но если имя каталога длинное, мне не нужно его все. Как ограничить его, скажем, 8 символами? Есть ли в zsh встроенная возможность для этого или нужно использовать какой-то внешний инструмент?

решение1

Чтобы обрезать имя каталога, попробуйте:

PS1='%8>..>%1~%<< %# '

Пример: теперь каталог Wow longdirnameislongбудет отображаться в приглашении как:

Wow lo.. % 

man 1 zshmiscговорит:

УСЛОВНЫЕ ПОДСТРОКИ В ЗАПРОСАХ

%<string< %>string> %[xstring]

Задает поведение усечения для оставшейся части строки приглашения. Третья, устаревшая, форма эквивалентна %xstringx, т.е. x может быть <или >. Строка будет отображаться вместо усеченной части любой строки; обратите внимание, что это не подвергается расширению приглашения.

Числовой аргумент, который в третьей форме может появляться сразу после [, указывает максимально допустимую длину различных строк, которые могут быть отображены в приглашении. В первых двух формах этот числовой аргумент может быть отрицательным, в этом случае длина усечения определяется путем вычитания абсолютного значения числового аргумента из количества позиций символов, оставшихся в текущей строке приглашения. Если это приводит к нулевой или отрицательной длине, используется длина 1. Другими словами, отрицательный аргумент обеспечивает то, что после усечения по крайней мере n символов остаются перед правым полем (левым полем для RPROMPT).

Формы с < truncate слева от строки и формы с >truncate справа от строки. Например, если текущий каталог — /home/pike, приглашение %8<..<%/будет расширено до ..e/pike. В этой строке конечный символ ( <, >или ]), или фактически любой символ, может быть заключен в кавычки с предшествующим \; обратите внимание, что при использовании print -P, однако, это должно быть удвоено, так как строка также подлежит стандартной обработке печати, в дополнение к любым обратным косым чертам, удаленным строкой в ​​двойных кавычках: поэтому наихудшим случаем является print -P "%<\\\\<<...".

Если строка длиннее указанной длины усечения, она будет отображена полностью, полностью заменив усеченную строку.

Часть строки приглашения, которая должна быть усечена, доходит до конца строки, или до конца следующей охватывающей группы конструкции %(, или до следующего усечения, обнаруженного на том же уровне группировки (т. е. усечения внутри a %(являются отдельными), в зависимости от того, что произойдет раньше. В частности, усечение с аргументом ноль (например, %<<) отмечает конец диапазона строки, которая должна быть усечена, при этом усечение отключается с этого момента. Например, приглашение %10<...<%~%<<%#выведет усеченное представление текущего каталога, за которым следует %или #, за которым следует пробел. Без %<<эти два символа были бы включены в строку, которая должна быть усечена. Обратите внимание, что это %-0<<не эквивалентно , %<<но указывает, что приглашение усекается по правому краю.

Усечение применяется только в пределах каждой отдельной строки приглашения, разделенной встроенными символами новой строки (если таковые имеются). Если общая длина любой строки приглашения после усечения больше ширины терминала или если часть, которая должна быть усечена, содержит встроенные символы новой строки, поведение усечения не определено и может измениться в будущей версии оболочки. Используйте %-n(l.true-text.false-text)для удаления частей приглашения, когда доступного места меньше n.

решение2

Это просто!

       %d
       %/     Current working directory.  If an integer follows the `%', it spec‐
              ifies a number of trailing components of the current working direc‐
              tory to show; zero means the whole path.  A negative integer speci‐
              fies leading components, i.e. %-1d specifies the first component.

       %~     As %d and %/, but if the  current  working  directory  starts  with
              $HOME,  that  part  is  replaced by a `~'. Furthermore, if it has a
              named directory as its prefix, that part is replaced by a `~'  fol‐
              lowed  by  the  name  of  the  directory, but only if the result is
              shorter than the full path; see Dynamic and Static  named  directo‐
              ries in zshexpn(1).

©man zshmisc

Связанный контент