Automatyczne uzupełnianie często używanych poleceń wiersza poleceń?

15

W przypadku niektórych projektów często wpisuję kilka poleceń, na przykład:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

i

./runmyproject --with some --command line --options set

Widząc, że jestem dość leniwy, staram się unikać wielokrotnego wpisywania tych poleceń. Więc oczywiście mogę dużo użyć klawisza up, aby znaleźć te polecenia, ale często mam też tak wiele poleceń pomiędzy nimi, że szukanie ich zajmuje więcej czasu niż samo pisanie.

Zastanawiam się teraz, czy istnieje jakieś narzędzie, które może zasugerować pełne polecenie, którego często używam, gdy nie napisałem jeszcze wszystkich. Tak, że mogę na przykład wpisać „cd an /” i sugeruje to resztę ścieżki, ponieważ tak często go używałem w zeszłym miesiącu.

Znalazłem coś o nazwie Bash Smart Complete. Jest to jednak trochę „głupie”, ponieważ nie uwzględnia poleceń, których wcześniej użyłem. Właśnie znalazłem tę SO odpowiedź , która sugeruje umieszczenie poleceń, których często używam w pliku. To jednak nie jest wystarczająco responsywne, ponieważ musiałbym utworzyć nowy plik za każdym razem, gdy uruchamiam nowe projekty lub zmieniam foldery lub argumenty programu.

Czy ktoś zna jakieś inne narzędzie lub inny sposób na osiągnięcie tego? A może ktoś wiedziałby, w jaki sposób mogę zmienić Bash Smart Complete, aby mógł spojrzeć na polecenia, których użyłem w poprzednim miesiącu, i dokończyć polecenie, które pasuje i było najczęściej używane w ostatnim miesiącu?

[EDYCJA] Poniżej kilka naprawdę świetnych odpowiedzi. Nie zaznaczyłem jeszcze żadnej jako jednoznacznej odpowiedzi. Nie dlatego, że nie lubię odpowiedzi, ale dlatego, że żadna z nich nie jest absolutnym zwycięzcą. Myślę, że Finalterm to świetny projekt. Niestety nadal jest dość szorstki na brzegach. Na przykład; nie obsługuje jeszcze kopiowania i wklejania. Miałem jednak oko na ten projekt, ponieważ kiedy dojrzeje, myślę, że będzie to świetna aplikacja terminalowa. Co do innych odpowiedzi; albo zasugerowali utworzenie aliasu, co nie jest tym, co chcę zrobić, ponieważ tworzy dodatkową pracę zamiast odbierania pracy, lub użycie Ctrl + R, co jest genialne (nie wiedziałem o tym!). Kilka osób zasugerowało użycie Ctrl + R, więc nie mogę tak naprawdę wyróżnić jednej odpowiedzi nad drugą.

Na razie zdecydowanie używam Ctrl + R, a w przyszłości mogę użyć Finalterm.

Dzięki za wszystkie świetne odpowiedzi!

kramer65
źródło
2
Powinieneś naprawdę spróbować zsh. Oferuje wszystko, o co prosisz, i wiele więcej. Przejście z bash do zsh
Basharat Sialvi
Według strony podręcznika BASH funkcja jest również dostępna w BASH jako „dynamiczna-pełna-historia”. Domyślnie jest on powiązany z klawiszem Alt + Tab, co czyni go bezużytecznym, ale można zmienić powiązanie za pomocą „bind”.
Boris Bukh
1
@BasharatSial, co konkretnie robi zsh, aby w tym pomóc?
poolie

Odpowiedzi:

16

Jeśli polecenia są często używane, są one zapisywane w historii poleceń .bash_history.

Teraz sztuczka: możesz cofnąć wyszukiwanie w tej historii, aby ponownie wykonać polecenia, naciskając CTRL-r .

W trybie wyszukiwania historii odwrotnej bash pokazuje, na żywo, w trakcie pisania , ostatnie polecenie w historii, które zaczyna się od podanych danych. Następnie naciśnij klawisz Enter, aby zaakceptować i wykonać proponowane polecenie. Naciskaj CTRL-R, aby przechodzić do starszych poleceń z tym samym prefiksem.

Jest to wbudowane w bash, nie trzeba dostosowywać skryptów ani instalować oprogramowania :) Jest to jedna z najbardziej przydatnych funkcji bash, imho.

catchmeifyoutry
źródło
3
Użyj [ CTRL-g ], aby wyjść z trybu wyszukiwania historii, jeśli nie wykonuje polecenia (na przykład jeśli nie znalazłeś tego, którego potrzebujesz).
MountainX-for-Monica,
8

Wklej (Ctrl-Shift-V) następujące elementy do ekranu terminala:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

Wyjdź (Ctrl-D) z ekranu terminala, a następnie ponownie otwórz terminal.

Teraz możesz po prostu wpisać pierwszą parę znaków, a następnie nacisnąć przycisk w górę lub w dół, aby przewinąć filtrowaną listę

Scott May
źródło
3
To najprostsza odpowiedź na wykonanie zadania!
cxrodgers
8

Ostateczny termin

Jest to bardzo obiecująca aplikacja terminalowa zwana ostatecznym terminem . Wśród wielu funkcji ma również historię przypominania poleceń, dzięki czemu można je następnie wybrać. Oto kilka innych funkcji:

Ostateczny termin

Możesz przeczytać więcej na ten temat w tym artykule .

Oto strona od twórców. http://finalterm.org/

Aby go zainstalować

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

Ostrzeżenie

