zsh - предварительный просмотр имен родительских каталогов при выполнении команды «cd ../../../»

zsh - предварительный просмотр имен родительских каталогов при выполнении команды «cd ../../../»

Кто-нибудь знает, как заставить zsh показать мне предварительный просмотр родительского каталога, в котором я окажусь, если нажму Enter прямо сейчас?

Например, если я нахожусь очень глубоко в дереве каталогов и начинаю вводить текст ....(который разворачивается в ../../..), я хотел бы предварительно просмотреть имя папки самого высокого уровня, в которой я окажусь, совершив эти три перехода вверх по дереву каталогов.

решение1

Я полагаю, что расширение в ....происходит ../../..на лету, поэтому у вас есть специальная привязка клавиш для .. У меня тоже, которая была вдохновлена Пост Жереми Роке о рассылке пользователей zshсписок. Я расширил эту функцию, вызванную magic-dotдля отображения пути, на который будет ссылаться вмини-буфер, т.е. ниже командной строки:

user@linux:~/foo> ls ../../
[ /home/ ]

Мой код имеет некоторые недостатки:

  1. он не оптимизирован и его действительно неудобно читать (он даже использует perlдля генерации выходных данных)
  2. он терпит неудачу, когда в игру вступают символические ссылки
  3. мини-буфер не очищается, поэтому может быть виден после выполнения команды

(Пункты 1 и 3 должны быть исправлены, но прошу прощения, что я не сделал этого прямо сейчас.)

Но в большинстве случаев у меня это работает очень хорошо, поэтому я хотел бы поделиться минимальным (не совсем?!) рабочим примером в качестве отправной точки для собственных экспериментов:

PS1="$PS1o"

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]

function zle-statusline() {
  PS1="%{${terminfo_down_sc}$1$terminfo[rc]%}$PS1o"
  zle reset-prompt
}
# taken from http://stackoverflow.com/questions/3622943/zsh-vi-mode-status-line
zle -N zle-statusline

function magic-dot() {
if [[ $LBUFFER = *. && $LBUFFER != *{*. && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=./
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
elif [[ $LBUFFER = *../ && ${${${(z)${:-DUMMY $LBUFFER}}[-1]}[1]} != '/' ]]; then
  LBUFFER+=../
  zle-statusline "[ $(print "$(builtin pwd -P)"/${${(z)${:-DUMMY $LBUFFER}}[-1]} \
                           | perl -pe 's/\n//; $i=0; while($_=~/\.\./ && !($_=~/^\/\./)) { $i++; if($i>100) {print "INFTY!"; exit;} s/\/[^\/]+\/\.\.// }') ]"
else
  zle self-insert
fi
}
zle -N magic-dot
bindkey "." magic-dot

precmd () { PS1="$PS1o" }

решение2

Вероятно, можно сделать ls ../../..и тогда cd ../../..; ls. Это возможно сделать, но я не знаю, какие еще методы есть в документации по zsh.

Связанный контент