2

Имея precmd(), который делает довольно много, например, проверяет информацию о VCS, я хочу отключить его при навигации по медленно монтируемым сетевым дискам.

Я придумал следующее, с чем я могу сказать, slow перед тем, как перейти на медленный диск и fast вернуть его обратно, мне интересно, есть ли что-то проще?

precmd_slow() {
    not_much
}
precmd_fast() {
    precmd_slow
    somemore1
    somemore2
}

precmd() {
    precmd_fast
}

slow() {
    precmd() {
        precmd_slow
    }
}

fast() {
    precmd() {
        precmd_fast
    }
}

2 ответа2

0

Мне понравилось это решение, данное chepner на StackOverflow, которое я процитирую прямо:

В дополнение к функции precmd, есть также массив с именем precmd, который содержит список функций, которые нужно вызывать одновременно. Вы можете манипулировать им самостоятельно, но zshcontrib имеет функцию add-zsh-hook для упрощения работы.

Код:

# precmd_slow and precmd_fast defined as before

autoload add-zsh-hook
add-zsh-hook precmd precmd_fast

fast () {
    add-zsh-hook -d precmd precmd_slow
    add-zsh-hook precmd precmd_fast
}

slow () {
    add-zsh-hook -d precmd precmd_fast
    add-zsh-hook precmd precmd_slow
}
0

Не самое красивое решение, но я бы использовал простую условную функцию в функции precmd проверяющую, смонтирован ли текущий каталог или нет. Теперь это зависит от того, какое это крепление. Если каталоги известны, что-то вроде этого должно работать.

slowdirs="/home/joe/slowdir1:/home/joe/slowdir2:/mnt/slowdir3"
precmd() {
  isslow=0
  echo $slowdirs | tr \: \\n |
    while read line; do
      if [[ $PWD == $line* ]]; then
        isslow=1
        break
      fi
    done
  if [[ $isslow == 0 ]] ; then
     # do slow stuff

  fi
  # do non slow stuff

}

Это проверяет, начинается ли текущий каталог (находится внутри) или является одним из каталогов, перечисленных в переменной slowdirs . Если это не один из "медленных" каталогов, запускаются "медленные команды", иначе он их пропускает.

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