4

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

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

2 ответа2

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .