Yerel ve küresel ZSH geçmişi için ayrı yukarı ok arama


25

Mümkün mü...

  • Yerel ZSH kabuk tarihçesini artırın (eylemler yalnızca bu istemde gerçekleşti)

  • Genel ZSH geçmişini artırın (paylaşılan geçmiş açık) - paylaşılan geçmiş açıkken YUKARI ok tuşuna bastığınızda ne olur?

... ayrı ayrı.

Örneğin, biri global tarih için CTRL + 'yı bağlayabilir, yerel tarih için normal. Aynı zamanda, geriye doğru bir tarih araştırması için küresel tarihi kullanmak mantıklıdır (örn. CTRL+ R).

Bu, bazı kabuk işlemlerini hızlandırabilir, çünkü bazı işlemler bu kabuk penceresine özgüdür ve bunlara geri dönmek istiyorsunuz.

Yanıtlar:


25

Şunu kopyala ve yapıştır .zshrc:

İmleçler yerel tarihi kullanıyor:

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

CTRLGlobal tarihe adım atmak için anahtar bağlamalara ( + imleçler) de ihtiyacınız varsa, şunları da ekleyin .zshrc:

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

Bunun çalışması için SHARE_HISTORY ( 16.2.4 Geçmişe bakınız ) seçeneğinin etkinleştirilmesi gerekir. Çalıştırın setoptve "paylaşım tarihi" olup olmadığını kontrol edin. Değilse eklemek setopt sharehistoryadresinden Müşteri .zshrc. Daha sonra yukarıda yaptığımız gibi yerel set-geçmişini kullanabilirsiniz. Belgeleme diyor ki:

Varsayılan olarak, tarih hareketi komutları içe aktarılan satırları ve aynı zamanda yerel satırları ziyaret eder, ancak bunu yerel olarak ayarlanmış tarih-tarih zle bağlamasıyla açıp kapatabilirsiniz. Bazı komutların içe aktarılan komutları görmezden gelmesini sağlayacak ve bir kısmı bunları içerecek bir zle widget'ı oluşturmak da mümkündür.

Varsayılan olarak global geçmişin kullanıldığını unutmayın (ve tüm işlevler "zle set-local-history 0" ile biter, yani yerel tarih devre dışıdır). Bu yüzden CTRL+ ' Rya basmak global geçmişi varsayılan olarak arayacaktır (çoğu durumda mantıklı).

Bu, @mpy'nin çözümüne oldukça benzer, ancak kopyala ve yapıştır için hazırdır. İmleç tuşlarını yukarı ve aşağı yazar. Kullandığım bu posta listesi girişini .

Ayrıca bakınız:


1
Zsh 5.0.2'de boş bir anahtar sırasına bağlanamadığını belirten bir hata alıyorum. Aşağıdaki başka bir cevabın anahtarlarıyla değiştirmiş olsam bile, hem yukarı / aşağı hem de Ctrl + yukarı / aşağı genel tarihe geçiyor. Burada yanlış yaptığım bir şey var mı?
rjh,

1
@ rjh: Şunu deneyin: vim gibi bir düzenleyicide, silin ${key[Up]}. Sonra (düzenleme modunda), Ctrl + V ve ardından yukarı ok yazın. Bu doğru anahtar kodunu girmelidir. Aşağı ok için de aynısını yapın.
Robin

Bu yöntemi kullandım ve işe yaradı ancak bir komutun ilk kısmını ve ardından Yukarı ok yazarak geçmişi arama özelliğini kaybettim. Bash gibi tüm komutlardan geçiyor, bu yüzden kullanmaya çalışmalıyım Ctrl+R.
Melebius

5

Yalnızca yerel tarih öğelerini göstermek için özel bir pencere öğesi ayarlayabilirsiniz:

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

Buna bağlı olduğunu varsayarak up-line-or-history(varsayılan olduğunu düşünüyorum), bu widget'ı CTRL+ gibi başka bir tuş vuruşuna bağlayabilirsiniz :

 bindkey "^[Oa" only-local-history

Bu işe yararsa muhtemelen terminalinize bağlı. Satır üstü çalışıyor URxvt/Screen. İle xtermihtiyacınız olacak

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

için CTRL+ .

Başka bir değişken olabilir

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

bu nedenle, eğer yerel tarihin etkin olması durumunda, genel olana göz atabilirsiniz ya da tam tersi.


4

@ lumbic'in cevabı benim için sadece birkaç değişiklikle işe yaradı:

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

Bu kod, genel geçmişi varsayılan yapar ve yerel tarih için CTRL okunu kullanır.

Not: oh-my-zsh ile birlikte zsh 5.0.2 kullanıyorum.


Bu, OP'nin istediğinden tam tersi gibi görünüyor - Ctrl+arrowsyerel tarih için.
Melebius

1

Buradaki diğer cevaplarda listelenen seçenekleri deniyorum ama onlardan memnun değildim. Widget'lar 1 up-history veya başlangıç ​​aramasınıup-line-or-history içermez ve widget 1 kullanırken yerel tarih tercihini değiştirirken iyi çalışmaz gibi görünüyor. 2 up-line-or-beginning-search

Bu yüzden aşağıdaki ayarlara geldim. Bu sağlayan Ctrlküresel bir geçmişi göz atmak + oklar Alt+ oklar (varsayılan akıllı başlangıç aramayı kullanmak için yerel (Bash benzer) tarihini sadece ve bağımsız okları atmak için Oh My 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 Onların downmeslektaşları da örtük olarak kastedilmiştir.

2 Arama yapmak için kullanılan başlangıç, yerel tarih tercihini değiştirdikten sonra yeniden tanımlanır, bu nedenle ilk bulunan tüm komut, ikinci aramada aranacak başlangıç ​​olarak kullanılır.


1

Buradaki çeşitli cevaplara dayanarak, yoğunlaştırılmış bir sürüm yapabildim:

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

Bu sürüm mevcut ve widget'ların üzerine yeni kullanıcı tanımlı widget'ların üzerine yazacaktır . Bu widget yerel tarihçeyi etkinleştirir ve önceden belirlenmiş isimler altında bulunan orijinal widget'ları çağırır . Ayrıntılar için sıfır widget belgelerine bakın.up-line-or-historydown-line-or-history.

Bu, mevcut anahtarlıkları korumanız anlamına gelir. Bu nedenle, şu anki terminalinizde yukarı ok yazmak için kaçış sırasının ne olduğunu bulmak zorunda kalmaktan kaçınabilirsiniz.


-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

Cevabın üstünde benim için çalıştı.

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


Bunun yerel ve küresel tarihi nasıl ayırt ettiğini açıklayabilir misiniz? IMHO, kodunuz hiç yapmıyor. Üstelik bu zaten Oh My Zsh’da ayarlanmış gibi görünüyor .
Melebius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.