ローカルおよびグローバルZSH履歴の個別の上矢印ルックバック


25

可能ですか?

  • ローカルZSHシェル履歴を強化します(アクションはそのプロンプトでのみ発生しました)

  • グローバルZSH履歴のステップアップ(共有履歴がオン)-共有履歴がオンのときに上矢印を押すと、デフォルトで何が起こるか

... 別々に。

たとえば、グローバル履歴の場合はCTRL + up、ローカル履歴の場合は通常のupをバインドします。同時に、逆方向履歴検索(つまり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を押してから上矢印を入力します。これにより、正しいキーコードが挿入されます。下矢印についても同じことを行います。
ロビンスト

私はこの方法を使用しましたが、機能しますが、コマンドの最初の部分を書いてから上矢印キーを押すことで履歴を検索する機能を失いました。Bashなどのすべてのコマンドを実行するため、を使用して回避する必要がありCtrl+Rます。
メレビウス

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(デフォルトだと思う)にバインドされていると仮定すると、このウィジェットを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ローカルな歴史のために。
メレビウス

1

ここで他の回答にリストされているオプションを試しましたが、それらに満足していませんでした。ウィジェット1 up-historyまたはup-line-or-history含まない検索を開始し、ウィジェット1は、 up-line-or-beginning-searchそれを使用しながら、地域の歴史・プリファレンスを変更する際にうまく動作しないようです。2

だから私は次の設定に来ました。それは可能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検索に使用される先頭は、ローカル履歴設定を変更した後に再定義されるため、最初に見つかったコマンド全体が、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

このバージョンは、既存のウィジェットとウィジェットを新しいユーザー定義ウィジェットで上書きします。このウィジェットは、ローカル履歴を有効にし、元のウィジェットを呼び出します。これは、接頭辞付きの名前で使用できます。詳細については、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


これがどのようにローカルとグローバルの歴史を区別するのか説明できますか?私見では、コードはまったくそれを行いません。さらに、これはすでにOh My Zshで設定されているようです。
メレビウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.