ZSH: ऊपर और नीचे कुंजियों पर खोज इतिहास?


22

वर्तमान में, मेरे पास .zshrc में निम्नलिखित हैं:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

हालाँकि, यह केवल मेरे वर्तमान इनपुट की सामग्री को स्पेस कैरेक्टर के होने से पहले मेल खाता हुआ लगता है। उदाहरण के लिए, sudo ls /मेरे इतिहास में शुरू होने वाली प्रत्येक पंक्ति से मेल खाएगा sudo, जबकि मैं चाहूंगा कि यह केवल मेरे संपूर्ण इनपुट से मेल खाने वाली रेखाओं से मेल खाए। (यानी sudo ls /etcमैच होगा, लेकिन नहीं sudo cat /var/log/messages)

वांछित व्यवहार प्राप्त करने के लिए मुझे क्या बदलने की आवश्यकता है?

यहाँ मेरा पूरा .zshrc मामला प्रासंगिक है: https://gist.github.com/919566

जवाबों:


9

यह प्रलेखित व्यवहार है :

down-line-or-search
बफर में एक पंक्ति नीचे ले जाएँ, या यदि पहले से ही नीचे की रेखा पर है, तो बफर में पहले शब्द से शुरू होने वाली रेखा के लिए इतिहास में आगे खोजें।

ऐसा प्रतीत नहीं होता है कि एक मौजूदा विजेट है जो वास्तव में आप क्या चाहते हैं, इसलिए आपको अपना खुद का बनाना होगा। यहां एक विजेट को परिभाषित करने का तरीका बताया गया है जो व्यवहार करता है up-line-or-search, लेकिन खोज स्ट्रिंग के रूप में पहले शब्द के बजाय लाइन की शुरुआत (कर्सर तक) का उपयोग करना। वास्तव में परीक्षण नहीं किया गया है, खासकर मल्टी-लाइन इनपुट पर नहीं।

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

एक वैकल्पिक दृष्टिकोण का उपयोग करना है history-beginning-search-backward, लेकिन केवल इसे कॉल करें यदि कर्सर पहली पंक्ति पर है। Untested।

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

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

@ आरपीएस अहा, गोचा, यह पहला शब्द उठा रहा था क्योंकि तर्क गायब था (खाली होने के बजाय जैसा होना चाहिए था)। मेरे संपादित संस्करण का उपयोग करें।
गिल्स एसओ- बुराई को रोकें '

33

zsh इस कार्यक्षमता का उपयोग करके प्रदान करते हैं

history-beginning-search-backward
history-beginning-search-forward

पूर्व।

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward


ctrl+ द्वारा सटीक कुंजी कोड प्राप्त करेंvKEY

पूर्व।
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
आदि।


1
अलग-अलग टर्मिनलों पर काम करने वाले कीकोड्स का एक विकल्प zprezto [ 1 ] में पाया जा सकता है । <kbd> अप </ kbd> है $terminfo[kcuu1], <kbd> डाउन </ kbd> है $terminfo[kcud1]
जस्टिन सी

8

2013 के इस ब्लॉग पोस्ट में कीबाइंड के एक जोड़े की सिफारिश की गई है जो कर्सर से पहले सभी शब्दों से मेल खाता है।

# Cycle through history based on characters already typed on the line
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 "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(इस उत्तर के पुराने संस्करण में, मैंने $terminfoब्लॉग पोस्ट पर टिप्पणियों में से एक में अनुशंसित के रूप में उपयोग किया था । कुछ टर्मफ्लो मान यहां दिए गए हैं ।)


1
zsh इन मित्रवत उपनामों (कम से कम उबंटू पैकेज में) को भी देता है /etc/zsh/zshrc, जैसे कि $key[Up]
zzxyz

यदि $terminfoआप टर्मिनल मोड को बदलने की आवश्यकता होगी का उपयोग कर। देखें यहाँ
टॉम हेल

मैंने $key[]इसके बजाय उपयोग करने का उत्तर संपादित किया है $terminfo[]। मुझे आशा है कि यह पाठकों के लिए ठीक काम करता है!
joeytwiddle

1

Zsh-history-substring-search प्रोजेक्ट पर भी एक नज़र डालें ।

यह प्रदान करता है कि आप क्या देख रहे हैं, और इसे ओह-माय-ज़श प्लगइन के रूप में भी इस्तेमाल किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.