Skróciłeś bieżący katalog w linii poleceń?

23

vim ma naprawdę fajną funkcję, którą wykorzystuje na swoich ścieżkach, gdy są nieco długie:

wprowadź opis zdjęcia tutaj

Skraca ścieżkę do dokumentu w zakładce u góry. Czy istnieje sposób na zrobienie czegoś podobnego do tego, aby mój monit bash nie wyglądał tak:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 
Naftuli Kay
źródło
2
Więc czego chcesz rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealnie, używając pewnego progu dla maksymalnej długości pytania?
nicerobot
Właśnie tego szukam.
Naftuli Kay
Ok, podałem swoją odpowiedź.
nicerobot

Odpowiedzi:

14

Wypróbuj to :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

lub czysty bash:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

następnie

PS1='\u@\h ${PS1X} $ '

produkuje (zwróć uwagę ~na ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Poprawiłem swoją odpowiedź dzięki @ enzotib's

nicerobot
źródło
1
Czy możesz podać przykład, jak wyglądałoby to na monit dla potomności?
Naftuli Kay
(0) Twój link github jest uszkodzony. (1) Możesz przyjrzeć się bliżej $PWD~testowi. Obecnie, jeśli HOMEjest /home/edi PWDjest /home/edwina, masz ~winawersję Perla i ~/inawersję powłoki. (2) Twój kod powłoki dusi się, jeśli bieżący katalog zawiera znaki wieloznaczne (tj. Rozwinięcie nazwy ścieżki); np . PWD= /abc/*/def. Możesz to naprawić, dodając set -o nogloblub set -f. … (Ciąg dalszy)
G-Man mówi „Przywróć Monikę”
(Ciąg dalszy)… (3) Nie potrzebujesz prawie tak wielu aparatów ortodontycznych. W poleceniu Perl $HOME(wewnątrz podwójnych cudzysłowów) i $PWDsą wystarczająco dobre. W polecenia powłoki, ostatnie trzy referencje zmienne powłoki są w porządku, ale pierwsze trzy mogą być "${PWD#$HOME}", "$PWD"i "$p". (4) Zobacz także odpowiedź mbentley i moje komentarze na ten temat.
G-Man mówi „Reinstate Monica”
15

Podobne do odpowiedzi @nicerobot, ale nieco krótsze:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Spowoduje to wyświetlenie następującego przykładowego wyniku:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$
enzotib
źródło
13

Lubię PROMPT_DIRTRIMw bash ...

export PROMPT_DIRTRIM=2

zmieni przykładowy monit na ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Mi to pasuje.

BentFX
źródło
Nie robi tego, o co prosił, ale dziękuje za poinformowanie mnie o tej funkcji.
nicerobot,
3
@nicerobot Tak, miałeś prawdziwą odpowiedź. :) Wiem, że nie podaje skrótu, o który prosił, ale często, gdy widzimy proste opcje, zmieniają się nasze oczekiwania. Poza tym jest standardem i dlatego uważam, że zasługuje na wzmiankę.
BentFX,
1
Uważam, że jedną z funkcji SE jest nie tylko zapewnienie idealnej odpowiedzi na pytanie, ale także zapewnienie innych opcji dla PO i innych, którzy znajdą pytanie poprzez wyszukiwanie. Zwróć uwagę na kontekst odpowiedzi, który podałem „Lubię… działa dla mnie”. Nadal niektórzy uważają, że zasługuje na głos w dół.
BentFX,
Wydaje mi się, że głosowane są odpowiedzi, które nie odpowiadają bezpośrednio na pytanie, ale zgadzam się z Tobą, że dostarczenie alternatyw może być prawidłową odpowiedzią lub odpowiedzią .
nicerobot,
Odpowiedź BentFX nie odpowiada na pytanie OP jako całości, ale dokładnie na temat Skrócony katalog bieżący w wierszu poleceń? który jest prawdopodobnie dla większości odwiedzających ten temat dokładnie tego, czego szukają.
TNT
4

Dodając do odpowiedzi enzotib , następujący fragment kodu :

  1. Konwertuj /Path/To/Your/Home/na ~/(więc ~/a/b/czamiast ścieżki będzie/P/T/Y/H/a/b/c )
  2. Użyj pierwszej litery „pliku kropkowego” zamiast pokazywać tylko kropkę ( /a/./c/dstanie się /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Upewnij się, że używasz pojedynczych cudzysłowów, bo bash przedwcześnie go rozwinie.

renlo
źródło
3

Format do użycia w twoim PS1jest \W(zobacz PROMPTINGsekcję na bashstronie man).

PS1="\u@\h \W\$ "

I możesz przeczytać inne opcje tam, możesz zrobić fajne rzeczy za pomocą wiersza poleceń.

Kevin
źródło
2
Myślę, że \ W wcale nie robi tego, o co prosi.
nicerobot
1
@nicerobot Nie podaje pierwszego inicjału każdego elementu ścieżki, ale podaje bieżący katalog roboczy w krótszy sposób. Jestem prawie pewien, że nie można skrócić katalogu w ten sposób bez użycia jakiegoś raczej brzydkiego skryptu wykonanego przy każdym znaku zachęty. Zobaczymy, co on ma do powiedzenia na ten temat.
Kevin
1

Uwielbiam wyniki z przykładu nicerobota, ale znalazłem jeden problem. Mam katalog, w którym znajduje się łącznik A-E, i był postrzegany -Ejako argument do tego, printfkiedy był to mój bieżący katalog roboczy. Aby to naprawić, dodałem --do ostatniego printfi dodałem cudzysłowy wokół wyjścia, na wypadek gdyby nie było nic do wyjścia:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"
Mbentley
źródło
(1) Dobry chwyt w kwestii nazwy katalogu zawierającego -jako drugi znak. Chociaż prawdą --jest, że jest to ogólne rozwiązanie problemu argumentów rozpoczynających się od -, lepszym sposobem printfjest powiedzieć printf "%s" "${q:1}", ponieważ chroni to również przed zawieraniem argumentów %. (Na przykład spróbuj PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Zobacz także moje komentarze do odpowiedzi nicerobota.
G-Man mówi „Przywróć Monikę”