Saya ingin membuat skrip penyelesaian bash yang mengakui argumen formulir --arg
dan --some-arg=file
.
Setelah membaca tutorial ini dan beberapa contoh /usr/share/bash_completion/completions/
, saya telah menulis skrip berikut (untuk menghemat waktu mengetik beberapa flag dengan Chromium):
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=file
if [[ ${cur} == "--"*"=" ]] ; then
# Removed failures (is my logic OK?)
return 0
fi
# Handle other options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _chromium chromium
Saya menyimpannya ~/bash_completions/chromium
, dan membuat symlink menggunakan sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Lalu saya memuatnya menggunakan . /usr/share/bash_completions/completions/chromium
.
Sekarang, saya mengalami dua masalah:
chromium --u<TAB>
mengembang kechromium --user-data-dir=<SPACE>
(Saya tidak ingin ruang).- Jalur (direktori dan file) tidak selesai lagi.
Bagaimana saya bisa menyelesaikan masalah ini?
bash
autocomplete
chrome
Rob W
sumber
sumber
Jawaban:
Saya telah menemukan solusi untuk kedua masalah tersebut!
Untuk tidak menambahkan spasi, gunakan
nospace
opsi. Ini dapat dilakukan dengan dua cara:complete
:complete -o nospace -F _chromium chromium
compopt
built-in:compopt -o nospace
(untuk mengaktifkan opsi)compopt +o nospace
(untuk menonaktifkan opsi)Saya menemukannya di dokumentasi Bash di gnu.org, 8.7 Programmable Completion Builtins .
-f
flag dengancompgen
. Saya mengikuti saran itu, dan menerapkannya sebagaiCOMPREPLY=( $(compgen -f "$cur") )
. Ini bekerja dengan baik, sampai saya mencoba menyelesaikan jalur yang berisi spasi.Pada Stack Overflow, saya menemukan jawaban ini yang merekomendasikan pembuatan daftar penyelesaian secara manual (tanpa menggunakan
compgen
). Pendekatan ini bekerja dengan baik.filenames
opsi untuk memberi tahu Readline bahwa compspec menghasilkan nama file, sehingga ia dapat:colored-stats
diaktifkan)Dengan bantuan manipulasi string Bash (untuk memperluas
~
dan menangani spasi), saya membuat skrip penyelesaian bash yang memenuhi semua kriteria yang dinyatakan dalam pertanyaan.sumber
-f
switch untuk penyelesaian path file, tetapi tidak menyelesaikan/
char jika itu adalah direktori ... itu adalah hal yang kecil sekalipun.Untuk nama file lengkap coba lewat
-f
untukcompgen
.Saya khawatir Anda tidak akan bisa menghilangkan ruang setelah opsi, karena itulah cara penyelesaiannya - setelah menemukan kecocokan yang unik, ia menyelesaikannya sepenuhnya.
sumber
-f
. Saya mencobanya, tetapi tidak dengan benar berurusan dengan spasi: Path/tmp/foo bar
menghasilkan dua entri penyelesaian/tmp/foo
danbar
. Tentang yang tidak diinginkan--arg=<SPACE>
: Saya telah menemukan solusi untuk itu, dan mempostingnya di jawaban di bawah ini .