zsh कॉपी और पेस्ट emacs की तरह


10

मैंने देखा है कि zsh के पास बहुत सारी चीजें हैं जो मैं emacs में देखता हूं। मैं ctrl + space और किसी क्षेत्र का चयन करके चयन कर सकता हूं। मैं प्रतियों को ठीक उसी तरह बना सकता हूं जैसे मैं zsh के अंदर रहता हूं। एमएसीएस में मैं अपने सिस्टम क्लिपबोर्ड का उपयोग करने में सक्षम हूं (पहले कुछ अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता थी लेकिन यह अब बॉक्स से बाहर काम करता है)। Zsh में, मैं अपने क्लिपबोर्ड से Cy का उपयोग करके पेस्ट नहीं कर सकता और zsh से मेरे सिस्टम के क्लिपबोर्ड पर कॉपी करने पर समान समस्या होती है। क्या इसके चारों ओर एक रास्ता है?

जवाबों:


11

Zsh के पास एक अंतर्निहित क्लिपबोर्ड है जो अन्य अनुप्रयोगों के साथ संचार नहीं करता है। चूंकि यह बहुत स्क्रिप्ट योग्य है, इसलिए आप इसे कुछ पंक्तियों के साथ संवाद कर सकते हैं ~/.zshrc। आपको xclip या xsel की आवश्यकता होगी । Vi मोड में प्रूफ-ऑफ-कॉन्सेप्ट के लिए क्लिपबोर्ड से vi- इनेबल्ड zsh या बैश शेल तक पेस्ट करना देखें । यहाँ emacs मोड के लिए संबंधित कोड है (आप शायद अन्य kill-*विजेट के समान कुछ करना चाहते हैं )।

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

यह X11 क्लिपबोर्ड का उपयोग करता है (आमतौर पर Ctrl+ C/ Ctrl+ के साथ एक्सेस किया जाता है V); -bइसके बजाय X11 प्राथमिक चयन (चयन पर स्वचालित प्रतिलिपि, और मध्य माउस बटन के साथ पेस्ट) का उपयोग करने का विकल्प निकालें ।


आप vi मोड का उपयोग करें, तो बस की जगह kill-regionके साथ vi-deleteऔर yankसाथ vi-put-afterइसी तरह लपेट आदि vi-yankदूसरों, और। (मुझे इसे और अधिक केन्द्रित करने का कोई तरीका नहीं मिला है)
olejorgenb

4

मैं एक्स क्लिपबोर्ड के साथ ज़श के कट बफर को एकीकृत करना चाहता था। मैंने पूर्वोक्त http://stchaz.free.fr/mouse.zsh की कोशिश की, लेकिन मुझे लगा कि मुझे नापसंद है कि मेरे सभी Zsh ऑपरेशन क्लिपबोर्ड को पॉप्युलेट करते हैं। उदाहरण के लिए, कभी-कभी मैं किसी ब्राउज़र में कुछ कॉपी करता हूं, और फिर एक शेल पर जाता हूं और कमांड लाइन को संपादित करता हूं और फिर पेस्ट करता हूं। लेकिन अक्सर कमांड लाइन को संपादित करना - एक शब्द को हटाना, उदाहरण के लिए - Zsh कट बफर को संशोधित करता है। बेहतर या बदतर के लिए, X में सिर्फ एक क्लिपबोर्ड होता है, एक किल रिंग नहीं होती है, इसलिए जब एक Zsh एडिटिंग ऑपरेशन क्लिपबोर्ड को ओवरराइट कर देता है, तो जिस चीज को मैं चिपकाना चाहता था वह खो जाती है - मैं इसे नहीं कर सकता (Cy My) जैसा कि मैं कर सकता था Zsh या Emacs में करें।

तो इसके बजाय मैंने क्या किया, नए क्लिपबोर्ड के साथ zsh के माध्यम से बातचीत करने के लिए नए विशेष कीबाइंडिंग बनाएं। "^ Xw" और "^ Xy" बाहर निकलता है, दोनों Emacs और Zsh में अप्रयुक्त होते हैं, इसलिए मैं उन्हें दोनों अनुप्रयोगों में बांधकर एक सुसंगत इंटरफ़ेस प्राप्त कर सकता हूं। इस तरह से सामान्य संपादन ऑपरेशन, कटबफ़र और किल रिंग अकेले रह गए हैं। यदि मैं क्लिपबोर्ड पर कुछ कॉपी करना चाहता हूं तो मैं क्षेत्र सेट करता हूं और "^ Xw" करता हूं (या यदि मैंने पहले ही इसे मार दिया है और क्षेत्र निष्क्रिय है तो मैं कट बफर को कॉपी करने के लिए "^ Xw" बस कर सकता हूं)। क्लिपबोर्ड से पेस्ट करना "^ Xy" के साथ किया जाता है।

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

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