ZSH : 위 / 아래 키 검색 기록?


22

현재 내 .zshrc에 다음이 있습니다.

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

그러나 이것은 공백 문자가 발생하기 전에 현재 입력 내용과 일치하는 것 같습니다. 예를 들어, sudo ls /내 기록에서로 시작하는 모든 줄을 일치 sudo시키는 반면 전체 입력과 일치하는 줄만 일치시키고 싶습니다. (즉 sudo ls /etc일치하지는 않지만 sudo cat /var/log/messages)

원하는 행동을 얻기 위해 무엇을 변경해야합니까?

관련이있는 경우 내 .zshrc 전체는 다음과 같습니다. https://gist.github.com/919566

답변:


9

이것은 문서화 된 동작입니다 .

down-line-or-search
버퍼에서 한 줄 아래로 이동하거나 이미 맨 아래 줄에 있으면 버퍼에서 첫 번째 단어로 시작하는 줄을 히스토리에서 앞으로 검색하십시오.

원하는 것을 정확하게 수행하는 기존 위젯이없는 것 같으므로 직접 위젯을 만들어야합니다. 다음과 같이 동작 up-line-or-search하지만 검색 문자열로 첫 단어 대신 행의 시작 부분 (커서까지)을 사용 하는 위젯을 정의하는 방법은 다음과 같습니다 . 실제로 멀티 라인 입력에서는 테스트되지 않았습니다.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

다른 방법은을 사용하는 history-beginning-search-backward것이지만 커서가 첫 번째 줄에있는 경우에만 호출하십시오. 테스트되지 않았습니다.

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

고마워, Gilles, 첫 번째 솔루션은 꽤 잘 작동하지만 한 가지 문제가 있으며 해결할 수 있기를 바랍니다. 빈 입력에서 up-line-or-search-prefix를 호출하면 마지막 실행 명령-원하는 동작을 제공합니다. 그러나 up-line-or-search-prefix를 다시 실행하면 입력의 첫 번째 문자에 대해 up-line-or-search를 수행합니다. 비어있는 입력으로 위쪽 화살표를 누르면 내 기록을 스크롤하도록 어떻게 든 변경 할 수 있습니까?
rps

@rps 아아, 인수가 없어서 (필요한 것처럼 비어있는 것이 아니라) 첫 단어를 집어 들었다. 편집 한 버전을 사용하십시오.
Gilles 'SO- 악한 중지'

33

zsh는 다음을 사용하여이 기능을 제공합니다.

history-beginning-search-backward
history-beginning-search-forward

전의.

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


ctrl+로 정확한 키 코드 찾기vKEY

전의.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown


1
다른 터미널에서 작동 할 수있는 키 코드에 대한 대안은 zprezto [ 1 ] 에서 찾을 수 있습니다 . <kbd> 위로 </ kbd>는 $terminfo[kcuu1]<kbd> 아래로 </ kbd>입니다 $terminfo[kcud1].
Justin C

8

2013 년블로그 게시물 은 커서 앞의 모든 단어와 일치하는 몇 가지 키 바인드를 권장합니다.

# Cycle through history based on characters already typed on the line
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(이 답변의 이전 버전 $terminfo에서는 블로그 게시물에 대한 의견 중 하나에서 권장 된대로 사용 했습니다. 일부 terminfo 값은 여기나열되어 있습니다 .)


1
zsh을도에서 (우분투 패키지 적어도)이 우호적 별칭 제공 /etc/zsh/zshrc등을 $key[Up].
zzxyz

사용 $terminfo하는 경우 터미널 모드를 변경해야합니다. 여기를 참조 하십시오 .
Tom Hale

$key[]대신에 사용할 답변을 수정했습니다 $terminfo[]. 독자에게 이것이 잘 작동하기를 바랍니다!
joeytwiddle

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