Chciałbym poinstruować bash, aby użył specjalnej metody do zakończenia niektórych nazw katalogów. Na przykład, bash wywołałby mój program, aby wykonać uzupełnienie, jeśli ścieżka zaczyna się od „$$”, a w przeciwnym razie wykonałby ukończenie.
Czy to w ogóle możliwe? Jak byś to wdrożył?
Bounty : Naprawdę doceniłbym odpowiedź na to pytanie. Celem jest umożliwienie autojumpowi uzupełnienia ścieżek dla wszystkich poleceń, gdy użytkownik uruchomi je z określonym prefiksem. Na przykład podczas kopiowania pliku z odległego katalogu możesz wpisać:
cp $$patern + <Tab>
i autojump zakończy się
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
i musisz tylko dodać miejsce, w którym chcesz umieścić plik. Oczywiście mogę użyć komentarza otta, aby dodać go do kilku konkretnych poleceń, ale jeśli ktoś ma lepszy pomysł, byłbym bardzo wdzięczny.
źródło
Odpowiedzi:
Możesz to zrobić, zastępując domyślne powiązanie dla TAB (^ i). Najpierw musisz przesłonić powiązanie TAB, następnie musisz zbudować funkcję, która wywołuje twoje polecenie, na koniec musisz pobrać dane wyjściowe z tego polecenia i zaktualizować zmienną zawierającą bieżący wiersz polecenia.
Ta funkcja pobiera bieżący wiersz poleceń i zmienia ostatnie dwa znaki na „huugs”.
Na przykład prawdopodobnie chcesz zmienić linię new_argument, aby wyglądała następująco:
Teraz przesłoń wiązanie ^ i:
Teraz sprawdź, czy to działa:
więc normalne zakończenie nadal działa, możesz przetestować część $$, wykonując cd $$ ... itd
Jeśli napotkasz problemy, włącz tryb szczegółowy:
Wydrukuje wszystko, co robi funkcja.
Przetestowałem to na Ubuntu 11 przy użyciu wersji bash 4.2.8 (1) (domyślnie).
źródło
Procedurę ukończenia bash można zaprogramować jako skrypt powłoki.
Oto przykład skrypt powłoki, który zastąpi w dowolnym parametrze
$$[Tab]
przezmy replacement string
, ale tylko dla określonego poleceniamycommand
i tylko wtedy, gdy parametr jest dokładnie „$$”:Musisz uruchomić skrypt, aby uruchomić Bash
source <file-name>
(lub polecenie kropki), aby zaczął działać, a następnie:Aby zawsze działało dla niektórych lub wszystkich użytkowników, włącz to do jednej z procedur profilu bash .
Problem z
complete
poleceniem polega na tym, że będzie on działał tylko dla jednej lub więcej nazw poleceń, które są określone jako parametry. Można po prostu podać listę wszystkich poleceń, które mogą być używane przez użytkowników lub w rozpaczliwych przypadkach rozszerzać/bin/* /usr/bin/* ~/bin/*
.Testowane na CentOS 5.5.
Ten prosty skrypt jest oparty na źródłach, które wymieniłem w drugiej odpowiedzi - tej, która została usunięta przez moderatora studiohacka. Jeśli jesteś zainteresowany, poproś go, aby go cofnął.
źródło