Кто-нибудь знает, как заставить zsh показать мне предварительный просмотр родительского каталога, в котором я окажусь, если нажму Enter прямо сейчас?
Например, если я нахожусь очень глубоко в дереве каталогов и начинаю вводить текст ....
(который разворачивается в ../../..
), я хотел бы предварительно просмотреть имя папки самого высокого уровня, в которой я окажусь, совершив эти три перехода вверх по дереву каталогов.
решение1
Я полагаю, что расширение в ....
происходит ../../..
на лету, поэтому у вас есть специальная привязка клавиш для .
. У меня тоже, которая была вдохновлена
Пост Жереми Роке о рассылке пользователей zshсписок. Я расширил эту функцию, вызванную magic-dot
для отображения пути, на который будет ссылаться вмини-буфер, т.е. ниже командной строки:
user@linux:~/foo> ls ../../
[ /home/ ]
Мой код имеет некоторые недостатки:
- он не оптимизирован и его действительно неудобно читать (он даже использует
perl
для генерации выходных данных) - он терпит неудачу, когда в игру вступают символические ссылки
- мини-буфер не очищается, поэтому может быть виден после выполнения команды
(Пункты 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.