पेस्ट विकल्प सेट करें, लेकिन केवल एक प्रविष्टि के लिए


16

मैं विम 'paste'विकल्प सेट करने का एक त्वरित तरीका चाहता हूं , कुछ पाठ सम्मिलित करता हूं , और पिछले मूल्य पर वापस लौटता हूं 'paste'

एक विशिष्ट उपयोग का मामला OS क्लिपबोर्ड सामग्री को शाब्दिक रूप से सम्मिलित करता है, बिना किसी इन्सर्ट मोड के पुनर्लेखन के, जो स्वचालित इंडेंटेशन जैसे सक्रिय हो सकता है, और विम की स्थिति को बदले बिना। एक अन्य उपयोग मामला एक ओएस मैक्रो फीचर को विम में कीस्ट्रोक्स को इंजेक्ट करने की अनुमति देने के लिए होगा और उन्हें शाब्दिक पाठ के रूप में व्याख्या किया जाएगा।

यह स्पष्ट रूप से अन्य विकल्पों के लिए सामान्यीकरण करता है - सामान्य विचार कुछ विकल्पों को सेट करना है लेकिन केवल सम्मिलित मोड के माध्यम से एक यात्रा की अवधि के लिए।

मूल रूप से मैं एक प्रमुख अनुक्रम (कहना _i) को एक मैक्रो से बांधना चाहता हूं जो ऐसा करता है

:set paste
i…<Esc>
:set nopaste

जहां i…<Esc>मेरा मतलब है कि मोड डालने के लिए स्विच ( iकमांड के साथ ) और कमांड मोड पर लौटने पर मैक्रो को फिर से शुरू करें, सिवाय इसके कि मैं 'paste'अभी भी सक्रिय के साथ समाप्त करना चाहता हूं अगर यह पहले से सक्रिय था। मैं यह कैसे कर सकता हूँ?

नोट: OS क्लिपबोर्ड की सामग्री को "*रजिस्टर में मैप किया जाता है । जब वह काम करता है, तो 'paste'विकल्प बहुत उपयोगी नहीं होता है। इस प्रश्न के लिए प्रेरक परिदृश्य उन समयों के लिए है जब "*रजिस्टर समर्थन के लिए शर्तों को पूरा नहीं किया जाता है - विम +xterm_clipboardसुविधा के साथ संकलित नहीं किया जाता है , या यह स्क्रीन या एसएसएच जैसे टर्मिनल में चल रहा है जो इसे परिवेश एक्स सर्वर से अलग करता है।


1
मुझे आपका सवाल पसंद है (मैं खुद कई बार वहां गया हूं)। हालाँकि, क्या यह आसान नहीं है +या *रजिस्टर से चिपकाना ?
यो '

@yo ' केवल जब वे काम करते हैं । जो, विम के मेरे उपयोग के लिए, अक्सर ऐसा नहीं होता है।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


15

इसे आजमाइए:

function! Paste_Func()
    let s:inPaste = &paste
    if !s:inPaste
        set paste
    endif

    echom s:inPaste
    augroup paste_callback
        autocmd!
        autocmd InsertLeave <buffer> call Paste_End()
    augroup END

    startinsert
endfunction

function! Paste_End()
    augroup paste_callback
        autocmd!
    augroup END
    augroup! paste_callback

    if !s:inPaste
        set nopaste
    endif
endfunction

map _i :call Paste_Func()<cr>

अगर यह पहले से सेट नहीं है तो यह पेस्ट वेरिएबल में आपकी वर्तमान पेस्ट स्थिति को संग्रहीत करता है और पेस्ट सेट करता है। जब आप सम्मिलित मोड छोड़ते हैं, तो यह आपके लिए एक स्वतः पूर्णता सेट करता है और फिर आपको सम्मिलित मोड में डालता है।

