क्लिपबोर्ड से vi- सक्षम zsh या बैश शेल तक पेस्ट करना


15

मैं सिस्टम क्लिपबोर्ड (या पाठ चयन) को मेरे "vi-like" शेल प्रांप्ट में कीबोर्ड से उपयोग करने में सक्षम होना चाहूंगा। मैं आमतौर पर zsh और कभी-कभी बैश का उपयोग करता हूं। दोनों मामलों में, मेरे पास vi- जैसा व्यवहार ( bindkey -v/ set -o vi) है।

विम में, मैं जिस व्यवहार की तलाश कर रहा हूं वह प्रमुख अनुक्रम के साथ उपलब्ध है "+p। यह विशेष रूप से महत्वपूर्ण अनुक्रम vi- सक्षम शेल प्रॉम्प्ट में अपेक्षा के अनुरूप काम नहीं करता है, हालांकि। क्या कोई तरीका है या तो इसे या इसी तरह के व्यवहार को सक्षम करने के लिए, केवल कीबोर्ड का उपयोग करते हुए, जबकि zsh या bash शेल प्रॉम्प्ट में vi-like कीबाइंडिंग के साथ शेष है?

- संपादित करें -

उपयोग का मामला: मैं अक्सर फ़ायरफ़ॉक्स के बीच Pentadactyl addon , एक टर्मिनल एमुलेटर के साथ नेविगेट करता हूं और खुद को विम करता हूं - चारों ओर जाने के लिए कस्टम कुंजियों के साथ Xmonad विंडो प्रबंधक का उपयोग करना । सभी तीन कार्यक्रमों में vi-like कीबाइंडिंग होती है, जो बहुत ही कुशल ("फिंगर मेमोरी" के लिए) है, इसलिए यह केवल विम सिंटैक्स (या बहुत समान सिंटैक्स) का उपयोग करके उनके बीच आदर्श संवाद पाठ होगा।

जवाबों:


9

Zsh आंतरिक रजिस्टरों के अलावा कुछ भी समर्थन नहीं करता है, और बैश रजिस्टर का समर्थन नहीं करता है जहाँ तक मुझे पता है। द्वारा और बड़े गोले vi आदेशों का समर्थन करते हैं, आज्ञाओं का पालन नहीं करते।

Zsh में, कमांड मोड से X चयन तक पहुँचने के लिए यहाँ एक सबूत है। वास्तविक उपयोग के लिए आप इन तकनीकों के बारे में विस्तार से बताना चाहते हैं। मैं xselप्रोग्राम का उपयोग करता हूं , आप xclipइसके बजाय उपयोग कर सकते हैं ; रजिस्टर का उपयोग करके एक विम उदाहरण से दूसरे में प्रतिलिपि कैसे देखें । आपको वे सुविधाएं मिलेंगी जो मैंने zle मैन्युअल में उपयोग की थीं ।

vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; }
zle -N vi-append-x-selection
bindkey -a '^X' vi-append-x-selection
vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; }
zle -N vi-yank-x-selection
bindkey -a '^Y' vi-yank-x-selection

फ़ंक्शन vi-append-x-selectionकर्सर ( pया के समान P) के बाद वर्तमान एक्स चयन सम्मिलित करता है । फ़ंक्शन vi-yank-x-selectionअंतिम चयन या एक्स टेक्स्ट के लिए मारे गए पाठ को कॉपी करता है। zle -Nकार्यों को zle widgets (यानी संस्करण कमांड) घोषित करता है। bindkey -avi कमांड मोड के लिए बाइंडिंग सेट करता है।


xselअपने सुझाए गए कोड को मेरे .zshrc (मैंने '^' के बजाय '^ P' के बजाय '^ P' के मूल व्यवहार को अधिलेखित करके अपने सुझाए गए कोड को स्थापित और कॉपी करने के बाद पूरी तरह से काम किया )
Dalker

4

यहां zsh (vi मोड) के लिए एक समाधान है जो मूल विजेट को लपेटता है ताकि क्लिपबोर्ड हमेशा सिंक्रनाइज़ हो

xclipअपने पसंदीदा क्लिपबोर्ड टूल से बदलें ।

