2014-12-22 46 views
5

Il mio codice si trova nella seguente directory sul mio computer/a/b/c/d/e/myCode. Mi sono infastidito dal digitare make/a/b/c/d/e/myCode/project1 quando volevo compilare project1. Per risolvere questo ho creato una funzione nel mio bashrc che appare come segue:Imposta la directory di lavoro per gli argomenti di funzione

function make_project { make /a/b/c/d/e/myCode/$1; } 

Poi mi chiamano così:

make_project project1 

Questo funziona bene. L'unico problema con questo è che non ho autocompletion per project1. Quindi, se ho un progetto con un nome complicato come my_complicatedlynamed_project, dovrò digitare l'intero nome. C'è un modo per bash per sapere che gli argomenti sono directory in/a/b/c/d/e/myCode/e potrebbe autocompletare in modo appropriato?

+0

Si prega di consultare [ "domande deve includere“ tag "nei loro titoli?"] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è "no, non dovrebbero"! –

+0

Grazie, buono a sapersi. –

risposta

2

Il comando compgen può essere utilizzato per generare e completamenti di test e guardando oltre i completamenti esistenti può fornire un aiuto generarne di nuove. Sei dopo le directory in una particolare sotto-albero in modo che il seguente dovrebbe funzionare in bash:

function _make_project { 
    COMPREPLY=($(cd /a/b/c/d/myCode; compgen -A directory -- "${COMP_WORDS[COMP_CWORD]}")); 
} 

Questo utilizza compgen per ottenere le directory che potrebbe completare l'argomento corrente, a partire dalla sottostruttura mycode. Per installare questo per la vostra funzione è necessario utilizzare il comando complete per associare questa funzione di completamento con la funzione bash:

complete -F _make_project make_project 

Aggiornamento

per evitare di avere un carattere di spazio allegata al lavoro completato, al momento della registrazione la funzione di completamento può essere fornita l'opzione nospace.Se questo è combinato con l'opzione -S a compgen per aggiungere un carattere suffisso poi i completamenti possono apparire come i nomi delle directory ed è possibile raggiungere a piedi la sottostruttura facilmente:

function _make_project { 
    COMPREPLY=($(cd /a/b/c/d/myCode; compgen -S/-A directory -- "${COMP_WORDS[COMP_CWORD]}")); 
} 
complete -o nospace -F _make_project make_project 
+0

Grazie a questo ha funzionato. –

+0

Una piccola domanda, quando premo la scheda ora in autocompletes correttamente ma aggiunge uno spazio dopo. Quindi se voglio una sottodirectory devo fare clic su backspace e quindi su /. C'è un modo per il completamento automatico di non aggiungere lo spazio? –

+0

Vedere l'opzione edit re: nospace. – patthoyts

0

Non so se bash può farlo, ma zsh può ragionevolmente farlo. Per fare questo lavoro in zsh, aggiungere questa riga a .zshrc:

fpath=(~/.zshcompletion $fpath) 

quindi creare il file di ~/.zshcompletion/_make_project:

#compdef make_project 

# _arguments "1: :(World)" 

_make_project() { 
    # Note: Do the following two lines mean anything?: 
    local curcontext="$curcontext" state line 
    typeset -A opt_args 

    for dir in /a/b/c/d/e/myCode/*(/); do 
     compadd "[email protected]" "${dir/*\//}" 
    done 
} 

Nota: So che questa non è la risposta che hai chiesto, ma dal momento che zsh ha fondamentalmente la stessa interfaccia utente di bash (con gli script che di solito sono compatibili), ho pensato che potrebbe essere utile se non c'è una soluzione bash facile.

+0

Grazie vedrò se funziona. –

+0

Prego. Questo è abbastanza simile al mio caso in cui volevo impostare alcuni elementi dell'ambiente in base al progetto su cui stavo lavorando, ma il nome della cartella era davvero l'unico dato importante. Così ho capito come farlo, e spero di non doverlo mai più capire. :) – piojo

0

Utilizzare un collegamento software per la directory myCode.

ln -s /a/b/c/d/e/myCode/ ~/myCode 

Modificare la funzione di:

function make_project { make $1; } 

suppongo digitando un ulteriore myCode non farà male più di tanto:

make_project ~/myCode/project_name 

o semplicemente usare make:

make ~/myCode/project_name 

È possibile utilizzare il completamento automatico e dopo aver digitato ~/myCode/

Problemi correlati