2015-11-17 15 views
5

Cele programu Makefile są dostępne do ukończenia w systemie Linux, ale w systemie AFAICS, a nie w systemie Mac OS (10.8.5).Autouzupełnianie pliku Makef na komputerze Mac

Czy możliwe jest ukończenie pracy z tym systemem operacyjnym?

+1

Trzeba sprawdzić, czy można znaleźć (instalacja i/lub włączyć) zakończenia bash approprate na twoim komputerze. Nie wiem, czy te statki z OS X, czy są dostępne przez napar lub coś podobnego. –

+0

@EtanReisner Powinienem wspomnieć, że zakończenie w Mac OS 10.8 dla, np. 'cd'. Stąd myślę, że niektóre zakończenia bash są już dostępne na komputerze. –

Odpowiedz

13

Wydaje się to osiągnąć proste uzupełnienia bash dla mnie na 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 

Oto jak to działa:

  • kompletny -F [nazwa funkcji] [nazwa polecenia] - - ten wbudowany bash rejestruje nowe zakończenie dla [nazwa polecenia], które jest generowane przez funkcję bash [nazwa funkcji]. Tak więc w powyższym kodzie, jeśli wpiszesz w powłoce nazwę make [TAB][TAB], uruchomisz funkcję _makefile_targets().

  • jeśli [[-e "$ (pwd)/Makefile"]]; następnie - upewnij się, że plik Makefile znajduje się w bieżącym katalogu, w przeciwnym razie nie próbuj zakończyć bashu.

  • grep -oE '^ [A-Z 0-9 _-] +:' Makefile - filtr każdej linii Makefile pomocą wyrażenia regularnego o nazwę docelowego "test:". -o oznacza tylko zwrócić część pasującej linii. Na przykład, biorąc pod uwagę cel Makefile taki jak "test: pakiet kompilacji", tylko "test:" zostanie zwrócony

  • | sed 's /: //' - przyjmując wyniki grep, usuń dwukropek z końca linii

  • | tr „\ n” „” - Smoosh wszystkich celów na jednej linii, oddzielone jedną spacją

wewnątrz funkcji zakończenia bash, complete zestawów kilka zmiennych środowiskowych dla Ciebie. COMP_WORDS to tablica listy dostępnych opcji zakończenia bash w oparciu o to, co użytkownik wpisał. COMP_CWORD to indeks aktualnie wybranego słowa.

Inna bardzo magiczna wbudowana compgen zrobi listę spacji oddzielnie i przefiltruje je za pomocą aktualnie wybranego słowa. Nie mam pojęcia, jak to działa.

W związku z tym ostatnie dwie linie w funkcji filtrują naszą listę celów pliku Makefile (przechowywanych wewnątrz $targets) i umieszczają je w tablicy COMPREPLY. Zakończenie bash odczytuje i wyświetla COMPREPLY jako opcje w powłoce.


Zainspirowany:

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

Przypuszczam, że dodanie '.bashrc' podobnie do' makefile' zamiast 'Makefile' wystarczy do uwzględnienia plików makefile z małą literą (nawet jeśli nazwy pisane wielkimi literami są lepszą praktyką). –

+1

@ DenisBitouzé tak! Istnieje wiele potencjalnych marek plików Makefile w zależności od systemu operacyjnego. – Rustavore

Powiązane problemy