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:
complete -f -X "/myproject/data/*" vi
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 :
# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )
function _myprompt {
[[ -n "${noacdirs[$PWD]}" ]] && {
echo autocomplete off
bind 'set disable-completion on'
} || {
echo autocomplete on
bind 'set disable-completion off'
}
}
PROMPT_COMMAND=_myprompt
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):
declare -A noacdirs=([/myproject/data]=1 )
_xcomplete() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
name=$(readlink -f "${cur:-./}") # poor man's path canonify
dirname=$(dirname "$name/.")
[[ -n "${noacdirs[$dirname]}" ]] && {
COMPREPLY=( "" ) # dummy to prevent completion
return
}
# let default kick in
COMPREPLY=()
}
complete -o bashdefault -o default -F _xcomplete vi
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 menambahkan complete -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:
declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)
_xcomplete() {
local cmd=${COMP_WORDS[0]}
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ -z "$cur" && -n "$nocomplete" ]] && {
printf "\n(restricted completion for $cmd in $nocomplete)\n"
printf "$PS2 $COMP_LINE"
COMPREPLY=( "" ) # dummy to prevent completion
return
}
COMPREPLY=() # let default kick in
}
function _myprompt {
nocomplete=
# uncomment next line for hard-coded list of directories
[[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
# uncomment next line for per-directory ".noautocomplete"
# [[ -f ./.noautocomplete ]] && nocomplete=$PWD
# uncomment next line for size-based guessing of large directories
# [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
}
PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff
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 dua printf
baris untuk operasi senyap.
Pilihan lain termasuk .noautocomplete
file flag per-direktori yang Anda bisa touch
di direktori sesuai kebutuhan; dan menebak ukuran direktori menggunakan GNU stat
. 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
ke complete
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.)