W systemie z Ubuntu 14.04 i bash
mam PS1
zmienną kończącą się następującą zawartością:
\u@\h:\w\$
tak, że monit pojawi się jako
user@machinename:/home/mydirectory$
Czasami jednak bieżący katalog ma długą nazwę lub znajduje się w katalogach z długimi nazwami, tak więc wygląda to na monit
user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$
Spowoduje to wypełnienie linii w terminalu, a kursor przejdzie do innej, co jest denerwujące.
Chciałbym zamiast tego uzyskać coś takiego
user@machinename:/home/mydirectory1/...another_long_name$
Czy istnieje sposób zdefiniowania PS1
zmiennej w celu „zawinięcia” i „zagęszczenia” nazwy katalogu, tak aby nigdy nie przekraczać określonej liczby znaków, otrzymując krótszy monit?
Odpowiedzi:
Przede wszystkim możesz po prostu zmienić za
\w
pomocą\W
. W ten sposób wypisywana jest tylko nazwa bieżącego katalogu, a nie cała ścieżka:To może wciąż nie wystarczyć, jeśli sama nazwa katalogu jest za długa. W takim przypadku możesz użyć
PROMPT_COMMAND
do tego zmiennej. Jest to specjalna zmienna bash, której wartość jest wykonywana jako polecenie przed wyświetleniem każdego monitu. Tak więc, jeśli ustawisz tę funkcję na ustawienie żądanego monitu na podstawie długości ścieżki bieżącego katalogu, możesz uzyskać oczekiwany efekt. Na przykład dodaj te wiersze do~/.bashrc
:Efekt wygląda następująco:
źródło
Dodanie zwrotu postaci jest moim głównym rozwiązaniem
Mój monit (który zawiera także inne elementy, dzięki czemu jest jeszcze dłuższy) wygląda następująco:
Zauważysz, że $ jest zwracany jako nowa linia
Osiągam to dzięki
Zauważ, że nawet w osobnym wierszu bardzo długie drzewa katalogów, takie jak
/home/durrantm/Dropbox/96_2013_archive/work/code/ruby__rails
są skrócone dotzn. „3 górne katalogi / _ / dolne dwa katalogi”, co zwykle mnie obchodzi
Dzięki temu linia nigdy nie będzie zbyt długa z powodu długości drzewa katalogów. Jeśli zawsze chcesz mieć pełne drzewo katalogów, po prostu dostosuj LOCATION, tj
źródło
$
? (Zobacz to .)Utworzono ~ / .bash_prompt:
Dodano w moim ~ / .bash_profile:
Dane wyjściowe to:
źródło
Nie rozwiązaniem skracania długich ścieżek, ale wygodnym sposobem uzyskania lepszego przeglądu przy jednoczesnym zachowaniu widoczności wszystkich informacji o ścieżce jest dodanie nowej linii przed ostatnim znakiem. W ten sposób kursor zaczyna się zawsze w tej samej kolumnie, nawet jeśli ścieżka jest wystarczająco długa, aby się owijać, ale okno (okna) konsoli powinny być wystarczająco wysokie, aby nie przewijać zbyt szybko poprzednich linii. Usunąłem kody kolorów dla większej przejrzystości:
źródło
Używam tego, owija się na wiele linii i wcięć o długości,
user@host
więc zakłada, że prądPS1
jest efektywny '\u@\h:\w$
'. Nie obcina ścieżki i dostosowuje się do bieżącej szerokości terminala. Dzieli tylko ścieżkę/
, więc elegancko nie radzi sobie z naprawdę długimi katalogami (ale zachowuje przestrzeń do selekcji / kopiowania). Zapewnia to, że zawsze masz do dyspozycji co najmniej 20 znaków.Działa to poprzez usunięcie magii
\w
(pasuje tylko\w$
do tego)PS1
i zastąpienie jej$PWD
, a następnie zawinięcie w zwykły ciąg znaków. Przelicza się zaPS1
każdym razem od oryginalnej wartości, która jest zapisana_PS1
, co oznacza, że zachowane są również „niewidoczne” znaki ucieczki, mój pełny oryginalny ciąg zachętyxterm
i pogrubiony monit:Końcowy wynik to 80-kolumnowy terminal:
Działa to od wersji bash-3.2
printf -v var
. Ze względu na różne złożoności będzie wymagać dostosowania w przypadku innych odmianPS1
.(Ścieżka na pasku tytułu Xtermu nie jest ani zawijana, ani skrócona, co można zrobić, włączając jedną z pozostałych odpowiedzi tutaj do powyższej funkcji.)
źródło
Alternatywnie, w moim .zshrc skracam do pierwszej litery każdego katalogu, jeśli szerokość piksela przekracza określoną szerokość:
staje się:
Oto funkcja zsh, aby to zrobić:
Faktycznie używam tego do aktualizacji tytułu terminalu, dzięki czemu przy wielu kartach mogę prosto sprawdzić, która karta jest która. Pełny plik .zshrc, aby to zrobić, znajduje się tutaj .
Jest to bardzo przydatne, ponieważ utrzymuje kontekst, a w zsh pozwala szybko tabulować uzupełnienie katalogu w tym samym formacie. (np. pisanie
cd /h/m/s/<tab>
zostanie automatycznie uzupełnionecd /home/mydirectory1/second_directory
)źródło
Spróbuj użyć tego skryptu Python . Odcina poszczególne sekcje nazwy ścieżki, dokładnie tak, jak chciałeś w swoim pytaniu. Wykorzystuje także elipsę Unicode, która zajmuje tylko jedną kolumnę zamiast trzech.
Przykładowe dane wyjściowe dla Twojej ścieżki (gdy podano limit 30 znaków):
Warto zauważyć, że to rozwiązanie poprawnie obsługuje Unicode w nazwach katalogów za pomocą
wcswidth
.${#PWD}
, których użyły inne odpowiedzi, źle oceni szerokość wizualną dowolnej ścieżki zawierającej znaki UTF-8.źródło