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.