Bagaimana cara menyediakan penyelesaian Bash untuk direktori-executable lokal?

1

Saya menulis skrip Bash untuk membantu saya mengelola beberapa symlink. Ini adalah pembungkus beberapa perintah Stow .

Ketika saya memintanya, saya memberikannya dua argumen baris perintah: perintah ( plug/ unplug/ replug) dan nama direktori (hanya nama dasarnya, bukan jalur).

Script disebut vlink, jadi doa akan, misalnya:

vlink plug foo

Nama direktori ( foodalam contoh di atas) perlu menjadi salah satu subdirektori dari direktori tertentu di tempat lain di sistem saya.

Karena hanya ada tiga perintah yang mungkin ( plug/ unplug/ replug) dan satu set spesifik nama direktori yang mungkin untuk argumen ketiga, saya ingin memberikan beberapa penyelesaian tab untuk itu.

Saya agak terbiasa dengan menulis skrip penyelesaian Bash, tetapi apakah ada cara untuk memberikan perintah penyelesaian untuk executable yang tidak ada dalam $ PATH saya dan hanya dimaksudkan untuk dijalankan dari direktori induknya?

ivan
sumber

Jawaban:

3

Ini mungkin berhasil:

_vlink () {
    case $COMP_CWORD in
        1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
        2) local IFS=$'\n'
            COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
    esac
}

complete -F _vlink vlink

Ganti /some/dirdengan direktori yang berisi subdirektori yang menarik. (Saya mengasumsikan nama direktori Anda tidak memiliki baris baru di dalamnya.)

  • COMP_CWORD adalah indeks kata yang sedang diselesaikan (0 menjadi nama perintah)
  • argumen kedua untuk fungsi penyelesaian adalah kata yang sedang diselesaikan (yang pertama adalah nama perintah dan yang ketiga adalah kata sebelumnya)

Jadi, kami menggunakan compgen:

  • untuk argumen pertama, untuk menghasilkan kata yang cocok dari daftar kata yang diberikan dengan -W, dan
  • untuk argumen kedua, untuk menghasilkan nama direktori yang cocok dari direktori yang relevan.
muru
sumber
Sebagai seseorang yang kurang mahir dalam bash, dalam kasus penggunaan seperti ini, bagaimana cara memuat penyelesaiannya? Saya ingin menyelesaikan sendiri beberapa kali sebelumnya, tetapi saya tidak pernah benar-benar menemukan cara mendaftarnya selain secara global.
Marie
@Marie complete -F <function-name> <command-name>, seperti pada contoh di atas. Penyelesaian terdaftar ke nama perintah, bukan ke jalur, jadi tergantung pada apa yang Anda maksud dengan "global", ini hanya dapat dilakukan secara global (untuk semua perintah dengan nama yang sama)
muru
1
Itulah yang saya maksud. Jadi tidak ada cara mandiri untuk perintah untuk mengatur autocomplete sendiri?
Marie