Powiedziałem, że to obiecujące. Jedynym problemem jest to, że jest w wersji 0.1. Więc niektóre rzeczy jak vimi nanojeszcze nie działają dobrze. Zauważyłem również, że nie obsługuje jeszcze przeciągania i upuszczania oraz kopiowania i wklejania. Ale ma funkcję, o którą prosisz. W miarę dojrzewania oprogramowanie stanie się jednym z najlepszych terminali na komputery stacjonarne.

Zrzut ekranu

Oto funkcja w akcji:

 funkcja w akcji

Mam nadzieję że to pomoże.

* Jestem na Saucy, dlatego mam pochodzenie Salamandra :)

Max Tither
źródło
Dzięki za wskazówkę! Sprawdziłem termin i wygląda dobrze. Niestety nie obsługuje jeszcze kopiowania i wklejania. Próbowałem Ctrl + V, Ctrl + Shift + V i kliknąłem prawym przyciskiem myszy, ale żaden z nich nie działa. Więc będę o tym pamiętać na przyszłość!
kramer65
To największa wada, jaką widziałem. Projekt jest jednak młody i mam nadzieję, że zostanie on wkrótce dodany. Widzę aplikację terminalową bez obsługi kopiowania i wklejania.
Max Tither
7

Użyj aliasdla całego polecenia lub dodaj katalog do swojego $PATH. Ponadto nie musisz zmieniać katalogów w miejscu, w którym ma zostać uruchomiony Twój plik wykonywalny (lub skrypt, czy cokolwiek innego), więc jest to dość proste. Obie metody wymagają ponownego uruchomienia używanego terminala, zanim zmiany zaczną obowiązywać.

Oto jak utworzyć bash aliasdla swojego przykładu (dodaj następujący wiersz do ~/.bashrcpliku):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

W ten sposób wszystko, co musisz zrobić, to wprowadzić dane runmyprojectdo terminala gdziekolwiek jesteś, bez konieczności określania opcji / argumentów.

Alternatywnie możesz dodać ścieżkę projektu do $PATHzmiennej środowiskowej. Aby to zrobić, dodaj do ~/.bashrcpliku następujące wiersze :

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

W takim przypadku nadal musisz podać opcje / argumenty pliku wykonywalnego podczas jego uruchamiania.

oaskamay
źródło
1
Chodzi o to, że chciałbym, aby terminal reagował na moje użycie. Dzięki temu muszę zmieniać alias za każdym razem, gdy zaczynam pracę nad nowymi projektami lub kiedy zmieniam strukturę katalogów mojego projektu. Główną częścią mojego pytania jest to, że chcę się uczyć na podstawie tego, czego używam, zamiast mówić mu, co mam robić.
kramer65
O, rozumiem. Wtedy najlepiej oceniana odpowiedź powinna załatwić sprawę. A przynajmniej blisko.
oaskamay
4

Gdy często muszę zmienić katalog na taki:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

Zrobiłbym to tylko raz:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

Od tego momentu użyj:

cd ~/pr[tab]

Jeśli chodzi o:

./runmyproject --with some --command line --options set

Chciałbym użyć wyszukiwania historii bash. W wierszu polecenia naciśnij Ctrl-R i wpisz „runmy”. Voila, cała komenda ze wszystkimi opcjami, jak była ostatnio wprowadzona, jest właśnie tam, aby ją ponownie wprowadzić. Jeśli nie podobały mi się opcje, których użyłem ostatni raz i chciałem spojrzeć na wcześniejsze polecenia, naciskałem Ctrl-R, aby przechodzić między wszystkimi poprzednimi poleceniami zawierającymi „runmy”.

Wyszukiwanie historii Ctrl-R może również pomóc w poleceniu „cd”, jeśli nie podoba ci się pomysł dowiązania symbolicznego. [Ctrl-R] ​​/ proj najprawdopodobniej przywróci ostatnią komendę, której użyłeś do cd do tego katalogu.

Zamiast dodawać alias lub przechodzić na specjalną powłokę, zawsze wolę nauczyć się korzystać z funkcji bash zaprojektowanych, aby pomóc w tego rodzaju rzeczach. W ten sposób mogę korzystać z tych samych funkcji na zdalnych komputerach lub jeśli muszę usiąść przy terminalu kolegi.

Steven K.
źródło
Dzięki za Twoją sugestię. Chodzi o to, że nie chcę ustawiać kolejnej rzeczy, którą mam się zająć, gdy na przykład zmienia się folder projektu lub rozpoczynam nowy projekt. Chodzi o to, że chciałbym, aby terminal reagował na moje użycie. Główną częścią mojego pytania jest to, że chcę się uczyć na podstawie tego, czego używam, zamiast mówić mu, co mam robić. Naprawdę podoba mi się funkcja Ctrl-R. Dzięki za to!
kramer65
4

naciśnij control + r na klawiaturze - przejdzie w tryb historii wstecz i możesz wpisać część, którą znasz, a całe polecenie pokaże

Istnieją inne sposoby wymienione tutaj

http://www.talug.org/events/20030709/cmdline_history.html

Jednak najczęściej używam kontroli R.

exussum
źródło
2

Spróbuj tego ... Działa to dla wszystkich poleceń w twoim pliku historii ... to to samo, co Ctrl+ R, ale myślę, że jest to bardziej intuicyjne :)

  1. edytować /etc/inputrc

    sudo vim /etc/inputrc
  2. odkomentuj lub dodaj tę dwie linie

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. wyloguj się / zaloguj


następnie spróbuj napisać jakieś polecenie wymienione w historii ...

lubić...

ls -lah

pisać

ls

i naciśnij

Page Uplub Page Dndo nawigacji w pliku historii w poszukiwaniu poleceń rozpoczynających się od „ls”

Jeśli zrobiłeś wszystko dobrze, powinien automatycznie wykonać polecenie ...

Wolfy
źródło