function x11-clip-wrap-widgets() {
    # NB: Assume we are the first wrapper and that we only wrap native widgets
    # See zsh-autosuggestions.zsh for a more generic and more robust wrapper
    local copy_or_paste=$1
    shift

    for widget in $@; do
        # Ugh, zsh doesn't have closures
        if [[ $copy_or_paste == "copy" ]]; then
            eval "
            function _x11-clip-wrapped-$widget() {
                zle .$widget
                xclip -in -selection clipboard <<<\$CUTBUFFER
            }
            "
        else
            eval "
            function _x11-clip-wrapped-$widget() {
                CUTBUFFER=\$(xclip -out -selection clipboard)
                zle .$widget
            }
            "
        fi

        zle -N $widget _x11-clip-wrapped-$widget
    done
}


local copy_widgets=(
    vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
)
local paste_widgets=(
    vi-put-{before,after}
)

# NB: can atm. only wrap native widgets
x11-clip-wrap-widgets copy $copy_widgets
x11-clip-wrap-widgets paste  $paste_widgets

यह एक आकर्षण की तरह काम करता है xterm-termite
रोटारटी

3

चयन और क्लिपबोर्ड एक्स विंडो के तहत अलग-अलग चीजें हैं, और आईएमएचओ "डेस्कटॉप वातावरण" इस मुद्दे को और भी अधिक अस्पष्ट बना देते हैं।

क्या शिफ्ट-इंसर्ट आपके लिए काम करता है? नंगे एक्स अनुप्रयोगों पर, यह बाध्यकारी होने पर चयन को चिपकाने के लिए बाध्य है।


चयन और क्लिपबोर्ड भिन्न होना वास्तव में यहां प्रासंगिक नहीं है, एक समाधान जो एक के साथ काम करता है वह दूसरे के अनुकूल होना आसान होगा। डेस्कटॉप वातावरण एक चीज़ नहीं बदलते हैं; उनके प्रसार ने चयन से दूर और क्लिपबोर्ड की ओर शक्ति संतुलन में बदलाव किया है।
गिल्स एसओ- बुराई को रोकना '

शिफ्ट-इंसर्ट मेरे वातावरण में काम करता है, और यह जानना निश्चित रूप से अच्छा है, जब एक अलग प्रणाली में उपयोग के लिए। हालाँकि, मैं
यंक

1

यह समाधान काम करता है यदि आपने प्लगइन को स्थापित oh-my-zshऔर सक्षम किया है vi-mode

गिल्स ' xselऔर zleआधारित समाधान मेरे लिए काम नहीं करते थे। हालांकि, बाद से मैं डिफ़ॉल्ट (द्वारा अपने सिस्टम क्लिपबोर्ड का उपयोग करना vim कॉन्फ़िगर किया है set clipboard=unnamedplusमें ~/.vimrc), मैं बस टाइप vटर्मिनल सामान्य मोड में में मौजूदा आदेश को खोलने के लिए vimऔर उसके बाद मैं से किसी के साथ एक्स-क्लिपबोर्ड पर प्रतिलिपि कर सकते हैं vimझटका आदेशों।


यह ZSH से कैसे संबंधित है? क्या आप :termNeovim और Vim के नए संस्करणों में उपलब्ध एम्बेडेड के बारे में बात कर रहे हैं ?
डोरोन बेहार

@DoronBehar यदि आपके पास vi- मोड zsh में सक्षम है, तो आप vटर्मिनल प्रॉम्प्ट पर बजाय vim के अंदर वर्तमान में टाइप किए गए कमांड को संपादित करने के लिए सामान्य मोड में टाइप कर सकते हैं ।
joelostblom

आपको इस तथ्य का उल्लेख करना चाहिए कि आप :termअपने उत्तर में नियोविम और विम की विशेषता के बारे में बात कर रहे हैं , अन्यथा यह बिल्कुल भी स्पष्ट नहीं है।
डोरोन बेहार

@ डोरोनबेहर मैं बात नहीं कर रहा हूँ :term। हालाँकि, मुझे पता चला कि मैं जिस कार्यक्षमता की बात कर रहा हूँ वह वास्तव में प्रदान की गई है oh-my-zsh। मैंने उसी हिसाब से जवाब अपडेट किया है।
joelostblom 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.