जब आप इन्सर्ट मोड को छोड़ते हैं तो यह ऑटोकैम चलाता है, जो सबसे पहले ऑटोकैड को हटाता है (इसलिए जब आप इंसर्ट मोड को किसी अन्य तरीके से छोड़ते हैं तो यह रन नहीं होता है), और अंत में यदि आप मूल रूप से पेस्ट मोड में नहीं थे तो nopaste सेट करते हैं।

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

संपादित करें: स्क्रिप्ट तय की


यह सही रास्ते पर लगता है (विशेष रूप से, मुझे नहीं पता था कि "ब्रैकेट" को सामान्य विश्व आदेशों द्वारा सम्मिलन का एक खिंचाव कैसे किया जाता है)। धन्यवाद। हालाँकि, यह बिलकुल सही नहीं है और मैं नहीं देखता कि समस्या कहाँ है: बाद में _i, pasteविकल्प बंद है, भले ही यह पहले था।
गिल्स एसओ- बुराई को रोकना '

तुम सही हो! मुझे पूरा यकीन है कि मैंने इसका परीक्षण किया था, लेकिन मैंने कुछ बदल दिया है। मैंने पोस्ट में स्क्रिप्ट को अपडेट किया है, देखें कि क्या यह अब आपके लिए काम कर रहा है।
22

4

सिवाय इसके कि मैं 'paste'अभी भी सक्रिय होना चाहता हूं अगर यह पहले से सक्रिय था।

'paste'यथासंभव कम समय के लिए सक्रिय होना चाहिए। यह बहुत सारी कार्यक्षमता को अक्षम करता है (नक्शे सहित), क्योंकि इसका एकमात्र उद्देश्य गलत पाठ को चिपकाने से बचना है। जैसे, मुझे लगता है कि उद्धृत आवश्यकता वास्तव में आवश्यक नहीं होनी चाहिए।

कहा जा रहा है, यह वास्तव में सेट करने की आवश्यकता के बिना पेस्ट करना काफी आसान है 'paste'। यदि आप gvim चला रहे हैं या +xterm_clipboardकंसोल vim में हैं, तो आप बस "+pOS क्लिपबोर्ड से पेस्ट करने के लिए उपयोग कर सकते हैं ।

पेस्ट करते समय स्वचालित इंडेंटेशन की समस्या वास्तव में दो परिदृश्यों में होती है। <C-r>+माउस के साथ पेस्ट मोड ( ) या मध्य-क्लिक पेस्ट करते समय एक रजिस्टर की सामग्री सम्मिलित करना ।

डालने मोड में रजिस्टर की सामग्री डालने के बजाय, सामान्य मोड में रजिस्टर से चिपकाने से रिफॉर्मेटिंग समस्या से बचना होगा।

यदि आप माउस के साथ पेस्ट-क्लिक करना चाहते हैं, तो 'mouse'टर्मिनल के बजाय विम को जाने देने के लिए विकल्प का उपयोग करें , मध्य-क्लिक को हैंडल करें। विम तब टाइप किए जा रहे टेक्स्ट की व्याख्या करने के बजाय सामग्री को शाब्दिक रूप से सम्मिलित करेगा।


2
इसमें से कोई भी मेरे सवाल का जवाब नहीं देता है। मैं एक कारण के लिए स्पष्ट आवश्यकताओं में डाल दिया! आमतौर 'paste'पर वास्तव में पहले से सक्रिय नहीं है, लेकिन मैं इस बारे में सोचना नहीं चाहता। मैं अक्सर विम में काम करता हूं जिसमें एक्स क्लिपबोर्ड या माउस तक पहुंच नहीं होती है, क्योंकि या तो मेरे विम निर्माण में xterm_clipboardसुविधा नहीं है , या इसलिए कि मैं काम कर रहा हूं जैसे कि एक स्क्रीन सत्र जो वर्तमान में संलग्न होने के लिए होता है एक्स टर्मिनल।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स तब आप बता सकते हैं कि आप किस तरह से पेस्ट कर रहे हैं? यह प्रासंगिक जानकारी है कि आप जो करना चाहते हैं, उस कार्रवाई को लपेटकर उत्तर देने में सक्षम हो सकते हैं।
जामसेन

