Apakah ada mode pencocokan fuzzy untuk shell zsh?

22

Saya baru-baru ini jatuh cinta dengan sistem penyelesaian teks yang efisien. Salah satu jenis penyelesaian favorit saya adalah yang disebut penyelesaian fuzzy. Ini adalah mode di mana program akan menyelesaikan input pengguna berdasarkan hanya beberapa karakter yang dapat terjadi 'di mana saja' (hampir) di nama file atau path. Fitur ini setidaknya ada untuk program-program ini:

Contoh penggunaan mode ini dalam editor teks:

Pengguna sedang mencoba untuk melengkapi kata longWordNameThatTheyDontWantToWriteByHand, dan mereka dapat melakukannya dengan mengetik misalnya huruf pertama dan beberapa huruf kapital. Jadi mengetik lwnt bisa melengkapi seluruh kata.

Pertanyaan saya adalah: apakah ada mode atau sesuatu yang serupa yang dapat saya gunakan dengan zsh shell?

sp3ctum
sumber

Jawaban:

27

Saya punya ini di saya .zshrc

# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
  'm:{a-z\-}={A-Z\_}' \
  'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
  'r:|?=** m:{a-z\-}={A-Z\_}'

Ini menambahkan pencocokan fuzzy penuh untuk zshmesin penyelesaian. Itu tidak memiliki kecerdasan super dari teks yang agung, tapi, ya, itu akan selesai lwnt -> longWordNameThatTheyDontWantToWriteByHand.

PythonNut
sumber
1
Saya baru saja menemukan bug: tidak berfungsi untuk nama file dengan spasi, mengingat Anda mengetik apa pun setelah spasi ☹ Yaitu stack install && vlc ~/Music/erftidak lengkap stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Hi-Angel
5
@ Hai Angel, terima kasih sudah menabrak ini. Saya benar-benar menggunakan 'r:|?=** m:{a-z\-}={A-Z\_}'sekarang, yang lebih sederhana, dan tidak menderita masalah yang Anda gambarkan.
PythonNut
Itu keren! Mungkin Anda bisa membuat plugin dengan kode ini. Supaya lebih mudah ditemukan.
Julien__
15

Lihat proyek saya fzf .

Ini adalah fuzzy finder tujuan umum yang ditulis dalam Golang yang dapat digunakan dengan daftar hal apa pun: file, proses, sejarah perintah, cabang git, dll.

Untuk zsh, ia menyediakan binding kunci berikut:

  • CTRL-T - Tempel jalur file yang dipilih ke baris perintah
  • CTRL-R - Tempel perintah yang dipilih dari sejarah ke baris perintah
  • ALT-C - cd ke direktori yang dipilih

dan mode penyelesaian fuzzy:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>

# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>

# Host names
ssh **<TAB>
telnet **<TAB>

# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>
Junegunn Choi
sumber
4
Bagaimana saya bisa membuatnya tab lengkap dengan ini secara default? Tanpa harus mengetik**
theonlygusti