Jak mogę zmienić zakończenie historii basha, aby zakończyć to, co jest już w linii?

133

Kilka miesięcy temu znalazłem polecenie, które sprawiło, że moja historia basha została automatycznie uzupełniona o to, co jest już w linii po naciśnięciu strzałki w górę:

$ vim fi

naciśnij

$ vim file.py

Chciałbym ustawić to na moim nowym komputerze, ponieważ oszczędza to dużo czasu podczas prowadzenia wielkiej historii. Problem polega na tym, że przez całe życie nie pamiętam, gdzie o tym wspomniano, a czytanie niekończących się odniesień do basha i samouczków niestety też nie pomogło.

Czy ktoś zna polecenie?

blokkie
źródło

Odpowiedzi:

223

Prawdopodobnie coś takiego

# ~ / .inputrc
"\ e [A": przeszukiwanie historii wstecz
"\ e [B": przeszukiwanie historii do przodu

lub równoważnie,

# ~ / .bashrc
jeśli [[$ - == * i *]]
następnie
    bind '"\ e [A": history-search-backward'
    bind '"\ e [B": history-search-forward'
fi

(instrukcja if sprawdza tryb interaktywny)

Zwykle w górę i w dół są powiązane odpowiednio funkcje Readline previous-historyi next-history. Wolę powiązać PgUp / PgDn z tymi funkcjami, zamiast zastępować normalne działanie Up / Down.

# ~ / .inputrc
"\ e [5 ~": przeszukiwanie-historii-wstecz
"\ e [6 ~": przeszukiwanie historii do przodu

Po modyfikacji ~/.inputrcuruchom ponownie powłokę lub użyj Ctrl+ X, Ctrl+, Raby nakazać jej ponowne przeczytanie ~/.inputrc.


Przy okazji, jeśli szukasz odpowiedniej dokumentacji:

Bash używa Biblioteki GNU Readline jako znaku zachęty powłoki i historii.

ephemient
źródło
Dziękuję za odpowiedź. Brzmi znajomo, ale niestety nie działa dla mnie. Umieszczenie go w .inputrc nic nie zmienia, a umieszczenie w .bashrc powstrzyma strzałki przed robieniem czegokolwiek. Jakieś pomysły?
blokkie
Nieważne. historia-pełna- * nie istnieje; istnieją tylko funkcje wyszukiwania w historii *. Dzięki!
blokkie
Ach, najwyraźniej pomyliłem się w pierwszych dwóch przykładach ... chociaż ostatni był poprawny. Naprawię to.
ephemient
@ user1037114: to jest pytanie samo w sobie, powinieneś je zadać we własnym poście.
kamaradclimber
Naprawiło to strzałki w górę / w dół, używając trybu vi w bash. Uwaga, muszę wcisnąć „Esc” (tryb poleceń), aby to zadziałało.
Chris,
5

Zaktualizuj plik .inputrc, wprowadzając:

"\C-[OA": history-search-backward
"\C-[[A": history-search-backward

"\C-[OB": history-search-forward
"\C-[[B": history-search-forward
nate_weldon
źródło
4
Co to za klucze?
Chris,
Nie wiem, jakie konkretnie są te klucze, ale ta odpowiedź naprawiła tę funkcję dla mnie, gdy klawisze w górę iw dół nie przeszukiwały historii podczas używania tmux i st terminala na X11.
razzintown
1
@razzintown dla st prawdopodobnie masz, set enable-keypad onaby delklucz działał poprawnie ( faq ). Gdy klawiatura jest włączona, klawisze strzałek są "\C-[OA"i "\C-[OB"(i "\C-[OC"i "\C-[OD"). Opublikowałem odpowiedź poniżej, aby to wyjaśnić.
MauricioRobayo
@Chris Są to klawisze ze strzałkami w górę iw dół w trybie klawiatury oraz klawisze ze strzałkami w górę iw dół w trybie ANSI. Zobacz moją odpowiedź poniżej.
MauricioRobayo
3

Jeśli set enable-keypad onjest w twoim, ~/.inputrcjak niektórzy ( bezsilni, prosty terminal ) użytkownicy, pamiętaj, że klawisze strzałek są w trybie klawiatury. Ubuntu jest dostarczane z tym przydatnym /usr/share/doc/bash/inputrc.arrows:

# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.
#
# Arrow keys in keypad mode
#
"\C-[OD"        backward-char
"\C-[OC"        forward-char
"\C-[OA"        previous-history
"\C-[OB"        next-history
#
# Arrow keys in ANSI mode
#
"\C-[[D"        backward-char
"\C-[[C"        forward-char
"\C-[[A"        previous-history
"\C-[[B"        next-history
#
# Arrow keys in 8 bit keypad mode
#
"\C-M-OD"       backward-char
"\C-M-OC"       forward-char
"\C-M-OA"       previous-history
"\C-M-OB"       next-history
#
# Arrow keys in 8 bit ANSI mode
#
"\C-M-[D"       backward-char
"\C-M-[C"       forward-char
"\C-M-[A"       previous-history
"\C-M-[B"       next-history

Więc nie jestem pewien, czy będziesz potrzebować wszystkiego, ale nie zaszkodzi mieć w ~/.inputrc:

# Arrow keys in keypad mode
"\C-[OA": history-search-backward
"\C-[OB": history-search-forward
"\C-[OC": forward-char
"\C-[OD": backward-char

# Arrow keys in ANSI mode
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
"\C-[[C": forward-char
"\C-[[D": backward-char

Jest to również na ten sam temat: moje klawisze kursora nie działają, a także ten xterm: klawisze specjalne

MauricioRobayo
źródło
1

Z ohmyzsh, użyj tego w swoim .zshrc :

bindkey '^[OA' history-search-backward
bindkey '^[OB' history-search-forward

Aby przeładować source ~/.zshrclub ponownie uruchomić terminal.

Źródło: https://superuser.com/a/418299/71680

Benjamin Crouzier
źródło
Na zsh zadziałała opcja podana w linku źródłowym: bindkey '\ e [A' history-search-backward bindkey '\ e [B' history-search-forward
Michael Massey.
-3

Może być konieczne włączenie uzupełniania bash.

Czek

  • /etc/profile
  • /etc/bash.bashrc
  • ~/.bashrc

aby sprawdzić, czy którykolwiek z powyższych plików jest źródłem /etc/bash_completion. to znaczy

. / etc / bash_completion

Jeśli /etc/bash___completionnie pochodzi z żadnego z powyższych plików, musisz dodać go do jednego z nich.

Jeśli chcesz, aby wszyscy użytkownicy basha na twoim komputerze mieli ukończenie basha, źródło /etc/bash_completionz /etc/bash.bashrc.

Jeśli to tylko Ty chcesz ukończyć bash, skorzystaj /etc/bash_completionz pliku ~/.bashrc.

Skazać
źródło
2
Wypełnianie zakładek jest fajne, ale nie to samo, co przypominanie historii, o co prosił oryginalny plakat.
ephemient