로컬 및 글로벌 ZSH 히스토리에 대한 별도의 상향 화살표 룩백


25

하는 것이 가능하니...

  • 로컬 ZSH 쉘 히스토리 강화 (작업은 해당 프롬프트에서만 발생 함)

  • 글로벌 ZSH 기록 강화 (공유 기록이 켜져 있음)-공유 기록이 켜져있을 때 위쪽 화살표를 누르면 기본적으로 발생하는 상황

... 별도.

예를 들어, 글로벌 히스토리에 대해서는 CTRL + 위를, 로컬 히스토리에는 정상입니다. 동시에 과거 이력 검색 (예 : CTRL+ R)에 글로벌 이력을 사용하는 것이 좋습니다 .

일부 작업은 해당 셸 창에만 적용되고 다시 돌아 가려고하므로 일부 셸 작업의 속도가 빨라질 수 있습니다.

답변:


25

복사하여 붙여 넣기 .zshrc:

커서가 로컬 히스토리를 사용 중입니다.

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

CTRL전역 히스토리를 단계별로 실행하기 위해 키 바인딩 ( + 커서) 이 필요한 경우 다음을 추가하십시오 .zshrc.

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

이 작업을 수행하려면 SHARE_HISTORY 옵션 (16.2.4 기록 참조 )을 활성화해야합니다. setopt"sharehistory"가 나열되어 있는지 확인하고 실행하십시오 . 그렇지 않으면이 부가 setopt sharehistory당신에게 .zshrc. 그런 다음 위에서했던 것처럼 set-local-history를 사용할 수 있습니다. 이 문서는 다음과 같이 말합니다.

기본적으로 히스토리 이동 명령은 로컬 라인뿐만 아니라 가져온 라인을 방문하지만 set-local-history zle 바인딩으로이를 켜거나 끌 수 있습니다. 일부 명령은 가져온 명령을 무시하고 일부는 포함하는 zle 위젯을 작성할 수도 있습니다.

기본적으로 전역 히스토리가 사용되며 모든 기능은 "zle set-local-history 0"으로 끝납니다. 즉, 로컬 히스토리가 비활성화됩니다. 따라서 CTRL+ R를 누르면 기본적으로 전역 기록을 검색합니다 (대부분의 경우 의미가 있음).

이것은 @mpy의 솔루션과 매우 유사하지만 복사하여 붙여 넣을 수 있습니다. 커서 키를 위아래로 덮어 씁니다. 이 메일 목록 항목을 사용 했습니다 .

참조 :


1
zsh 5.0.2에서 빈 키 시퀀스에 바인딩 할 수 없다는 오류가 발생합니다. 아래의 다른 답변의 키로 바꾸어도 위 / 아래 및 Ctrl + 위 / 아래는 전역 기록을 거칩니다. 내가 여기서 뭘 잘못하고 있니?
rjh

1
@rjh : 이것을보십시오 : vim과 같은 편집기에서을 삭제하십시오 ${key[Up]}. 그런 다음 (편집 모드에서) Ctrl + V를 입력 한 다음 위쪽 화살표를 입력하십시오. 올바른 키 코드를 삽입해야합니다. 아래쪽 화살표에 대해서도 동일하게 수행하십시오.
robinst

나는이 방법을 사용했지만 작동하지만 명령의 초기 부분을 작성한 다음 화살표를 위로하여 기록을 검색하는 기능을 잃어 버렸습니다. Bash와 같은 모든 명령을 거치므로을 사용하여 해결해야합니다 Ctrl+R.
Melebius

5

로컬 기록 항목 만 표시하도록 특수 zle 위젯을 설정할 수 있습니다.

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

그는 가정하면 바인딩되어 up-line-or-history, 당신이 같은 다른 키 스트로크 (keystroke)이 위젯에 바인딩 할 수 있습니다 (I 그 기본 생각) CTRL+를 :

 bindkey "^[Oa" only-local-history

이것이 작동한다면 아마도 터미널에 달려 있습니다. 위의 라인은에서 작동합니다 URxvt/Screen. 로에게 xterm당신이 필요합니다

 bindkey "^[[1;5A" only-local-history

대한 CTRL+ .

다른 변형은

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

따라서 지역 기록을 사용하도록 설정 한 경우 전역 기록을 들여다 볼 수 있으며 그 반대도 가능합니다.


4

@lumbic의 답변은 몇 가지 변경 사항 만 있으면 나를 위해 일했습니다.

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

이 코드는 글로벌 히스토리를 기본값으로 만들고 로컬 히스토리에 CTRL 화살표를 사용합니다.

참고 : 나는 zsh 5.0.2를 oh-my-zsh와 함께 사용합니다.


이것은 OP가 요청한 것과는 정반대로 보입니다 Ctrl+arrows. 지역 기록에 대한 것입니다.
Melebius

1

나는 다른 답변에 나열된 옵션을 시도했지만 그 결과에 만족하지 않았습니다. 위젯 1 up-history 또는 검색 시작을up-line-or-history 포함하지 않으며 위젯 1 은 사용 중에 로컬 히스토리 환경 설정을 변경할 때 제대로 작동하지 않는 것 같습니다. 2 up-line-or-beginning-search

그래서 나는 다음 설정에 왔습니다. 그것은 수 있도록 Ctrl세계 역사를 찾아 + 화살표, Alt+ 화살표 (기본적 스마트 처음 검색을 사용하는 로컬 (배쉬 유사) 역사 만 독립 화살표를 찾아 오 내 zsh을을 ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 그들의 down대응도 암시 적으로 의미가있다.

2 로컬 히스토리 환경 설정을 변경 한 후 검색에 사용 된 시작 부분이 재정의되므로 처음 찾은 전체 명령이 두 번째 검색에서 검색 될 시작 부분으로 사용됩니다.


1

여기에 다양한 답변을 바탕으로 응축 버전을 만들 수있었습니다.

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

이 버전은 기존 및 위젯을 새로운 사용자 정의 위젯으로 겹쳐 씁니다 . 이 위젯은 로컬 히스토리를 사용 가능하게 한 후 -prefixed 이름으로 사용 가능한 원래 위젯 을 호출합니다 . 자세한 내용 은 zle 위젯 설명서 를 참조하십시오.up-line-or-historydown-line-or-history.

즉, 기존 키 바인딩을 유지해야합니다. 따라서 현재 터미널에서 위쪽 화살표를 입력하기위한 이스케이프 시퀀스가 ​​무엇인지 파악하지 않아도됩니다.


-1
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 "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

위의 대답은 나를 위해 일했습니다.

참조 : https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys


이것이 어떻게 지역과 세계의 역사를 구별하는지 설명해 주시겠습니까? IMHO 코드는 전혀 그렇게하지 않습니다. 또한 이것은 Oh My Zsh 에서 이미 설정된 것으로 보입니다 .
Melebius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.