如何使用三个最近的文件夹设置提示../c/Users/test

时间:2018-05-27 02:34:10

标签: bash zsh oh-my-zsh zshrc

以下是一个示例:../c/Users/test

我仍然不知道如何实现这个zsh的提示,如果可能的话,它也会在bash中如何实现?

编辑:nearest表示我的pwd将显示为:/home/abc/c/Users/test。 如果我在/home/abc/c/home/abc/home下,则提示应为/home/abc/c>/home/abc>/home>

因此,只有超出三个文件夹的当前路径才会在前面添加..和三个nearest文件夹。

2 个答案:

答案 0 :(得分:1)

这似乎可以解决问题:

$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5

例如:

PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):'

工作原理:

jasen@gonzo:/var/spool/news/comp/lang/c/moderated$ PS1='$(pwd|sed -r "sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" ):' ../lang/c/moderated:cd /home/jasen: 已展开以生成提示。

我使用命令替代PS1 ... $(将命令输出插入提示符。

命令本身就是一个管道

首先)显示当前目录

它的输出在扩展(pwd)正则表达式模式下通过管道传输(|)到sed。 sed被赋予命令。

-r

这是一个"sx.+(/[^/]*/[^/]*/[^/]*)\$x..\1x" 替换命令

在此命令中,s后面的符号是我使用的分隔符s   短语x表示零或多个非斜杠的海序(如目录名称),而其他斜杠[^/]*表示实际斜杠,/匹配任何东西(但不是没有)。而.+代表行尾。

所以从美元开始它会匹配像$

这样的行

第二个X之后的位,它表示/name/name/name是替换匹配的内容。在这种情况下..\1后面跟着括号模式匹配的位中包含的位。 ..

答案 1 :(得分:1)

ZSH

zsh中,这可以通过内置功能完全实现。你只需要放置

%(4/|../%3d|%d)

在您的PROMPT参数中(也称为PS1)。

例如:

PROMPT='[%m@%n %(4/|../%3d|%d)]%# '

会得到类似

的东西
[abc@machine ../c/Users/test]% 

当前目录为/home/abc/c/Users/test

<强>解释

  • %(x|true-text|false-text)x表示测试,如果评估为 true ,则zsh将打印出的内容为 true-text 否则会打印 false-text
  • 如果当前绝对路径至少有4个元素,则
  • 4/ true 。例如/home/abc/c/Users/test有5个元素
  • 因此,如果当前路径有4个或更多元素,则输出为../%3d,其中%3d将替换为当前路径的最后3个元素。例如../c/Users/test
  • 如果当前路径少于4个元素,则输出为%d,将替换为完整的当前路径。

BASH

方法1:简单但不完美匹配

bash(从版本4开始),您可以通过设置PROMPT_DIRTRIM=3并将\w置于PS1来获得非常相似的结果。这也只会显示当前路径的最后3个元素,前面有~/.../.../。这取决于当前目录是否在用户的主目录中。

例如:

PS1='[\u@\h \w]\$ '
PROMPT_DIRTRIM=3

会帮你的

[abc@machine ~/.../c/Users/test]$ 

当前工作目录为/home/abc/c/Users/test

[abc@machine .../share/doc/sometool]$

当前工作目录为/usr/local/share/doc/sometool

方法2:复杂但按要求工作

要获得完全匹配,请在PS1中添加以下内容:

$(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})

例如

PS1='[\u@\h $(a=${PWD%/*} a=${a%/*} a=${a%/*}; echo ${PWD/#$a/${a:+..}})]\$ '

重要事项:至少生成路径输出的部分需要完全引用,例如被单引号包围。否则,它将在定义时进行评估,而不是在显示提示时进行评估。

<强>解释

  • $(command):这称为命令替换。它将运行command,然后由结果输出替换。
  • 参数PWD包含当前工作目录。
  • a=${PWD%/*}/*的最短匹配将从$PWD的末尾删除,结果值将分配给参数a。也就是说,最后一个路径元素将从$PWD中删除。
  • a=${PWD%/*} a=${a%/*} a=${a%/*}:这会删除$PWD中的最后三个路径元素。如果$PWD包含三个或更少的元素,那么a将在结尾处为空。如果有三个以上的元素,则a包含您不希望显示的所有元素,即您要用..替换的元素。

    注意:虽然a=${PWD%/*/*/*}也删除了最后三个路径元素,但如果少于三个元素,则它不会按预期工作。在这种情况下,{{1}结束1}}与$PWD不匹配,不会删除任何内容,/*/*/*$a相同。)

  • $PWD:如果${a:+..}已定义且不为null,则会被a替换,否则不会替换任何内容。这意味着如果要删除路径元素,则..将评估为${a:+..}
  • ..:如果${PWD/#$a/${a:+..}})的开头与$PWD匹配,那么它将被$a的子结构替换。基本上,如果${a:+..}包含任何路径元素,则它们将被a替换,否则不会更改任何内容。
  • ..:由于这一切都发生在命令替换中,因此需要echo才能输出缩短的路径。