bash提示 w路径仅以单一字符为前缀



我如何从这些提示中更改bash提示:

eric@mal:~/go/src/github.com/eduncan911/podcast/vendor/github.com/pkg/errors $
eric@mal:~/code/eduncan911.github.io/source/blog/archives/images/letsencrypt-ssl $

这样更简洁的类似VIM的缓冲区显示:

eric@mal:~/g/s/g/e/p/v/g/p/errors $
eric@mal:~/c/e/s/b/a/i/letsencrypt-ssl $

(我知道,vim缓冲区显示完整的文件名和前缀所有目录。但是,由于在bash提示中我们正在谈论目录,我想显示最后一个目录的全名。

这里有许多自定义,我可以找到并包括:

  • 如果在我的主目录中,则将目录的前缀为~/
  • 带有最后一个目录路径的全名的后缀路径。
  • 隐藏目录将使用2个字符,并显示为/g/s/g/.a/.b./.c/x/y/z

我相信我可以弄清楚这些调整。

我只是不知道该如何在bash提示下有效地进行此操作。基本上,如何动态地获取路径,遍历每个目录名称,以第一个char前缀 - 除非我们将显示整个目录名称的最后一个目录。

/tr;dr

我使用很长的目录名称,它消耗了我的绝大部分提示。

我不想使用W,就像我有多个重复的名称目录一样。

VIM向我展示了缓冲区名称中的缩写路径,这对我来说很好:

因此,我的目标是在我的bash提示中复制它。

我尝试做这样的事情:

function __prompt_get_dir {
  echo $(pwd | sed "s:$HOME/go/src/github.com/:/g/s/g/:" | sed "s:$HOME:~:" )
}

,但这只是一个,它不会随着我想缩短的所有不同目录而缩放。

我想我需要循环穿过$(pwd),基于/分开每条路径,拿第一个字符,然后重建字符串。

但是有更有效的方法吗?我不知道的一些bash-zen吗?

我想在我的bash提示中默认为所有目录做到这一点。

我认为这可以做你想要的?

nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $ cat foo.sh
#!/bin/bash
function __prompt_get_dir () {
  local path="$PWD"
  path="${path//~/~}"
  local out=""
  local i=0
  for (( i=0; i<${#path}; i++ )); do
    case "${path:i:1}" in
      ~) out+="${path:i:1}" ;;
      /) out+="${path:i:2}"; continue ;;
      *) continue ;;
    esac
  done
  __abbrev_path="${out:0:-1}${path##*/}"
}
export PROMPT_COMMAND="__prompt_get_dir"
export PS1="u@h:$__abbrev_path $ "
nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $ pwd
/home/nicolaw/code/eduncan911.github.io/source/blog/archives/images/letsencrypt-ssl
nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $ echo $HOME
/home/nicolaw
nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $ echo ~
/home/nicolaw
nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $ cd ..
nicolaw@sansa:~/c/e/s/b/a/images $ cd letsencrypt-ssl/
nicolaw@sansa:~/c/e/s/b/a/i/letsencrypt-ssl $

我认为这应该是相当轻的重量,所有考虑的事情。它没有分配任何外部二进制文件,并且是纯bash,因此应该相对较快。

**更新以使用评论中的改进。

如果我正确理解了这个问题,则应该有效

PS1=$'$(perl -e '$p=$ENV{"PWD"};$p=~s/^$ENV{"HOME"}/~/;$p=~s{/(.)[^/]+(?=/)}{/$1}g;print "$pn" ')'

运行一个perl过程并进行一些基本的替代,因此我不会想象它是非常密集的。

bash功能以防您在烤面包机上运行。

get_path(){
    x=()
    while read -r -d/ i;do 
        if [[ $i ]];then
            [[ $i = ~~ ]] && x+=("${i:0:1}") || x+=("/${i:0:1}")
        fi 
    done <<< "${PWD/~/~~/}"
    [[ $PWD != $HOME ]] && x+=("/${PWD##*/}")
    printf "%s" "${x[@]}"
}

这是我使用的:

function crunch_pwd {
        local lpwd="$PWD"
        [[ $PWD = ${HOME}* ]] && lpwd="~${lpwd#$HOME}"
        while [[ $lpwd =~ (.*)(/[._]?[a-z0-9])[a-z0-9._-]+(/.*) ]]; do
                lpwd="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
        done
        printf '%s' "$lpwd"
}

然后,您在提示符中的ESC命令替换中参考此功能。每当需要显示提示时,$PS1变量都会重新评估。

export PS1='u@h:$(crunch_pwd) $ '

就个人而言,我喜欢同一事物的更丰富多彩的版本:

export PS1='[33[01;32m]u@h[33[00m]:[33[01;34m]$(crunch_pwd)[33[00m] $ '

最新更新