completamento zsh: ottenere nomi di file da una directory specifica


10

OK, un po 'di background: utilizzo un Mac e faccio il più possibile nell'interfaccia della riga di comando.

In particolare, inserisco spesso una chiavetta USB cpo mvun file e quindi desidero immediatamente espellerlo (smontarlo e scollegarlo). Questo di solito può essere realizzato in una manciata di tasti, tranne che per smontarlo, che richiede (in 10.7) di andare in uno spazio desktop vuoto (di solito almeno due spazi di distanza), selezionando il disco e premendo "command-e". Francamente, questa procedura di smontaggio è, per diversi ordini di grandezza, la parte più lunga e noiosa del processo.

Sarebbe molto più naturale ed efficiente poter semplicemente scrivere, diciamo:

ej<tab> J<tab>

Di 'che la mia chiavetta USB si monta su / Volumes / Jefferson. Quello che mi aspetterei di ottenere dai miei 6 tasti è il seguente:

eject /Volumes/Jefferson

Questo dovrebbe eseguire il comando:

diskutil unmount /Volumes/Jefferson

Quindi, ho scritto una piccola funzione:

eject() {
    diskutil unmount /Volumes/$1
}

E una funzione di completamento per andare con esso:

compdef '_files -g "/Volumes/*"' eject  

C'è un problema con questo, tuttavia. La _filesfunzione genera percorsi completi. Ora, potrei cambiare la linea nella mia funzione di "espulsione" in diskutil unmount $1, e le cose funzionerebbero, ma poi non ho la possibilità di digitare la prima lettera del nome del punto di montaggio, poiché il percorso inizia con / Volumes /. Ad esempio, se digito J<tab, otterrò il completamento automatico per i file nel PWD. Dovrei digitare /Volumes/J<tab>per ottenere il completamento desiderato.

Quindi, esiste una funzione di completamento che prende i nomi di file da una posizione predefinita predefinita, piuttosto che generare percorsi completi?

Mi piacerebbe davvero ottenere questo fino a 6 sequenze di tasti.

Risposte:


12
_files -W /Volumes

Vedi la documentazione di _path_files.


Perfetto! Sapevo che doveva essere integrato. Grazie mille!
Marshall Eubanks,

Quindi, come posso ottenere per caricare automaticamente questa funzione di completamento? Ho provato a mettere la compdeflinea nel file che si _ejecttrova nel mio percorso. L'ho provato con e senza una linea di caricamento automatico. Ho guardato diverse guide sulle funzioni di completamento e nessuno ha spiegato come fare un esempio semplice come questo, e nulla di ciò che ho provato sulla base di uno dei loro esempi ha funzionato.
Marshall Eubanks,

@marshaul Devi avere #compdef ejectcome prima riga del file, quindi il codice reale. Vedi sotto i file caricati automaticamente nel manuale. Se all'inizio non hai aggiunto la riga, potresti dover eliminare la cache ~/.zcompdumpe riavviare zsh.
Gilles 'SO- smetti di essere malvagio' il

AH! L'eliminazione ha ~/.zcompdumpfatto il trucco. Grazie ancora!
Marshall Eubanks,
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.