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.