Jak mogę przeszukiwać historię z tekstem już wprowadzonym w wierszu polecenia w Zsh?


58

W Zsh wiem, że mogę przeszukiwać historię za pomocą Ctrl+ r. Często jednak zaczynam wpisywać polecenia bezpośrednio po znaku zachęty, ale potem zdaję sobie sprawę, że powinienem przeszukiwać historię. Po naciśnięciu przycisku Ctrl+ rpojawia się pusty monit wyszukiwania historii, taki jak ten:

monit wyszukiwania historii nie jest wstępnie wypełniony

Zauważ, że w moim monicie jest tekst, ale nie w monicie wyszukiwania historii. Jak rozpocząć wyszukiwanie historii z tekstem już wyświetlonym w wierszu, aby wyglądał tak:

zapytanie wyszukiwania historii wstępnie wypełnione

Odpowiedzi:


44

Możesz użyć funkcji zlehistory-search :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Spowoduje to powiązanie Upi Down(dostosowanie do własnych sekwencji ucieczki) wyszukiwania historii, wstecz i do przodu, w oparciu o to, co zostało już wprowadzone w wierszu polecenia.

Jeśli więc wpiszesz „vim” i naciśniesz Up, zsh przejdzie do tyłu przez twoją historię tylko dla tych poleceń rozpoczynających się od „vim”.

Możesz dodatkowo umieścić kursor na końcu wiersza po wybraniu żądanego polecenia z historii zsh za pomocą funkcji wyszukiwania końca historii (zwykle znajduje się w /usr/share/zsh/functions/Zle/) i dołączenia -endna końcu każdego wiersza, tak jak:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

Wielkie dzięki. Musiałem jednak usunąć „-end” dla obu poleceń bindkey, aby działały. Nie edytowałem twojej odpowiedzi, ponieważ może jest jakaś sytuacja, w której są one konieczne?
— Sean Mackesey

Nie ma problemu: zaktualizowałem odpowiedź o szczegóły, które chciałeś wyjaśnić.
— jasonwryan

To działało dla mnie do końca listopada, grudnia 2015 r., Kiedy zaktualizowałem do najnowszej wersji oh my zsh. Jakieś pomysły? sugestia? ktoś jeszcze to widzi? jak debugować?
— hani opracował

2
@hanielabed Oh-my-Zsh jest klastrem; Wcale mnie to nie dziwi, że
— złamałoby

1
Czy istnieje sposób, aby kursor przeskakiwał do końca z pustego wyszukiwania historii, ale pozostawał na tej samej pozycji dla częściowego wyszukiwania? Tak właśnie dzieje się obecnie w bash.
— CMCDragonkai

19

Inną przydatną opcją jest history | grep

Przypisz alias, np

alias hg='history | grep'

następnie możesz wpisać, hg whateveraby wyszukać używane polecenia, np

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Umieszczam ten alias w moich plikach kropek.


17
Co hgmi przypomina ... O tak, Mercurial!

12

Jeśli używasz oh-my-zsh , dodaj history-substring-searchdo plugins=(...)linii.

Następnie dodaj

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

gdzieś poniżej linii, która czytała source $ZSH/oh-my-zsh.sh. Zapisz i uruchom nowy terminal lub uruchom source ~/.zshrcw bieżącym terminalu.

Uwaga: ^[[A to sekwencja ucieczki dla strzałki w górę w terminalu, którego używam (kotek) i wielu innych. Aby sprawdzić wybrany terminal, wpisz, showkey -aa następnie naciśnij klawisz, dla którego chcesz znaleźć sekwencję zmiany znaczenia.


Nie jest jasne, co robi to mapowanie klawiszy, powyższa odpowiedź wyjaśnia „To wiąże w górę i w dół (dostosuj własne sekwencje specjalne) do wyszukiwania historii, wstecz i do przodu, w oparciu o to, co zostało już wprowadzone w monicie”.
— Colin D

@ColinD Dodano notatkę do wyjaśnienia
— joelostblom

1
wyszukiwanie podłańcuchów jest najlepsze, zaczyna się od nadrzędnego polecenia. wdrożyć, nie robiąc tego, oh-my-zsh, zrobiłem to brew install zsh-history-substring-search, sprawdziłem repozytorium repo, aby uzyskać instrukcje, po prostu pójdę naprzód i utworzę odpowiedź Jestem naprawdę zadowolony z wyniku.
— Merlin


4

Zdecydowanie polecam używanie "$terminfo[kcuu1]"lub "$key[Up]"raczej zakodowanie na sztywno takich rzeczy, "^[[A"które mogą, ale nie muszą działać w danym systemie.

Sprawdź /etc/zsh/zshrcwięcej kluczy. Oto jak to wygląda w moim systemie. Myślę, że terminfoklucze będą bardziej prawdopodobne.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)

4

Co z używaniem zsh-autosuggestions?

Chodzi o to, że dla każdego wpisanego polecenia ta wtyczka wyświetli kilka sugestii, które można zaakceptować lub nie. Wypróbuj i przekaż nam swoją opinię.

Bez wtyczek możemy nacisnąć, Ctrlraby wykonać odwrotne przeszukiwanie historii, gdy tylko zaczniesz wpisywać dopasowane polecenia pojawią się jako sugestie.


2

Używam wtyczki trybu vi . A potem w moim ~ / .zshrc mam następujące powiązania:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

To pozwala mi używać ^Pi ^Njako normalne wyszukiwanie do tyłu i do przodu, jeśli nie wprowadzę żadnego tekstu, oraz jako wyszukiwanie filtrowane, jeśli to zrobię.


1

Zgadzam się z cheflo, że wyszukiwanie „podciągów” jest bardziej przydatne. Nie mogę komentować, więc zacząłem nową odpowiedź. Używam oh-my-zsh i dodaję „history-substring-search” do wtyczek = (...) ~ / .zshrc. Następnie źródło ~ / .zshrc. Nie musisz nic więcej dodawać. Użyj „klucza powiązania”, aby zweryfikować:

„^ [OA” history-substring-search-up
„^ [OB” history-substring-search-down

Później wpiszesz „do” i strzałkę w górę, pojawi się „historia” i podświetlone „do” (jeśli wcześniej używałeś polecenia „historia”).


1

Zamiast tego możesz użyć zaw , który całkowicie zastępuje twoje wyszukiwanie znacznie lepszym super wyszukiwaniem wielu słów kluczowych i rozwiązuje również twój problem - historia wyszukiwania jest tylko jedną z rzeczy, które zaw może wyszukiwać.

Małe wprowadzenie / dyskusja tutaj


0

Ponieważ używam oh-my-zsh i używam rozwiązania substring z joelostblom, James, modyfikuję .zshrc w następujący sposób: (który w linii 13 znajduje wiersz „source $ ZSH / oh-my-zsh.sh” , a następnie zmodyfikuj otaczający go kod).

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -vzepsuje ctrl-a, ctrl-e. Najprawdopodobniej wszystkie komendy ctrl.
— Michael Ozeryansky

0

Odpowiedź nie-Oh-My-Zsh

To działało dla mnie (na macOS), aby historia podciągów była łatwo dostępna za pomocą strzałki góra / dół. Wiązanie klawiszy należy do Ciebie.

Historia wyszukiwania podciągów jest lepsza niż tylko dostęp do poleceń rozpoczynających się ciągiem. W większości przypadków jest to bardziej ctrl-r, te bez globów lub dopasowania wyrażenia regularnego.

Począwszy od instrukcji w zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Teraz dobrze się tym bawię.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.