Saya bekerja dengan sejumlah besar file, yang saya simpan di direktori. Setiap kali saya masuk ke direktori itu dan secara tidak sengaja menekan Tabdua kali, butuh waktu terlalu lama (mungkin lebih dari satu menit) untuk menampilkan file yang cocok dengan pola tersebut, dan saya cukup terganggu dengan perilaku ini.
Sebagai contoh, struktur direktori saya adalah:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Karena saya masih suka penyelesaian, apakah ada untuk menonaktifkan fitur ini hanya pada data/
direktori? Suka mengatur batas waktu selama 5 detik, atau skrip yang secara otomatis mematikan penyelesaian ketika berada di dalam direktori tertentu?
bash
autocomplete
Neizod
sumber
sumber
Jawaban:
Ini tidak sempurna, tetapi sekali lagi penyelesaian pesta adalah hal yang cukup sulit ...
Cara paling sederhana adalah berdasarkan per-perintah, ini sedikit lebih fleksibel daripada
FIGNORE
yang bisa Anda lakukan:Ini menginstruksikan autocomplete bahwa penyelesaian
vi
untuk file, dan untuk menghapus pola yang cocok dengan-X
filter. Kelemahannya adalah bahwa pola tersebut tidak dinormalisasi, jadi../data
dan variasi tidak akan cocok.Hal terbaik berikutnya mungkin adalah
PROMPT_COMMAND
fungsi khusus :Ini menonaktifkan penyelesaian (sepenuhnya) ketika Anda berada di direktori, tetapi menonaktifkannya untuk setiap jalur bukan hanya file di direktori itu.
Akan lebih bermanfaat secara umum untuk menonaktifkan selektif ini untuk jalur yang ditentukan, tapi saya percaya satu-satunya cara adalah menggunakan fungsi penyelesaian standar (bash-4.1 dan yang lebih baru dengan
complete -D
) dan banyak mengacaukannya.Ini seharusnya bekerja untuk Anda, tetapi mungkin memiliki efek samping yang tidak diinginkan (yaitu perubahan pada penyelesaian yang diharapkan dalam beberapa kasus):
Ini berfungsi untuk penyelesaian
vi
, perintah lain dapat ditambahkan sesuai kebutuhan. Seharusnya berhenti menyelesaikan untuk file dalam direktori bernama terlepas dari path atau direktori kerja.Saya percaya pendekatan umum dengan
complete -D
adalah secara dinamis menambahkan fungsi penyelesaian untuk setiap perintah saat ditemui. Seseorang mungkin juga perlu menambahkancomplete -E
(penyelesaian nama perintah ketika buffer input kosong).Pembaruan Berikut adalah versi hybrid dari
PROMPT_COMMAND
solusi fungsi penyelesaian dan, saya pikir ini lebih mudah dipahami dan diretas:Fungsi prompt ini mengatur
nocomplete
variabel ketika Anda memasukkan salah satu direktori yang dikonfigurasi. Perilaku penyelesaian yang dimodifikasi hanya menendang ketika variabel itu tidak kosong dan hanya ketika Anda mencoba menyelesaikan dari string kosong, sehingga memungkinkan penyelesaian nama parsial (menghapus-z "$cur"
kondisi untuk mencegah penyelesaian sama sekali). Komentari duaprintf
baris untuk operasi senyap.Pilihan lain termasuk
.noautocomplete
file flag per-direktori yang Anda bisatouch
di direktori sesuai kebutuhan; dan menebak ukuran direktori menggunakan GNUstat
. Anda dapat menggunakan salah satu atau ketiga opsi tersebut.(
stat
Metode ini hanya tebakan , ukuran direktori yang dilaporkan tumbuh bersama isinya, ini adalah "tanda air tinggi" yang biasanya tidak akan menyusut ketika file dihapus tanpa intervensi administratif. Lebih murah daripada menentukan konten nyata dari potensi besar direktori .Tingkah laku yang tepat dan peningkatan per file tergantung pada sistem file yang mendasarinya. Saya menemukan itu indikator yang dapat diandalkan pada sistem linux ext2 / 3/4 setidaknya.)bash menambahkan ruang ekstra bahkan ketika penyelesaian kosong dikembalikan (ini hanya terjadi ketika menyelesaikan di akhir baris). Anda dapat menambahkan
-o nospace
kecomplete
perintah untuk mencegah hal ini.Satu niggle yang tersisa adalah bahwa jika Anda mencadangkan kursor ke awal tab token dan tekan, penyelesaian default akan menendang lagi. Anggap itu fitur ;-)
(Atau Anda bisa lanjut dengan
${COMP_LINE:$COMP_POINT-1:1}
jika Anda suka over-engineering, tapi saya menemukan bash sendiri gagal untuk mengatur variabel penyelesaian andal ketika Anda mencadangkan dan mencoba menyelesaikan di tengah perintah.)sumber
Jika Anda
data
direktori berisi file dengan akhiran tertentu, misalnya.out
, maka Anda dapat mengatur Andabash
variabelFIGNORE
untuk".out"
dan ini akan diabaikan. Meskipun dimungkinkan untuk menggunakan nama direktori juga, ini tidak membantu pada nama direktori kerja saat ini.Contoh:
Buat ribuan file uji 100KB pada host fisik dengan serangan 1 HDD:
Setel
bash
variabel:$ FIGNORE=".json"
Buat file uji:
$ touch test.out
Tes pada 5.000 file:
Tidak ada penundaan antara vi dan tunggal
tab
sebelumtest.out
muncul.Tes pada 50.000 file:
Tab tunggal menciptakan sebagian kecil dari penundaan kedua sebelum
test.out
muncul.Tes pada 200.000 file:
Keterlambatan 1 detik antara vi dan tunggal
tab
sebelumtest.out
muncul.Referensi:
Pakar dari bash pria
sumber
$ vi <tab><tab>
, itu butuh banyak waktu. : \.json
file, dan satu file teks bernamafoo.txt
. MenghidupkanFIGNORE='.json'
, saya mengetik$ vi <tab>
dan masih perlu menunggu setengah menit sehingga itu menyelesaikan saya$ vi foo.txt
. --- skenario nyata saya tidak akan mengedit, atau mencampur jenis file di dalam dir itu, tetapi jika saya mengaktifkanFIGNORE
dan (secara tidak sengaja) tekan tab, keyboard saya akan membeku untuk waktu yang lama tanpa sedikit pun sepertiDisplay all 188275 possibilities? (y or n)
, yang memberitahu saya bahwa saya dapat memiliki keyboard saya kembali.Kira ini yang Anda inginkan (meminjam beberapa kode dari @ mr.spuratic)
Catatan ini tidak mencegah Anda menekan TAB menggunakan jalur lengkap (mis
vim /directory/contains/lots/files<tab><tab>
sumber
pushd
/popd
. Karena ini hanya menggunakan array biasa, bukan array asosiatif itu akan bekerja di bash 3.x juga.