How can I shortern my command line prompt's current directory?

前端 未结 10 1577
野趣味
野趣味 2020-11-29 17:08

I am using Ubuntu and I am tired of this long prompts in bash when I am working with some deep directory hierarchy. So, I would like to tweak my PS1 to shorten the working d

相关标签:
10条回答
  • 2020-11-29 17:36

    https://github.com/chrissound/SodiumSierraStrawberry

    Allows you to truncate a path like:

    From: /home/sodium/Projects/Personal/Sierra/Super/Long/Path/HolyAvacado

    To: »Projects/Sie…/Sup…/Lon…/Pat…/HolyAvacado/

    0 讨论(0)
  • 2020-11-29 17:37
    generatePwd(){
      set -- "`pwd | sed -e s.${HOME}.~.g`"
      IFS="/"; declare -a array=($*)
      srt=""
      count=0
      for i in ${!array[@]}; do
          # echo ${array[i]} - $i/${#array[@]}
          if [[ $i == 0 ]]; then
            srt+=""
          elif [[ $i == $((${#array[@]}-1)) ]] || [[ $i == $((${#array[@]}-2)) ]]; then
              srt+="/${array[i]}"
          else
            count=$((${count}+1))
          fi
      done
      if [[ $count != 0 ]]; then
        srt="${array[0]}/.$count.$srt"
      else
        srt="${array[0]}$srt"
      fi
      echo "${srt}"
    }
    

    export PS1

    PS1="\$(generatePwd)"
    

    Console

    $ ~/.3./machine-learning/deep-learning-computer-vision
    
    0 讨论(0)
  • 2020-11-29 17:38

    Consider this script using awk instead of sed for your case:

    pwd_length=14
    pwd_symbol="..."
    newPWD="${PWD/#$HOME/~}"
    if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ]
    then
       newPWD=$(echo -n $newPWD | awk -F '/' '{
       print $1 "/" $2 "/.../" $(NF-1) "/" $(NF)}')
    fi
    PS1='${newPWD}$ '
    

    For your example of directory ~/workspace/projects/project1/folder1/test it makes PS1 as: ~/workspace/.../folder1/test

    UPDATE

    Above solution will set your prompt but as you noted in your comment that it will NOT change PS1 dynamically when you change directory. So here is the solution that will dynamically set PS1 when you change directories around.

    Put these 2 lines in your .bashrc file:

    export MYPS='$(echo -n "${PWD/#$HOME/~}" | awk -F "/" '"'"'{
    if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF;
    else if (NF>3) print $1 "/" $2 "/.../" $NF;
    else print $1 "/.../" $NF; }
    else print $0;}'"'"')'
    PS1='$(eval "echo ${MYPS}")$ '
    

    if (NF > 4 && length($0) > 14) condition in awk will only apply special handling when your current directory is more than 3 directories deep AND if length of $PWD is more than 14 characters otherwise and it will keep PS1 as $PWD.

    eg: if current directory is ~/workspace/projects/project1$ then PS1 will be ~/workspace/projects/project1$

    Effect of above in .bashrc will be as follows on your PS1:

    ~$ cd ~/workspace/projects/project1/folder1/test
    ~/workspace/.../folder1/test$ cd ..
    ~/workspace/.../project1/folder1$ cd ..
    ~/workspace/.../project1$ cd ..
    ~/.../projects$ cd ..
    ~/workspace$ cd ..
    ~$
    

    Notice how prompt is changing when I change directories. Let me know if this is not what you wanted.

    0 讨论(0)
  • 2020-11-29 17:38

    This is what I use based on the solutions from anubhava. It sets both the prompt and the windows title. The awk script is more readable so it can be tweaked/customized easily.

    It will fold the path if it's more than 16 chars and 4 levels deep. Furthermore, it will also indicate in the ... how many directories were folded, so you get a sense of how deep the path is, ie: ~/usr/..4../path2/path1 indicates 4 levels were folded.

    # define the awk script using heredoc notation for easy modification
    MYPSDIR_AWK=$(cat << 'EOF'
    BEGIN { FS = OFS = "/" }
    { 
       sub(ENVIRON["HOME"], "~");
       if (length($0) > 16 && NF > 4)
          print $1,$2,".." NF-4 "..",$(NF-1),$NF
       else
          print $0
    }
    EOF
    )
    
    # my replacement for \w prompt expansion
    export MYPSDIR='$(echo -n "$PWD" | awk "$MYPSDIR_AWK")'
    
    # the fancy colorized prompt: [0 user@host ~]$
    # return code is in green, user@host is in bold/white
    export PS1='[\[\033[1;32m\]$?\[\033[0;0m\] \[\033[0;1m\]\u@\h\[\033[0;0m\] $(eval "echo ${MYPSDIR}")]$ '
    
    # set x/ssh window title as well
    export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"'
    

    Here's what it looks like in action. The green 0 is the return code of last command:

    0 讨论(0)
提交回复
热议问题