【发布时间】:2011-03-30 16:47:01
【问题描述】:
我实现了一个提示路径缩短器,以便将 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
}
【问题讨论】:
-
我注意到你有
parse_git_branch- 你更喜欢__git_ps1吗? -
真的,只要有人花时间去做,我怀疑任何东西都比不上不可读但简短的 perl 解决方案。
-
@Jefromi:这只是一个班轮:
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [git:\1]/'。顺便说一句:我的解决方案是 ruby,而不是 perl。虽然是单行的,但也很可读。 -
查看此解决方案:unix.stackexchange.com/a/26860/6128 不完全符合要求,但很容易修改。
-
允许 awk、perl、ruby 和 python 不是这个挑战的好主意:提示不能只是代码短,它应该在加载的外部程序(fork+exec)中保持轻量级快。