Directory corrente abbreviata nel prompt della shell?


23

vim ha una funzionalità davvero interessante che utilizza nei suoi percorsi quando sono un po 'lunghi:

inserisci qui la descrizione dell'immagine

Abbrevia il percorso del documento nella scheda in alto. C'è un modo per fare qualcosa di simile a questo in modo che il mio prompt di bash non assomigli a questo:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Quindi, quello che vuoi è rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealmente, usando qualche soglia per la massima lunghezza richiesta?
— Nicerobot,

Esatto, è quello che sto cercando.
— Naftuli Kay,

Ok, ho fornito la mia risposta.
— Nicerobot,

Risposte:


14

Prova questo :

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

o, bash puro:

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

poi

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

produce (notare il ~per ${HOME}):

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

Ho migliorato la mia risposta grazie a @ enzotib's


1
Puoi fornire un esempio di come questo sembrerebbe un suggerimento per i posteri?
— Naftuli Kay,

(0) Il tuo link github è interrotto. (1) Potresti dare un'occhiata più da vicino al $PWD→ ~test. Attualmente, se HOMEè /home/eded PWDè /home/edwina, si ottiene ~winanella versione Perl e ~/inanella versione shell. (2) Il codice della shell si blocca se la directory corrente contiene caratteri jolly (ovvero espansione del nome percorso); ad es . PWD= /abc/*/def. È possibile risolvere questo problema aggiungendo set -o noglobo set -f. ... (proseguendo)
— G-Man dice "Ripristina Monica" il

(Proseguendo) ... (3) Non hai bisogno di così tante parentesi graffe. Nel comando Perl $HOME(che si trova tra virgolette doppie) e $PWDsono abbastanza buone. Nel comando shell, gli ultimi tre riferimenti variabili shell sono soddisfacenti, ma i primi tre possono essere "${PWD#$HOME}", "$PWD"e "$p". (4) Vedi anche la risposta di mbentley e i miei commenti al riguardo.
— G-Man dice "Ripristina Monica" il

15

Simile alla risposta @nicerobot, ma un po 'più breve:

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

Questo mostrerà il seguente esempio di output:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

Mi piace PROMPT_DIRTRIMbash ...

export PROMPT_DIRTRIM=2

cambierà il tuo prompt di esempio in ...

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

Per me funziona.


Non fa quello che ha chiesto, ma grazie per avermi informato della funzione.
— Nicerobot,

3
@nicerobot Sì, hai avuto la vera risposta. :) So che non dà l'abbreviazione che stava chiedendo, ma spesso quando vediamo opzioni semplici le nostre aspettative cambiano. Inoltre, è standard e come tale ho ritenuto che meritasse una menzione.
— BentFX,

1
Sento che una delle funzioni di SE non è solo quella di fornire la risposta perfetta alla domanda, ma anche di fornire altre opzioni per l'OP e altri che trovano la domanda attraverso la ricerca. Nota il contesto di risposta che ho fornito "Mi piace ... funziona per me". Alcuni ancora credono che meriti un voto negativo.
— BentFX,

Io tendo a vedere le risposte scendere votati che non rispondono direttamente alla domanda, ma sono d'accordo con te che forniscono alternative possono essere una risposta o valida risposta .
— Nicerobot,

La risposta di BentFX non risponde alla domanda del PO nel suo insieme ma esattamente l'oggetto Directory corrente abbreviata nel prompt della shell? che è probabilmente per la maggior parte dei visitatori di questo argomento esattamente quello che stanno cercando.
— TNT,

4

Aggiungendo a enzotib , il seguente frammento sarà:

  1. Converti /Path/To/Your/Home/in ~/(quindi un percorso sarà ~/a/b/cinvece di/P/T/Y/H/a/b/c )
  2. Usa la prima lettera di un 'file punto' invece di mostrare solo il punto ( /a/./c/ddiventerà /a/.b/c/d):

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

Assicurati di usare virgolette singole o bash lo espanderà prematuramente.


3

Il formato da usare nel tuo PS1è \W(vedi la PROMPTINGsezione nella bashpagina man).

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

E potresti voler leggere le altre opzioni lì, puoi fare cose interessanti con la tua riga di comando.


2
Penso che \ W non faccia affatto quello che sta chiedendo.
— Nicerobot,

1
@nicerobot Non fornisce la prima iniziale di ogni componente del percorso, ma fornisce la directory di lavoro corrente in modo più breve. Sono abbastanza sicuro che non è possibile abbreviare la directory in quel modo senza usare uno script piuttosto brutto eseguito ogni prompt. Vedremo cosa ha da dire al riguardo.
— Kevin,

1

Adoro l'output dell'esempio di nicerobot ma ho riscontrato un problema. Ho una directory che contiene un trattino A-E, e stava vedendo -Ecome argomento a printfquando era la mia directory di lavoro corrente. Per risolvere questo problema, ho aggiunto --le ultime printfe aggiunte le virgolette intorno all'output nel caso in cui non ci sia nulla da emettere:

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

(1) Buona cattura del problema del nome della directory contenente -come secondo carattere. Mentre è vero che --è la soluzione generale alla questione degli argomenti che iniziano con -, un metodo migliore printfè quello di dire printf "%s" "${q:1}", poiché protegge anche dagli argomenti contenenti %. (Ad esempio, prova PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Vedi anche i miei commenti sulla risposta di Nicerobot.
— G-Man dice 'Reinstate Monica' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.