我如何从这些提示中更改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] $ '