Bagaimana saya bisa men-tweak sistem penyelesaian zsh untuk menyelesaikan file "palsu" dalam beberapa keadaan?
Lebih tepatnya, sistem file AVFS memperlihatkan arsip sebagai direktori dengan membuat "direktori palsu" di sebelah setiap arsip. Secara default, ini mereplikasi seluruh hierarki direktori di bawah titik pemasangannya ~/.avfs
. Selanjutnya, di bawah ~/.avfs
, untuk setiap file arsip seperti /tmp/foo.zip
, selain file arsip itu sendiri ~/.avfs/tmp/foo.zip
, ada direktori yang disebut ~/.avfs/tmp/foo.zip#
yang memaparkan konten arsip. Namun direktori tambahan ini tidak muncul dalam daftar ~/.avfs/tmp
: hanya ada ketika diminta secara eksplisit. (Ini mirip dengan bagaimana beberapa automounters beroperasi.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Ketika saya mengetik perintah seperti di atas, foo.zip#
tidak muncul sebagai penyelesaian di bawah ~/.avfs/tmp/
, karena tidak ada direktori seperti itu. Bagaimana saya bisa memberi tahu zsh bahwa setiap kali ada file yang path lengkapnya $arc
cocok ~/.avfs/**/*.(tgz|zip)
¹, ia harus berpura-pura ada direktori yang dipanggil ${arc}#
?
(Perhatikan bahwa saya ingin penyelesaiannya berfungsi dengan setiap panggilan _files
atau _dirs
, tidak hanya untuk cd
perintah. Saya lebih suka tidak harus menduplikasi kode _files
fungsi, jika mungkin.)
¹ dan semua ekstensi lainnya
sumber
/path/to/foo
terlihat sebagai~/.avfs/path/to/foo
.avfs
. Jika itu mempresentasikan#
entri direktori default untuk file apa pun yang cocok dengan string yang didukungnya, atau bahkan sihir menguji file dalam direktori untuk apa yang diperlukan untuk memiliki#
entri, maka penyelesaiannya hanya akan berfungsi. Saya kira akan ada hit kinerja untuk sesuatu sepertifind
sekarang akan menjelajah melalui file terkompresi.Jawaban:
Jawaban palsu tampaknya tidak cukup untuk pertanyaan palsu ini; dukungan zsh builtin untuk direktori automount beroperasi pada direktori (
fake-files dir:names
), dan bukan pada pola file di dalamnya. Ini berguna untuk menambahkan file bernama tertentu ke direktori, yang mungkin cocokautomount
atausshfs
atau.snapshot
jenis pengaturan NetApp di mana direktori yang akan dipasang adalah nama statis yang dikenalALAS
,.zshall(1)
mengatakan "nama" adalah string, dan eksperimen menunjukkan metakarakter (misalnya#
atau\#
atau'*(e:"echo hi":)'
) "tidak bekerja" dengan berbagai cara, sehingga tidak ada cara saya tahu untuk menyelinap segumpal ke bagian nama-namafake-files
pernyataan. (MenggaliSrc/Zle/computil.c
mungkin akan mengungkapkan dengan tepat apa nama-nama itu, tetapi itu akan lebih berhasil.) (Juga, menggunakan gumpalan rekursif dalam posisi direktori untuk memberi nama file arsip tidak terbang, tapi sekali lagi akan membutuhkan C diving untuk melihat berapa banyak yangfake-files
memungkinkan Anda lolos.)Dengan
compdef
, seseorang dapat mendaftar.avfs
kelengkapan direktori:Kecuali ini gagal, karena hanya akan menampilkan
#
file ketika itu tidak masalah, dan dengan demikian tidak dapat menyelesaikannya. (Ada kegunaan produktif untuk formulir ini, meskipun tidak untuk kasus ini.)Menggunakan
zstyle
membuat Anda lebih dekat, dengan yang berikut.zshrc
:Namun, itu hanya dapat menyelesaikan hingga
\#/
bit (pada squian squeeze virt dengan pengaturan default avfs), tetapi tidak ke dalam sistem file virtual untuk arsip, jadi pekerjaan tambahan akan diperlukan untuk melengkapi tab ke dalam arsip. Saya menebak-nebak melalui_call_program ... ls
atau sesuatu di sepanjang baris untuk penyelesaian di\#
bit, kecuali ada cara yang lebih elegan untukzsh
percaya bahwa direktori yang tidak ada lakukan.Kabar buruk! Penyelesaian tidak berhasil melalui
_path_files
direktori palsu; Saya menduga ini terkait zsh globbing. Baik zsh 4.something on dan zsh 5.0.8 menunjukkan masalah. Jadi saya curiga bahwa perbaikan yang lengkap akan membutuhkan tambalan_path_files
, atau untuk menulis sesuatu yang berbeda yang diselesaikan pada direktori palsu ini. Jejak debugging penyelesaian dapat dihasilkan dengan mengetikls /root/.avfs/root/sometar.gz\#/
dan kemudian pada akhir mengetik itucontrol-x
dan kemudian?
, dengan asumsibindkey -e
dan itu_complete_debug
pasti kata keycombo, jika seseorang ingin menyelidiki mengapa ini gagal.sumber
Di zsh Anda dapat menggunakan
compctl -K
untuk mendaftarkan fungsi Anda sendiri ke opsi penyelesaian generasi. Sebagai contoh:Maka Anda perlu mendefinisikan fungsi Anda sendiri:
Jelas hal di atas membutuhkan lebih banyak pekerjaan, tetapi itu adalah sesuatu untuk memulai.
Fungsi penyelesaian kustom yang serupa (tetapi berbeda) dapat didaftarkan untuk bash.
Berikut ini adalah contoh dengan implementasi untuk bash dan zsh . (Ini menawarkan penyelesaian opsi baris perintah dengan mengambil opsi dari halaman manual perintah.)
Dan berikut adalah beberapa tebakan cepat pada hal-hal yang mungkin berfungsi di dalam fungsi penyelesaian Anda:
Atau mungkin ini:
Semoga berhasil!
sumber
compctl
, yaitu saya ingin mengubah apa yang_files
dilakukan. Jawaban Anda sama sekali tidak membantu.