Я предполагаю расширение ....
до ../../..
происходит на лету, поэтому у вас есть специальная привязка клавиш для .
, Я тоже, вдохновленный постом Жереми Роке в списке рассылки 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" }