कार्यशील निर्देशिका के अनुसार इतिहास रखना (सीएफ प्रति शेल सत्र)


11

क्या एक आधुनिक शेल के इतिहास की विशेषता को एक मार्ग पर लाने का तरीका है?

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

जवाबों:


5

के साथ zsh, आप कर सकते हैं:

mkdir -p ~/.zsh/dirhist

और अपने ~ / .zshrc में जोड़ें:

HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
  [[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}

chpwd()जब भी वर्तमान निर्देशिका में परिवर्तन होता है, उसे कहा जाता है। वहां, हम इतिहास फ़ाइल को कुछ इस तरह से रीसेट करते हैं, ~/.zsh/dirhist/@foo@barजब आप cdकरते हैं /foo/bar


मुझे यह दृष्टिकोण पसंद है, क्योंकि इसमें मेरे शेल उपयोग की आदतों को बदलने की आवश्यकता नहीं है, और परीक्षण के कुछ दिनों में यह अच्छी तरह से किराया लगता है।
सोहोकोक

10

यदि आप bashअपने शेल के रूप में उपयोग कर रहे हैं तो एक साफ-सुथरा जवाब नहीं बल्कि एक विकल्प : आप अपने में कुछ अन्य लोगों को शामिल कर सकते हैं .bashrc

उदाहरण के लिए:

alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'

फिर, यदि आप टाइप करते हैं a:

  1. आपको अपनी परियोजना निर्देशिका में स्थानांतरित कर दिया जाएगा
  2. वर्तमान इतिहास सहेजा जाएगा ( history -w)
  3. तब मेमोरी में रखा गया इतिहास रीसेट हो जाएगा ( history -c)
  4. प्रोजेक्ट इतिहास फ़ाइल को /home/user/.a_historyपढ़ने और ( history -r) पर सेट किया जाएगा

मुझे पता है कि मेरे सवाल ने एक इच्छा / आवश्यकता को छोड़ दिया था, लापता विवरण के लिए खेद है। अर्थात्: मैं उपनाम / कार्यों का उपयोग करने के लिए याद नहीं रखना चाहता हूँ; यानी स्कूपिंग को एक ऐड के रूप में काम करना चाहिए जिस तरह से मैं आमतौर पर शेल के साथ बातचीत करता हूं।
सोहॉकेक

निर्यात न करें HISTFILE। इसे अन्य कार्यक्रमों में निर्यात करने का कोई कारण नहीं है, और ~ / .bashrc को हर इंटरेक्टिव बैश प्रक्रिया के लिए निष्पादित किया जाता है, इसलिए इसे सेट करने के लिए आपका कोड वैसे भी हर बैश में चलने वाला है। सामान्य तौर पर, यदि शेल-डिफाइन्ड वेरिएबल डिफॉल्ट रूप से एक्सपोर्ट नहीं किया जाता है, तो आपको शायद ही इसे एक्सपोर्ट करना चाहिए।
क्रिस पेज

1

यदि आप ZSH का उपयोग कर रहे हैं, तो इस छोटे से प्लगइन पर एक नज़र डालें जो मैंने हाल ही में इसे संभालने के लिए लिखा था:

https://github.com/ericfreese/zsh-cwd-history

यह HISTFILEआपके द्वारा कमांड निष्पादित की गई प्रत्येक निर्देशिका के लिए एक अलग स्टोर करता है, और जब आप निर्देशिकाओं को बदलते हैं, तो एस के chpwdबीच स्विच करने के लिए एक हुक जोड़ता है HISTFILE

यह एक zle विजेट भी प्रदान करता है जिसे आप एक कीपर से बाँध सकते हैं HISTFILEजो आपके मूल "ग्लोबल" HISTFILEऔर HISTFILEआपके वर्तमान वर्किंग डायरेक्टरी के बीच टॉगल करेगा ।

यह मूल रूप से जिम हेस्टर के प्रति-निर्देशिका-इतिहास प्लगइन पर आधारित था , लेकिन तब से उस प्लगइन के साथ कई मुद्दों को ठीक करने के लिए जमीन से फिर से लिखा गया है।


लिंक केवल उत्तरों को हतोत्साहित किया जाता है, कृपया कुछ स्पष्टीकरण जोड़ें कि यह क्या है / यह कैसे काम करता है।

0

मैंने एक ZSH प्लगइन लिखा है जो आप चाहते हैं: https://github.com/tymm/zsh-directory-history

अन्य समाधानों के विपरीत मेरा प्लगइन स्वचालित रूप से वैश्विक इतिहास में वापस आ जाता है। इसका मतलब है कि आपको निर्देशिका इतिहास और वैश्विक इतिहास के बीच स्विच करने की आवश्यकता नहीं है।

हालांकि अन्य समाधान थोड़ा अधिक हल्का है जो मुझे लगता है।

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