
я используюavfsдля удобного просмотра содержимого архивов из командной строки. Это создает представление всего дерева каталогов ниже ~/.avfs
(так что если файл /path/to/foo
существует, то он также виден как ~/.avfs/path/to/foo
), и, кроме того, если /path/to/foo
это файл архива, то ~/.avfs/path/to/foo#
это каталог, который является представлением каталога верхнего уровня содержимого архива.
Когда я хочу исследовать внутреннюю часть архива, это немного обременительно: мне приходится переключаться на иерархию ~/.avfs
, а завершениеcd
мне не помогаетвведите имена этих архивов и добавьте #
в конце.
Я хотел бы иметь возможность бежать acd foo.zip
из /path/to/dir
и бежать cd ~/.avfs/path/to/dir#
. С приличным завершением для acd
. Как я могу это сделать?
решение1
Вот моя реализация acd
. Она делает правильно, независимо от того, является ли аргумент каталогом или архивом. acd
без аргумента эквивалентно acd .
.
avfs_cd () {
case "$2" in
"$HOME/.avfs/"*) :;;
/*) set -- "$1" "$HOME/.avfs$2";;
*) set -- "$1" "$HOME/.avfs$PWD/$2"
esac
if ! [ -d "$2" ]; then
set -- "$1" "${2}#"
fi
"$1" "$2"
}
alias acd='avfs_cd cd'
alias apushd='avfs_cd pushd'
А вот моя функция завершения zsh:
_acd () {
_dirs
_files -g "*.(7z|rar|tar.bz2|tar.gz|tar.xz|tbz2|tgz|zip)(e\\''REPLY=\${REPLY}\\#'\\')"
}
compdef _acd acd apushd