如果可能的话,可以前进一个目录的功能吗?

如果可能的话,可以前进一个目录的功能吗?

我使用下面的代码片段(通过按alt-h)来后退当前目录的一级。

up-dir() { 
  cd ".."
  zle reset-prompt 
}
zle -N up-dir
bindkey "^[h" up-dir

如果可能的话,我想要类似的功能来映射alt-b以前进一级。cd -如果我没有什么可以前进的,我就不应该前进。

我使用 zsh 5.8。

答案1

怎么样

down-dir() {
  if [[ $OLDPWD == "$PWD"* ]]; then
    cd -
  else
    echo "previous dir is not below the current dir"
  fi
}

答案2

你可以这样做:

up-dir() {
  set -o localoptions -o pushdsilent
  [[ $PWD != / ]] && pushd .. && zle reset-prompt
}

undo-up-dir() {
  set -o localoptions -o pushdsilent

  # pop a directory only if the current working directory matches
  # the "h"ead of the top ([1]) of the directory stack:
  [[ $dirstack[1]:h = $PWD ]] && popd && zle reset-prompt
}

zle -N up-dir
zle -N undo-up-dir
bindkey '^[h' up-dir
bindkey '^[b' undo-up-dir

请注意&&s 以确保当目录未更改时我们返回非零退出状态(这应该触发蜂鸣声或其他形式的失败反馈)。

您还可以扩展它undo-up-dir,以便当它无法再撤消时,它仍然可以查看当前目录中是否只有一个目录并进入该目录:

down-dir() {
  set -o localoptions -o pushdsilent

  # pop a directory only if the current working directory matches
  # the "h"ead of the top ([1]) of the directory stack:
  if [[ $dirstack[1]:h = $PWD ]]; then
    popd
  else
    local -a dirs
    dirs=(./*(N/Y2))
    (($#dirs)) || dirs=(./*(ND/Y2)) # try including hidden ones
    (($#dirs)) || dirs=(./*(N-/Y2)) # try including symlinks to dirs
    (($#dirs)) || dirs=(./*(DN-/Y2)) # symlinks and hidden included
    (($#dirs == 1)) && cd $dirs
  fi && zle reset-prompt
}

相关内容