2015-11-17 21 views
5

Gli obiettivi di Makefile sono disponibili per il completamento su Linux ma, AFAICS, non su Mac OS (10.8.5).completamento automatico Makefile su Mac

È possibile ottenere il completamento lavorando con questo sistema operativo?

+1

Hai bisogno di vedere se è possibile trovare (installare e/o abilitare) il completamento bash approprate sulla tua macchina. Non so se quelle navi con OS X o sono disponibili tramite brew o qualcosa del genere però. –

+0

@EtanReisner Avrei dovuto menzionare tale completamento su Mac OS 10.8 per, ad es. 'Cd'. Quindi immagino che qualche completamento bash sia già disponibile sul computer. –

risposta

13

Questo sembra per ottenere semplici completamenti bash per me su El Capitan:

# .bashrc 
function _makefile_targets { 
    local curr_arg; 
    local targets; 

    # Find makefile targets available in the current directory 
    targets='' 
    if [[ -e "$(pwd)/Makefile" ]]; then 
     targets=$(\ 
      grep -oE '^[a-zA-Z0-9_-]+:' Makefile \ 
      | sed 's/://' \ 
      | tr '\n' ' ' \ 
     ) 
    fi 

    # Filter targets based on user input to the bash completion 
    curr_arg=${COMP_WORDS[COMP_CWORD]} 
    COMPREPLY=($(compgen -W "${targets[@]}" -- $curr_arg)); 
} 
complete -F _makefile_targets make 

Ecco come funziona:

  • completa -F [funzione nome] [nome del comando] - - questo generatore di bash registra un nuovo completamento per [nome comando] che viene generato dalla funzione bash [nome funzione]. Quindi, nel mio codice qui sopra, se si digita make [TAB][TAB] nella shell, si attiverà la funzione _makefile_targets().

  • se [[-e "$ (pwd)/Makefile"]]; quindi - assicurati che ci sia un Makefile nella directory corrente, altrimenti non provare un completamento bash.

  • grep -oe '^ [a-zA-Z0-9 _-] +:' Makefile - filtrare ogni riga del Makefile utilizzando l'espressione regolare per un nome di destinazione come "test". -o significa solo restituire la parte della linea che corrisponde. Ad esempio, dato un target Makefile come "test: build package", verrà restituito solo "test:"

  • | sed 's /: //' - prendendo i risultati grep, rimuovere i due punti dalla fine della riga

  • | tr '\ n' '' - Smoosh tutti gli obiettivi in ​​una sola riga, separati da uno spazio

All'interno di una funzione di completamento di bash, complete set di diverse variabili di ambiente per voi. COMP_WORDS è una matrice dell'elenco di scelte di completamento bash disponibili in base a ciò che l'utente ha digitato. COMP_CWORD è l'indice della parola attualmente selezionata.

Un altro compendio molto magico compgen prenderà un elenco di stringhe separate e filtrarle utilizzando la parola attualmente selezionata. Non sono affatto chiaro come funzioni.

Quindi, la linea di fondo è che le ultime due righe nella funzione filtrano il nostro elenco di target makefile (memorizzati all'interno di $targets) e li inseriscono in un array COMPREPLY. Il completamento della bash legge e visualizza COMPREPLY come scelte nella shell.


Ispirato da:

  1. https://gist.github.com/tlrobinson/1073865
  2. http://www.thegeekstuff.com/2013/12/bash-completion-complete/ (Esp 9.)
+0

Suppongo che aggiungendo in '.bashrc' una riga simile con' makefile' invece di 'Makefile' sia sufficiente per prendere in considerazione makefile con il nome in minuscolo (anche se i nomi in maiuscolo sono una buona pratica). –

+1

@ DenisBitouzé si! Ci sono un bel po 'di potenziali marche di makefile a seconda del tuo sistema operativo. – Rustavore