Как настроить подсказку с тремя ближайшими папками ../c/Users/test - PullRequest
0 голосов
/ 27 мая 2018

Вот пример: ../c/Users/test

Я даже не знаю, как выполнить это приглашение zsh, если возможно, и как оно будет в bash?

РЕДАКТИРОВАТЬ: nearest означает, что мой pwd будет отображаться для: /home/abc/c/Users/test.Если я под /home/abc/c или /home/abc или /home, приглашение должно быть /home/abc/c> или /home/abc> или /home>

Так что только текущий путь, который превышает три папки, будет иметь ..добавлены спереди и три nearest папки.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

ZSH

В zsh это может быть достигнуто полностью с помощью встроенных функций.Вам просто нужно поместить

%(4/|../%3d|%d)

в свой параметр PROMPT (также известный как PS1).

Например:

PROMPT='[%m@%n %(4/|../%3d|%d)]%# '

Получит васчто-то вроде

[abc@machine ../c/Users/test]% 

, когда текущим каталогом является /home/abc/c/Users/test.

Объяснение:

  • %(x|true-text|false-text): xпредставляет тест, если он оценивается как true , он zsh напечатает то, что помещено как true-text , иначе он напечатает false-text .
  • 4/ равно true , если текущий абсолютный путь содержит как минимум 4 элемента.Например, /home/abc/c/Users/test имеет 5 элементов
  • Таким образом, если текущий путь имеет 4 или более элементов, выходной сигнал будет ../%3d, где %3d будет заменен последними 3 элементами текущего пути.Например, ../c/Users/test.
  • Если текущий путь содержит менее 4 элементов, выходной сигнал будет %d, который будет заменен полным текущим путем.

BASH

Метод 1: простое, но не идеальное совпадение

В bash (начиная с версии 4) вы можете добиться очень похожих результатов, установив PROMPT_DIRTRIM=3 и поместив \w в PS1.Это также будет отображать только последние 3 элемента текущего пути, перед которыми стоит ~/.../ или .../.Что зависит от того, находится ли текущий каталог в домашнем каталоге пользователя.

Например:

PS1='[\u@\h \w]\$ '
PROMPT_DIRTRIM=3

даст вам

[abc@machine ~/.../c/Users/test]$ 

, если текущий рабочий каталог равен /home/abc/c/Users/test и

[abc@machine .../share/doc/sometool]$

, когдатекущий рабочий каталог /usr/local/share/doc/sometool.

Метод 2: сложный, но работает в соответствии с запросом

Для точного соответствия укажите в вашем PS1:

$(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})

Например,

PS1='[\u@\h $(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})]\$ '

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

Объяснение:

  • $(command): это называется Подстановка команд .Он будет работать command и затем будет заменен полученным результатом.
  • Параметр PWD содержит текущий рабочий каталог.
  • a=${PWD%/*}: Наименьшее возможное совпадение с /* будет удалено с конца $PWD, а результирующее значение будет присвоено параметру a.То есть последний элемент пути будет удален из $PWD.
  • a=${PWD%/*} a=${a%/*} a=${a%/*}: это удалит последние три элемента пути из $PWD.Если $PWD имеет три или менее элементов, то a будет пустым в конце.Если имеется более трех элементов, то a содержит все элементы, которые вы не хотите показывать, то есть те, которые вы хотите заменить на ...

    ( Примечание : хотя a=${PWD%/*/*/*} также удаляет последние три элемента пути, он не работает должным образом, если имеется менее трех элементов. В этом случае конец $PWD не будет соответствовать /*/*/* и ничего не будет удалено, оставляя $a идентичным $PWD.)

  • ${a:+..}: если определено a и не равно null, то этобудет заменен на .., в противном случае ничего не будет заменено.Это означает, что если есть элементы пути, которые необходимо удалить, ${a:+..} будет иметь значение ...
  • ${PWD/#$a/${a:+..}}): если начало $PWD соответствует $a, то оно будет заменено наподстановка ${a:+..}.По сути, если a содержит какие-либо элементы пути, они будут заменены на .., иначе ничего не изменится.
  • echo: поскольку все это происходит в Подстановке команд , echo необходим для вывода сокращенного пути.
0 голосов
/ 27 мая 2018

это похоже на хитрость:

PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):'

например:

jasen@gonzo:/var/spool/news/comp/lang/c/moderated$ PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):'
../lang/c/moderated:cd
/home/jasen:

Как это работает:

PS1 расширяется для получения подсказки.

Я использую подстановку команд $( ... ) для вставки вывода команды в приглашение.

сама команда является конвейером

first pwd выводит текущий каталог

, его выходные данные передаются по конвейеру (|) в sed в расширенном (-r) режиме регулярных выражений.Команда sed задается командой.

"sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x"

это s команда подстановки

в этой команде символ, который следует за s - это разделитель, который я здесь использовал x фраза [^/]* указывает последовательность, состоящую из нуля или более не косых черт (например, имя каталога), в то время как другие косые черты / представляют действительные косые черты, а .+ соответствует чему-либо вообще (но не ничему).и $ представляет конец строки.

, поэтому начиная с доллара он соответствует строкам, которые заканчиваются как /name/name/name

бит после второго X, где он говорит, что ..\1 - это то, что нужнозаменить матч на.в этом случае .., за которым следует бит, содержащийся в бите, который соответствует шаблону в скобках.../name/name/name

...