2014-06-15 7 views
12

Sto usando zsh con il file rc di oh-my-zsh e c'è qualche comportamento che trovo particolarmente fastidioso. Per impostazione predefinita, oh-my-zsh è configurato per restituire corrispondenze senza distinzione tra maiuscole e minuscole durante il completamento automatico. Questo comportamento a volte è buono, ma altre volte fa davvero schifo. Esiste un modo per configurare zsh in modo che utilizzi la corrispondenza senza distinzione tra maiuscole e minuscole quando non ci sono corrispondenze con distinzione tra maiuscole e minuscole?Avere corrispondenze auto-complete per insuccesso di maiuscole/minuscole, ma preferire corrispondenze esatte

Per esempio, questo caso sarebbe utilizzare maiuscole e minuscole matching:

> ls 
LICENSE.txt lib/ 
> emacs l <-- should autocomplete to lib/ 

In questo caso, maiuscole e minuscole auto-completamento sarebbe accaduto:

> ls 
README lib/ 
> emacs r <-- should autocomplete to README 

Grazie!

risposta

12

Basta rimuovere il commento dalla riga seguente in ~ /.zshrc:

# Uncomment the following line to use case-sensitive completion. 
# CASE_SENSITIVE="true" 

Ha funzionato per me

+1

Funziona solo con Oh My Zsh. https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/completion.zsh Modifica: Oops, si trattava di Oh My Zsh ... Ma questa risposta non soddisfa pienamente i bisogni. – Yous

20

Creare un file ~/.oh-my-zsh/custom/better-completion.zsh (supponendo che si sta utilizzando i percorsi predefiniti per oh-my-zsh) con le seguenti linee

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' 

Spiegazione:

Regole per le partite a completamento zsh in generale sono definito nello stile matcher-list. Per oh-my-zsh questo è definito in ~/.oh-my-zsh/lib/completion.zsh (una volta per maiuscole e minuscole e una per non sensibile al maiuscolo/minuscolo). Potresti cambiarlo ma probabilmente sarebbe sparito se avessi aggiornato il tuo oh-my-zsh. ~/.oh-my-zsh/custom è destinato specificatamente per la personalizzazione e file con estensione .zsh vengono caricati da lì da .oh-my-zsh/oh-my-zsh.sh alla fine della configurazione.

Le impostazioni predefinite (case-insensitive) per matcher-list in oh-my-zsh sono:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' 

Il primo dei quali dice di gestire lettere maiuscole e minuscole intercambiabili. Dato che è la prima regola, sarà usata invariabilmente per ogni partita.

L'unica modifica necessaria è quella di anteporre '' per semplice completamento (che è anche il primo esempio in zshcompsys(1) per matcher-list)

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' 

Questa prima tenta di completare la parola corrente esattamente come il suo scritto, prima di tentare caso -inensitive o altre partite.

Per essere completa:

  • Il secondo (originale) regola permette di esecuzione parziale prima ., _ o -, ad esempio f.b ->foo.bar.
  • La terza regola consente di completare sul lato sinistro del testo scritto, ad es. bar ->foobar)
+1

Hai anche a impostare a true case_sensitive presumo? –

+0

Grazie a @didibus. Ho rimosso la clausola 'if', quindi l'impostazione di' CASE_SENSITIVE' non ha più importanza. Non sono sicuro di cosa stavo pensando allora. Il comportamento di * oh-my-zsh * dipende da 'CASE_SENSITIVE', ma dato che vogliamo cambiarlo in entrambi i casi, non ha senso nemmeno controllare l'impostazione originale. – Adaephon

+1

Hai dimenticato 'matcher-list' dopo' ': completion: *' ', vero? – neoascetic