Zsh 数组的最后n个元素

Zsh 数组的最后n个元素,zsh,Zsh,我正在尝试编写一个函数,它将打印$PWD的最后3个元素,如果有3个以上的元素,则在前面加上“…” e、 g 到目前为止,这是我的代码,但是如果数组中的元素太少,$foo[-3,-1]将无法工作 function custom_pwd() { d=${PWD/#$HOME/\~} d=(${(s:/:)d}) echo $d[-4,-1] } 以下是我的想法,虽然它并不十分优雅: function custom_pwd() { local d slash d=${PWD/#$H

我正在尝试编写一个函数,它将打印$PWD的最后3个元素,如果有3个以上的元素,则在前面加上“…”

e、 g

到目前为止,这是我的代码,但是如果数组中的元素太少,
$foo[-3,-1]
将无法工作

function custom_pwd() {
  d=${PWD/#$HOME/\~}
  d=(${(s:/:)d})
  echo $d[-4,-1]
}

以下是我的想法,虽然它并不十分优雅:

function custom_pwd() {
  local d slash
  d=${PWD/#$HOME/\~}
  case $d in
    /*) slash=/ ;;
    *) slash= ;;
  esac
  d=(${(s:/:)d})
  d[1]=$slash$d[1]
  num=$#d
  ellipsis=
  if (( num > 3 )); then num=3; ellipsis='…'; fi
  echo $ellipsis${(j./.)d[-$num,-1]}
}

zsh已经有了一些漂亮的提示处理,可以使用print的-p选项。这应该可以做到:

custom_pwd() {
   d=$(print -P '%3~')
   case $d in
      ('~'*|/*) echo "$d";;
      (*)       echo "...$d"
   esac
}

有关血淋淋的详细信息,请参见
man zshmisc
“提示序列的扩展”一节。

我可能也想知道前一两个元素。
custom_pwd() {
   d=$(print -P '%3~')
   case $d in
      ('~'*|/*) echo "$d";;
      (*)       echo "...$d"
   esac
}