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?
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?
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:
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ą). –
@ DenisBitouzé tak! Istnieje wiele potencjalnych marek plików Makefile w zależności od systemu operacyjnego. – Rustavore
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. –
@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. –