स्थानीय और वैश्विक 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और जांचें कि क्या "शेयरहिस्टर" सूचीबद्ध है। अगर setopt sharehistoryआपके साथ नहीं जोड़ा जाता है .zshrc। फिर एक सेट-स्थानीय-इतिहास का उपयोग कर सकते हैं जैसा कि हमने ऊपर किया था। डोक्यूमिनेशन कहता है:

डिफ़ॉल्ट रूप से, इतिहास आंदोलन कमांड आयातित लाइनों के साथ-साथ स्थानीय लाइनों पर भी जाते हैं, लेकिन आप इसे सेट-लोकल-हिस्ट्री ज़ील बाइंडिंग के साथ चालू और बंद कर सकते हैं। यह एक zle विजेट बनाने के लिए भी संभव है जो कुछ आदेशों को आयातित आदेशों की अनदेखी करेगा, और कुछ में उन्हें शामिल किया जाएगा।

ध्यान दें कि डिफ़ॉल्ट रूप से वैश्विक इतिहास का उपयोग किया जाता है (और सभी कार्य "zle सेट-लोकल-हिस्ट्री 0" के साथ समाप्त होते हैं, अर्थात स्थानीय इतिहास अक्षम है)। इसलिए CTRL+ दबाकर Rवैश्विक इतिहास को डिफ़ॉल्ट रूप से खोजा जाएगा (जो कि ज्यादातर मामलों में समझ में आता है)।

यह @mpy द्वारा समाधान के समान है, लेकिन कॉपी और पेस्ट के लिए तैयार है। यह कर्सर कुंजी को ऊपर और नीचे लिख देता है। मैंने इस मेल सूची प्रविष्टि का उपयोग किया ।

यह भी देखें:


1
Zsh 5.0.2 पर मुझे एक त्रुटि मिलती है कि यह एक खाली कुंजी अनुक्रम से नहीं जुड़ सकता है। यहां तक ​​कि अगर मैं इसे नीचे दिए गए उत्तर से कुंजी के साथ बदल देता हूं, तो ऊपर / नीचे और Ctrl + ऊपर / नीचे दोनों ही वैश्विक इतिहास से गुजरते हैं। मैं यहाँ कुछ भी गलत कर रहा हूँ?
rjh

1
@rjh: इसे आज़माएं: vim जैसे एडिटर में, डिलीट करें ${key[Up]}। फिर (एडिट मोड में), Ctrl + V टाइप करें और उसके बाद अप ऐरो। इसमें सही कुंजी कोड डालना चाहिए। डाउन एरो के लिए भी ऐसा ही करें।
रॉबिन

मैंने इस तरीके का इस्तेमाल किया और यह काम करता है लेकिन मैंने एक कमांड के शुरुआती हिस्से को लिखकर इतिहास को खोजने की क्षमता खो दी और फिर तीर चला दिया। यह बाश की तरह सभी कमांडों के माध्यम से जाता है, इसलिए मुझे उपयोग करके काम करना होगा 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

@ लुंबिक के उत्तर ने मेरे लिए केवल कुछ बदलावों के साथ काम किया:

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- एरो का उपयोग करता है।

नोट: मैं osh-my-zsh के साथ मिलकर zsh 5.0.2 का उपयोग करता हूं।


यह ओपी के अनुरोध के विपरीत है - Ctrl+arrowsस्थानीय इतिहास के लिए।
मेलेबियस

1

मैं यहां अन्य उत्तरों में सूचीबद्ध विकल्पों की कोशिश कर रहा हूं, लेकिन मैं उनसे खुश नहीं था। विजेट 1 up-history या आरंभिक खोजup-line-or-history शामिल नहीं है और विजेट 1 का उपयोग करते समय स्थानीय इतिहास वरीयता में फेरबदल करते समय अच्छी तरह से काम नहीं करता है। 2 up-line-or-beginning-search

इसलिए मैं निम्नलिखित सेटिंग्स पर आया। यह Ctrlवैश्विक इतिहास को ब्राउज़ करने के लिए + तीरों को सक्षम बनाता है , Altस्मार्ट आरंभ खोज ( ओह माय ज़श में डिफ़ॉल्ट) का उपयोग करने के लिए स्थानीय इतिहास (बाश के समान) और स्टैंडअलोन तीरों को ब्राउज़ करने के लिए तीर ।

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 आपका कोड ऐसा बिल्कुल नहीं करता है। इसके अलावा, यह ओह माय ज़श में पहले से ही सेट लगता है ।
मेलेबियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.