Apakah ada shell yang mendukung penyelesaian fuzzy seperti pada Sublime Text?

14

Saya menggunakan bash dan saya bertanya-tanya apakah ada plugin di bash atau shell lain yang memungkinkan saya untuk melakukan ini cat tfnislong.txt+ [tab]selesai cat ThisFileNameIsSoLong.txtpersis seperti penyelesaian tab dalam Teks Sublime.

kayu
sumber
Kenapa tidak cat Th+ tab?
daviewales
1
@daviewales Tampilkan semua 269 alasan?
Faks

Jawaban:

11

Saya tahu https://github.com/mgalgs/fuzzy_bash_completion yang merupakan sekelompok fungsi shell yang digunakan complete.

Saya pikir kita mungkin bisa melakukan sedikit lebih baik, lebih ringkas. Saatnya membuka bust .bashrc atau .profile Anda ...

Kait dasar yang kami gunakan adalah ini:

complete -o nospace -o filenames -F fuzzypath cd ls cat

Opsi -F berarti menggunakan fungsi shell untuk penyelesaian tab, di mana opsi diatur dalam COMPREPLYvariabel. Jadi misalnya:

function fuzzypath () {
    jika [-z $ 2] 
    kemudian
        COMPREPLY = (`ls`)
    lain
        DIRPATH = `echo" $ 2 "| gsed 's | [^ /] * $ ||' `
        BASENAME = `echo" $ 2 "| gsed | s. * / || '`
        FILTER = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g'`
        COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
    fi
}

di mana DIRPATHsegalanya sebelum yang terakhir / di jalan Anda mengetik dan di BASENAMEmana kursor Anda saat ini.

FILTERDi sinilah fuzzy-ness masuk. Pada dasarnya, ambil BASENAMEdan masukkan .*antara setiap char untuk menghasilkan regex fuzz kami.

Sisanya hanya menggabungkan regex dengan ls untuk diproduksi COMPREPLY. Anda mungkin menemukan lebih banyak hal pintar untuk dilakukan di sini, mungkin dengan find.

Saya juga menemukan http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html berguna.

mwm
sumber
6

Anda mungkin menemukan fzf berguna. Ini adalah fuzzy finder tujuan umum yang ditulis dalam Ruby yang dapat digunakan dengan daftar hal apa saja: file, proses, sejarah perintah, cabang git, dll.

Script instalasinya akan mengatur CTRL-Tikatan kunci untuk shell Anda. GIF berikut ini menunjukkan cara kerjanya.

Junegunn Choi
sumber
FZF luar biasa! Terima kasih banyak telah berkontribusi. Ini menyelamatkan saya dari minggu kerja..saya mulai menulis penyelesaian fuzzy untuk Bash ketika saya beruntung menemukan FZF. Ini berfungsi sempurna, saya hanya harus ingat untuk menyimpan posisi kursor sebelum memanggil fzf.. (tput sc) dan kemudian mengembalikannya dengan tput rc..
Håkon Hægland
3

Untuk mengikuti jawaban Anda yang lain, Anda mungkin ingin melihat ke zsh. Ini kompatibel dengan bash sehingga Anda dapat menggunakannya sebagai pengganti, tetapi mendukung fitur yang diperluas secara luas dan salah satunya adalah peningkatan tab yang sangat disadari konteks penyelesaian.

zsh Completion FAQ meluas pada kasus penggunaan, tapi saya yakin bahwa per contoh Anda, Anda akan paling tertarik dengan COMPLETE_IN_WORDfungsi ini. Ini bukan perilaku yang diinginkan, tapi dekat. Poin utama adalah bahwa ada banyak cara untuk memperluas fungsionalitas dasar dengan cara yang mungkin lebih mudah didekati daripada menggunakan bash.

Berikut adalah ekstensi kecocokan fuzzy yang akan memperkirakan apa yang Anda inginkan secara lebih spesifik; Pertandingan zsh-fuzzy

Untuk beberapa ide, Anda bisa melihat pada kerangka oh-my-zsh yang populer yang memiliki sejumlah fungsi untuk mengelola zsh dan memperluasnya. Ini lebih dari yang Anda inginkan, kemungkinan besar, tetapi di bawah plugin Anda akan mencatat skrip pelengkapan otomatis untuk berbagai peran. Untuk mendapatkan gambaran tentang kapabilitas.

Krondor
sumber