로컬 및 글로벌 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.