我为 bash 实现了一个提示路径缩短器,将其包含在 PS1 环境变量中,它将工作目录缩短为更紧凑但仍具有描述性的目录。我很好奇可能存在什么其他想法。
这是挑战:
创建 bash 函数_dir_chomp
可以像这样包含到 PS1 中(插入换行符以提高可读性):
PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] $(
_dir_chomp "$(pwd)" 20
)\[\033[01;37m\]$(parse_git_branch)\[\033[01;34m\] \$\[\033[00m\] '
其中“20”是作为软限制的最大长度的参数。这些是示例:
-
/usr/portage/media-plugins/banshee-community-extensions/files
变成/u/p/m/b/files
-
/home/user1/media/video/music/live-sets
变成~/m/v/m/live-sets
(注意 ~ 字符作为 $HOME 的替换)
-
/home/user2/media
不会改变(未超过 20 个字符的限制)
-
/home/user1/this-is-a-very-long-path-name-with-more-than-20-chars
变成~/this-is-a-very-long-path-name-with-more-than-20-chars
(最后一个组件保持不变:软限制)
-
/home/user1/src
变成~/src
($HOME 总是缩写)
-
/home/user1/.kde4/share/config/kresources
变成~/.k/s/c/kresources
(注意前缀点被保留)
当前用户是user1。
允许调用外部解释器,例如awk
, perl
, ruby
, python
但不编译 C 程序或类似程序。换句话说:不允许使用外部源文件,代码必须是内联的。最短的版本获胜。 bash 函数体(并称为子函数)的长度很重要,意味着:
_sub_helper() {
# this counts
}
_dir_chomp() {
# these characters count (between { and })
_sub_helper "foobar" # _sub_helper body counts, too
}
纯狂欢:
_dir_chomp () {
local IFS=/ c=1 n d
local p=(${1/#$HOME/\~}) r=${p[*]}
local s=${#r}
while ((s>$2&&c<${#p[*]}-1))
do
d=${p[c]}
n=1;[[ $d = .* ]]&&n=2
((s-=${#d}-n))
p[c++]=${d:0:n}
done
echo "${p[*]}"
}
出于测试目的,我假设该问题意味着当前用户是“user1”。
注意:Bash 4 有一个变量PROMPT_DIRTRIM
这缩短了\w
逃入PS1
根据其值保留子目录的数量并将其余部分替换为...
/$ PROMPT_DIRTRIM=2
/$ echo $PS1
\w\$
/$ pwd
/
/$ cd /usr/share/doc/bash
.../doc/bash$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)