1
मेरा मूल उपयोग मामला मध्य माउस बटन के साथ या Shift + Insert के साथ चिपकाना है। हालांकि यह वास्तव में प्रासंगिक नहीं है: सवाल का मूल यह है कि विकल्प कैसे सेट किया जाए, इंसर्ट मोड पर स्विच करें (साथ i, मैं यह नहीं पूछ रहा हूं कि यह कैसे पैरामीरिज किया जाए), और इंसर्ट मोड से वापस आने पर विकल्प के मूल्य को पुनर्स्थापित करें।
गिल्स एसओ- बुराई को रोकना '

1
@Gilles आपके प्रश्न का मूल जैसा कि इस टिप्पणी में बताया गया है, आपके मूल प्रश्न की तुलना में मेरे लिए बहुत स्पष्ट है। धन्यवाद।
जामसेन

1
@ गिल्स यह आपके लिए प्रासंगिक नहीं है , लेकिन यह भविष्य के आगंतुकों के लिए प्रासंगिक हो सकता है। इसलिए या तो आप इसे स्वयं प्रश्न में डाल सकते हैं ("मुझे पता है कि मैं क्लिपबोर्ड से उपयोग "*pया "+pपेस्ट कर सकता हूं , लेकिन मैं सिस्टम की पेस्ट क्षमताओं का उपयोग नहीं करना चाहता") और फिर यह उत्तर अनावश्यक है। या आप नहीं करते हैं, और फिर मुझे लगता है कि इस उत्तर का स्थान यहां है।
यो

4

व्यक्तिगत रूप से, मैं yoटिम पोप के उत्कृष्ट vim-unimpaired प्लगइन से कीबाइंडिंग का उपयोग बिल्कुल इसी कारण से करता हूं । उनके प्रलेखन से:

टॉगल 'पेस्ट' के लिए प्रदान नहीं किया गया है क्योंकि एकान्त सम्मिलन के लपेटने का विशिष्ट उपयोग मामला इतना बेकार है: आप दो बार टॉगल करते हैं, लेकिन आप केवल एक बार (YOPO) पेस्ट करते हैं। इसके बजाय, प्रेस yoया yOआह्वान करने के लिए |o|या |O|के साथ 'पेस्ट' पहले से ही निर्धारित किया है। इंसर्ट मोड छोड़ने से 'nopaste' अपने आप सेट हो जाता है।

यह आपके सवाल के लिए बस प्लगइन स्थापित करने के लिए overkill हो सकता है, लेकिन मुझे लगता है कि यह अन्य उपयोगी कीबाइंडिंग का एक धन भी प्रदान करता है ( README में अधिक जानकारी )।


1

लिनक्स या मैक पर विम 8+ के साथ, अब आप टर्मिनल के देशी पेस्ट का उपयोग कर सकते हैं (उदाहरण के लिए ctrl+shift+V, cmd+Vमैक पर , Gnome में मध्य माउस बटन ), यदि टर्मिनल ब्रैकेटेड पेस्ट का समर्थन करता है। iइन्सर्ट मोड के लिए प्रेस न करें।

यह आपके ओएस क्लिपबोर्ड की सामग्री को चिपकाएगा, ऑटोइंडेंटिंग को जोड़ने के बिना रिक्त स्थान और टैब को संरक्षित करेगा। यह पुराने के बराबर है :set paste, i, ctrl+shift+V, esc, :set nopasteविधि।

अब आपको +clipboardया +xterm_clipboardवीम फीचर्स की जरूरत नहीं है। इस सुविधा को "ब्रैकेटेड पेस्ट" कहा जाता है। अधिक जानकारी के लिए, /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56786463 देखें

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