Esiste una modalità di corrispondenza fuzzy per la shell zsh?


22

Di recente mi sono innamorato di efficienti sistemi di completamento del testo. Uno dei miei tipi preferiti di completamento è il cosiddetto completamento fuzzy. Questa è una modalità in cui il programma completerà l'input dell'utente basato solo su un paio di caratteri che possono apparire "ovunque" (quasi) nel nome o nel percorso del file. Questa funzione esiste almeno per questi programmi:

Esempio di utilizzo di questa modalità in un editor di testo:

L'utente sta cercando di completare la parola longWordNameThatTheyDontWantToWriteByHand e può farlo digitando ad esempio la prima lettera e alcune lettere maiuscole. Quindi digitare lwnt potrebbe completare l'intera parola.

La mia domanda è: esiste una modalità o qualcosa di simile che potrei usare con la shell zsh?

Risposte:


27

Ho questo nel mio .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\_}'

Aggiunge una corrispondenza fuzzy zshcompleta al motore di completamento. Manca la super intelligenza del testo sublime, ma, sì, si completerà lwnt -> longWordNameThatTheyDontWantToWriteByHand.


1
Ho appena trovato un bug: non funziona per i nomi di file con spazi, dato che stai digitando qualcosa dopo lo spazio ☹ Ie stack install && vlc ~/Music/erfnon si completa stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3.
Ciao Angelo,

5
@ Ciao Angelo ehi, grazie per esserti imbattuto. In realtà lo uso 'r:|?=** m:{a-z\-}={A-Z\_}'ora, che è un po 'più semplice e non soffre del problema che descrivi.
PythonNut

È fantastico! Forse potresti creare un plugin con questo codice. Solo così è più facile da trovare.
Julien__

15

Dai un'occhiata al mio progetto fzf .

È un cercatore fuzzy per uso generale scritto in Golang che può essere utilizzato con qualsiasi elenco di cose: file, processi, cronologia dei comandi, rami git, ecc.

Per zsh, fornisce i seguenti collegamenti chiave:

  • CTRL-T - Incolla i percorsi dei file selezionati nella riga di comando
  • CTRL-R - Incolla il comando selezionato dalla cronologia nella riga di comando
  • ALT-C - cd nella directory selezionata

e modalità di completamento 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>

4
Come posso rendere la scheda completa con questa per impostazione predefinita? Senza dover digitare**
theonlygusti il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.