zsh 프롬프트에서 이미 입력 한 텍스트로 기록을 검색하려면 어떻게해야합니까?


58

zsh에서는 Ctrl+로 기록을 검색 할 수 있음을 알고 있습니다 r. 그러나 종종 프롬프트에서 직접 명령을 입력하기 시작하지만 기록을 검색해야한다는 것을 알고 있습니다. Ctrl+를 누르면 r다음과 같이 빈 기록 검색 프롬프트가 나타납니다.

기록 검색 프롬프트가 미리 채워지지 않았습니다

내 프롬프트에는 텍스트가 있지만 히스토리 검색 프롬프트에는없는 텍스트가 있습니다. 프롬프트에 이미있는 텍스트로 히스토리 검색을 시작하는 방법은 다음과 같습니다.

기록 검색 프롬프트가 미리 채워짐

답변:


44

zle의history-search 기능을 사용할 수 있습니다 :

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

이것은 프롬프트에서 이미 입력 한 내용에 따라 히스토리 검색에 앞뒤로 바인드 Up되고 Down(자신의 이스케이프 시퀀스에 맞게 조정 됨).

따라서 "vim"을 입력 Up하고을 누르면 zsh는 "vim"으로 시작하는 명령에 대해서만 히스토리를 거꾸로 탐색합니다.

history-search-end 함수 (일반적으로 /usr/share/zsh/functions/Zle/)를 사용하고 다음 -end과 같이 각 행의 끝에 추가 하여 zsh의 히스토리에서 원하는 명령을 선택하면 커서를 행의 끝에 배치 할 수 있습니다 .

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

감사합니다 두 bindkey 명령이 작동하도록하려면 "-end"를 제거해야했습니다. 어쩌면 상황이 필요할 수 있기 때문에 답을 편집하지 않았습니다.
Sean Mackesey 2013 년

문제 없음 : 명확하게 설명하려는 세부 사항으로 답변을 업데이트했습니다.
jasonwryan

이것은 내가 최신 버전의 oh my zsh로 업그레이드 할 때 2015 년 11 월 말, 12 월 말까지 작동했습니다. 어떤 아이디어? 암시? 다른 사람이 이것을보고 있습니까? 디버깅하는 방법?
hani 님이

2
@hanielabed Oh-my-Zsh는 clusterfsck입니다. 나는 ... 그것은 역사를 검색 한 근본적인 무언가를 휴식 것이 전혀 놀랄 아니다
jasonwryan

1
빈 기록 검색에서 커서가 끝으로 이동하지만 부분 검색에서 동일한 위치를 유지하는 방법이 있습니까? 이것은 현재 bash에서 발생합니다.
CMCDragonkai

19

또 다른 유용한 옵션은 history | grep

별명 지정 (예 :

alias hg='history | grep'

입력 hg whatever한 명령을 검색 할 수 있습니다 ( 예 :

$ 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 

이 별칭을 내 도트 파일에 넣었습니다.


17
무엇 hg의욕 오, 그래 ... 생각 나게!

12

당신이 사용하는 경우 오 - 내 - zsh을을 추가 history-substring-search받는 plugins=(...)라인.

그런 다음 추가

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

어딘가에서 읽은 행 아래 source $ZSH/oh-my-zsh.sh. 새 터미널을 저장하고 실행하거나 source ~/.zshrc현재 터미널에서 실행 하십시오.

참고 : ^[[A 내가 사용하는 터미널 (키티) 및 기타 여러 곳에서 위쪽 화살표의 이스케이프 시퀀스입니다. 선택한 터미널을 체크인하려면 입력 showkey -a한 다음 이스케이프 시퀀스를 찾을 키를 누릅니다.


이 키맵핑이 무엇을하는지는 확실하지 않습니다. 위의 대답은 "이것은 프롬프트에서 이미 입력 한 내용을 기반으로 히스토리 검색에 앞뒤로 바인딩합니다 (자신 이스케이프 시퀀스에 맞게 조정)"고 설명합니다.
콜린 D

@ColinD 설명을 추가했습니다
joelostblom

1
하위 문자열 검색이 가장 좋으며 명령의 슈퍼 세트로 시작합니다. 내가 한 oh-my-zsh 사용자가 아니고 구현하기 brew install zsh-history-substring-search위해 repo readme에 대한 지침을 확인한 다음 결과에 정말 만족하는 답변을 작성하겠습니다.
멀린


4

내가보기 엔 사용하는 것이 좋습니다 것 "$terminfo[kcuu1]"또는 "$key[Up]"같은 하드 코딩 된 물건보다는 "^[[A"어떤 또는 특정 시스템에서 작동하지 않을 수 있습니다.

/etc/zsh/zshrc더 많은 키를 확인하십시오 . 내 시스템의 모습은 다음과 같습니다. 나는 terminfo열쇠가 정의 될 가능성이 더 크다고 생각합니다 .

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

사용은 zsh-autosuggestions어떻습니까?

문제는 입력 한 각 명령에 대해이 플러그인은 수락 할 수있는 제안을 보여줍니다. 사용 해보고 피드백을주세요.

플러그인이 없으면 Ctrlr입력을 시작하자마자 일치하는 명령이 제안으로 나타납니다.


2

vi 모드 플러그인을 사용합니다 . 그리고 ~ / .zshrc에는 다음과 같은 바인딩이 있습니다.

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

그러면 텍스트를 입력하지 않으면 및 뒤로 및 앞으로 검색 을 사용할 수 ^P있고 ^N입력하면 필터링 된 검색으로 사용할 수 있습니다.


1

"substring"검색이 더 유용하다는 cheflo에 동의합니다. 나는 거기에 댓글을 달 수 없으므로 새로운 답변을 시작했습니다. oh-my-zsh를 사용하고 ~ / .zshrc의 plugins = (...)에 "history-substring-search"를 추가합니다. 그런 다음 ~ / .zshrc를 소스하십시오. 더 추가 할 필요가 없습니다. "bindkey"를 사용하여 다음을 확인하십시오.

"^ [OA"기록 하위 문자열 검색
"^ [OB"기록-하위 문자열 검색

나중에 "to"와 위쪽 화살표를 입력하면 "history"가 나타나고 "to"가 강조 표시됩니다 (이전에 "history"명령을 사용한 경우).


1

대신 zaw 를 사용하면 검색이 훨씬 더 나은 다중 키워드 슈퍼 검색으로 대체되고 문제가 해결됩니다. 검색 기록은 zaw가 검색 할 수있는 것 중 하나 일뿐입니다.

작은 소개 / 토론


0

oh-my-zsh를 사용하고 joelostblom, James의 하위 문자열 솔루션을 사용하므로 .zshrc를 다음과 같이 수정합니다. (13 행에서 "source $ ZSH / oh-my-zsh.sh" 그런 다음 주변 코드를 수정하십시오.)

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 -vctrl-a, ctrl-e를 깰 것입니다. 모든 Ctrl 명령 일 가능성이 높습니다.
Michael Ozeryansky

0

Oh My My Zsh 답변

이것은 MacOS에서 위 / 아래 화살표를 통해 하위 문자열 히스토리를 쉽게 액세스 할 수있게 해주었습니다. 열쇠 바인딩은 당신에게 달려 있습니다.

하위 문자열 검색 기록은 문자열로 시작하는 명령에 액세스하는 것보다 낫습니다. 대부분의 경우 glob 또는 정규식 일치가없는 ctrl-r과 비슷합니다.

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

이제 이것을 완전히 즐기십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.