Как я могу настроить систему завершения zsh для завершения «поддельных» файлов при некоторых обстоятельствах?
Точнее говоря, файловая система AVFS представляет архивы как каталоги, создавая «поддельный каталог» рядом с каждым архивом. По умолчанию он реплицирует всю иерархию каталогов в своей точке монтирования ~/.avfs
. Кроме того, ~/.avfs
для каждого файла архива, такого как /tmp/foo.zip
, помимо самого файла архива ~/.avfs/tmp/foo.zip
, есть каталог, ~/.avfs/tmp/foo.zip#
который отображает содержимое архива. Однако этот дополнительный каталог не отображается в списке ~/.avfs/tmp
: он существует только при явном запросе. (Это похоже на работу некоторых автомонтировщиков.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Когда я набираю команду, подобную приведенной выше, foo.zip#
она не отображается как завершение ~/.avfs/tmp/
, поскольку такой директории нет. Как я могу сказать zsh, что всякий раз, когда существует файл, полный путь которого $arc
совпадает с ~/.avfs/**/*.(tgz|zip)
should, он должен делать вид, что существует каталог с именем ${arc}#
?
(Обратите внимание, что я хочу, чтобы завершение работало с каждым вызовом _files
или _dirs
, а не только с cd
командой. Я бы предпочел не дублировать код _files
функции, если это возможно.)
¹ и все остальные расширения
источник
/path/to/foo
виден как~/.avfs/path/to/foo
.avfs
. Если он представляет#
запись каталога по умолчанию для любых файлов, которые соответствуют строкам, которые он поддерживает, или даже магически проверяет файлы в каталоге на предмет того, что нужно для#
записи, тогда завершение будет просто работать. Я полагаю, что это может привести к снижению производительности примерно так же,find
как это теперь происходит при сжатии сжатых файлов.Ответы:
Поддельный ответ кажется недостаточным для этого поддельного вопроса; встроенная поддержка zsh для каталогов automount работает с каталогами (
fake-files dir:names
), а не с шаблонами файлов в них. Это удобно , чтобы добавить конкретные именованные файлы в каталог, который может удовлетворитьautomount
илиsshfs
или NetApp.snapshot
расстановок типа , где каталог-быть-смонтированным является известным статическим именемALAS
.zshall(1)
говорит, что «имена» являются строками, а эксперименты показывают, что метасимволы (например,#
или\#
или'*(e:"echo hi":)'
) «не работают» по-разному, поэтому я не знаю, как можно пробраться в часть именfake-files
оператора. (Копаясь черезSrc/Zle/computil.c
мог бы показать именно то , что имена могут быть, но это будет больше работы.) (Кроме того , используя рекурсивные шарики в позиции каталога в имя архив файлов не летает, но опять - таки будет принимать С дайвингом , чтобы увидеть , насколькоfake-files
позволяет вам сойдет с рук.)С помощью
compdef
можно перечислить.avfs
завершения каталога:За исключением этого происходит сбой, поскольку он будет показывать
#
файлы только тогда, когда это не имеет значения, и, следовательно, не может завершить их. (Для этой формы есть продуктивное использование, но не для этого случая.)Использование
zstyle
приближает вас к следующему.zshrc
:Тем не менее, он может выполняться только до
\#/
мелочей (в debian squeeze virt с настройкой avfs по умолчанию), но не в виртуальной файловой системе для архива, поэтому потребуется дополнительная работа, чтобы завершить вкладку в архив. Я догадываюсь через_call_program ... ls
или что-то в этом духе для дополнений\#
, если нет более элегантного способаzsh
верить, что несуществующие каталоги существуют.Плохие новости! Завершение не проходит через
_path_files
поддельные каталоги; Я подозреваю, что это связано с Zsh Globbing. Как zsh 4.something on, так и zsh 5.0.8 демонстрируют проблему. Поэтому я подозреваю, что для полного исправления потребуются исправления_path_files
или запись чего-то другого, что в противном случае завершается на этих поддельных каталогах. Трассировка отладки завершения может быть сгенерирована, набравls /root/.avfs/root/sometar.gz\#/
и затем в конце этого набора,control-x
а затем?
, если предположить,bindkey -e
что_complete_debug
это связано с указанным сочетанием клавиш, если кто-то хочет разобраться, почему это не удается.источник
В zsh вы можете
compctl -K
зарегистрировать свою собственную функцию для опций завершения генерации. Например:Затем вам нужно определить свою собственную функцию:
Очевидно, что вышесказанное требует дополнительной работы, но с этого нужно начать.
Аналогичная (но другая) пользовательская функция завершения может быть зарегистрирована для bash.
Вот пример с реализациями для bash и zsh . (Он предлагает завершение параметров командной строки, извлекая параметры из справочной страницы команды.)
И вот несколько быстрых предположений о том, что может работать внутри вашей функции завершения:
Или возможно это:
Удачи!
источник
compctl
то есть я хочу изменить то, что_files
делает. Ваш ответ не поможет вообще.