ओवरराइटिंग रजिस्टर के बिना पेस्ट कैसे करें


112

क्या किसी को एक डिफ़ॉल्ट रूप से चयनित क्षेत्र में डिफ़ॉल्ट रजिस्टर में रखे बिना चयन करने का तरीका पता है?

मुझे पता है कि मैं एक स्पष्ट रजिस्टर से हमेशा चिपकाकर समस्या को हल कर सकता हूं। लेकिन यह "xpसिर्फ के बजाय टाइप करने के लिए गर्दन में दर्द हैp

जवाबों:


33

"{register}pआप वर्णन के रूप में काम नहीं करेगा। यह रजिस्टर की सामग्री के साथ चयन की जगह लेगा। आपको इसके बजाय कुछ करना होगा:

" I haven't found how to hide this function (yet)
function! RestoreRegister()
  let @" = s:restore_reg
  return ''
endfunction

function! s:Repl()
    let s:restore_reg = @"
    return "p@=RestoreRegister()\<cr>"
endfunction

" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()

जो तब तक ठीक होना चाहिए जब तक आप एक ऐसे प्लगइन का उपयोग नहीं करते हैं जिसमें पी के लिए एक गैर-नॉर वैम्प है, और जो एक रजिस्टर को ओवरराइट करने की अपेक्षा करता है।

यह कोड वहां एक स्क्रिप्ट के रूप में उपलब्ध है । इंगो कारकट ने भी इसी मुद्दे को हल करने वाले एक प्लगइन को परिभाषित किया ।


असल में, मैं हालांकि इस्तेमाल किए गए रजिस्टर को लाने का एक अच्छा तरीका था, लेकिन याद नहीं कर सकता कि कैसे। इसलिए समारोह की जटिलता।
ल्यूक हरमिट

1
मुझे लगता है कि यह ओवरकिल है, regtype(linewise?) याद नहीं होगा और यह कि रीमैपिंग पी pgvyपर्याप्त है।
बेनोइट

2
यह ओवरकिल हो सकता है, लेकिन इसका कोई दुष्प्रभाव नहीं है। इसके विपरीत "xp, यह विपरीत @"सामग्री को अधिलेखित नहीं करता है@xpgvy
लूस हर्मिटे

1
फिर किस बारे में :xnoremap p pgv@=v:register.'y'<cr>?
बेनोइट

1
यह मेरे लिए काम नहीं करता है। मैंने स्क्रिप्ट डाउनलोड करने का भी प्रयास किया है। यहाँ मैं क्या करूँ आज्ञाओं की सूची है: पहले मैं v दबाता हूँ, फिर शब्द के अंत में चयन करने के लिए e, फिर y को yank करता हूँ। उसके बाद, मैं एक अलग शब्द पर जाता हूं जिसे मैं बदलना चाहता हूं। मैं v दबाता हूँ, e फिर p को उस एक को बदलने के लिए। फिर मैं इसे फिर से करता हूं, लेकिन इस बार अगला शब्द मेरे द्वारा प्रतिस्थापित पहले से बदल दिया गया है।
एडी

41

मैं के साथ नष्ट कर दिया सभी पाठ को कॉपी करने की डिफ़ॉल्ट vim व्यवहार पसंद नहीं d, D, c, या Cमें डिफ़ॉल्ट रजिस्टर।

मैंने इसके चारों ओर मैपिंग dकरके "_d, cइसे "_c, और इसी तरह प्राप्त किया है।

मेरे .vimrc से:

"These are to cancel the default behavior of d, D, c, C
"  to put the text they delete in the default register.
"  Note that this means e.g. "ad won't copy the text into
"  register a anymore.  You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C

ये मैपिंग जितनी उपयोगी हैं (मैं खुद भी कुछ ऐसा ही करता हूं), वे ओपी के सवाल का जवाब नहीं देते हैं, पी फिर भी आपको अधिलेखित कर देगा कि आपने चयनित सामग्री पर क्या चिपकाया है।
मैग्नस 23

32

निम्न का उपयोग करें:

xnoremap p pgvy

यह दृश्य मोड में चिपकाए गए किसी भी पाठ को पुनः आकार देगा और पुन: जमा करेगा।

संपादित करें: इस क्रम में "xpआप कर सकते हैं के साथ काम करने के लिए:

xnoremap p pgv"@=v:register.'y'<cr>

v:register एक सामान्य मोड कमांड में प्रयुक्त अंतिम रजिस्टर नाम तक फैलता है।


एक पर "xp, यह दृष्टिकोण ओवरराइट @"करता है @x
ल्यूक हरमिट

3
आपका सुझाव xnoremap p pgv"@=v:register.'y'<cr>मेरे काम नहीं आया। लेकिन यह करता है:xnoremap <expr> p 'pgv"'.v:register.'y'
Mrak

यह दिलचस्प लग रहा है। क्या आप इसके बारे में एक पंक्ति जोड़ सकते हैं g? मैंने इसे पहले नहीं देखा है।
लंदनरॉब

4
@LondonRob: gअकेले कुछ नहीं करता है। यह विस्तारित, बहु-कुंजी आदेश प्रदान करता है, जैसे z। उदाहरण के लिए, goबफर में nth बाइट में जाता है, gjऔर gkअगली और पिछली प्रदर्शित लाइन पर जाता है ( jkलाइनों से अलग होने पर अलग होता है ), gaकर्सर के नीचे चरित्र पर जानकारी प्रदर्शित करता है, gJबिना स्पेस के लाइनों में जुड़ता है, और यहां gvअंतिम दृश्य चयन को पुनर्स्थापित करता है। आप उपयोग कर सकते हैं :help gv
बेनोइट

6
@मार्क :xnoremap <expr> p 'pgv"'.v:register.'y`>' , मैंने कर्सर की स्थिति को बहाल करने के लिए `` `` `को जोड़ा
rox

19

अपने में .vimrc

xnoremap p "_dP

मुझे यह एक समान धागे पर प्रतिक्रिया से मिला, लेकिन मूल स्रोत http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text था । इसमें कुछ कमियों का उल्लेख है, हालांकि यह मेरे लिए ठीक है।


2
यह सबसे सरल समाधान की तरह लगता है।
रुडोल्फ

1
मेरे लिए काम किया। और यह उत्तर स्पष्ट है। .vimrc.localठीक भी है।
बैजिफ़ेइलोंग

3
यदि आपका चयन लाइन के अंत तक फैला हुआ है तो काम नहीं करता है।
जॉन फ्रीमैन

6

Luc Hermitte का समाधान एक आकर्षण की तरह काम करता है। मैं लगभग एक हफ्ते से इसका इस्तेमाल कर रहा था। तब मैंने स्टीव लोश के .vimrc से एक समाधान खोजा जो अच्छी तरह से काम करता है यदि YankRing आपके प्लगइन / बंडल लाइनअप का हिस्सा है:

function! YRRunAfterMaps()                                                                                                      
    " From Steve Losh, Preserve the yank post selection/put.    
    vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> 
endfunction  

6

अपने में यह प्रयास करें ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremapइसका मतलब है कि यह केवल Visualमोड के लिए है, मोड के लिए नहीं Visual + Select

  • <expr>कि साधन {rhs}की xnoremap {lhs} {rhs}सेटिंग अभिव्यक्ति के रूप में मूल्यांकन किया जाता है।

  • इस मामले में, हमारी अभिव्यक्ति के 'pgv"'.v:register.'y'लिए अभिव्यक्ति का उपयोग .किया जाता है।

  • v:register मानचित्रण की पूर्ति के दौरान उपयोग किए जा रहे रजिस्टर का मूल्यांकन किया जाता है।

के परिणाम का "xpमूल्यांकन होगा pgv"xy, जहां xरजिस्टर है।

मैं इस stackoverflow प्रश्न का उत्तर से मदद मिली: विम - एक वैकल्पिक रजिस्टर उपसर्ग के साथ मानचित्रण के साथ संयोजन के रूप में बेनोइट के जवाब इस पृष्ठ पर


4

इस तथ्य का समर्थन करने के लिए कि मैंने क्लिपबोर्ड = अनाम सेट का समर्थन किया है, के बाद ल्यूक के कार्य ने मेरे लिए अच्छा काम किया:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

1
संदर्भ के लिए: इसका उपयोग clipboard=unnamedplusकरने के @+बजाय होना चाहिए @*
सेबेस्टियन ब्लास्क

2

ल्यूक हरमिट ने किया यह कारनामा! वास्तव में अच्छा। यहां उसका समाधान टॉगल फ़ंक्शन में रखा गया है, जिससे आप सामान्य व्यवहार और नो-रिप्ले-रजिस्टर के बीच स्विच कर सकते हैं।

कमांड, यू व्यवहार को टॉगल करता है

let s:putSwap = 1 
function TogglePutSwap()
    if s:putSwap
        vnoremap <silent> <expr> p <sid>Repl()
        let s:putSwap = 0 
        echo 'noreplace put'
    else
        vnoremap <silent> <expr> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>

आप s: putSwap वैल्यू के आधार पर "p @ = RestoreRegister () \ <cr>" के बजाय "p" को वापस करने के लिए भी s: बदल सकते हैं।
ल्यूक हरमिट

1
के silent! vunmapबजाय पसंद करते हैंvnoremap <silent> <expr> p p
16:48 पर ल्यूक हरमिट 16

0

डक्ट-टेप प्रोग्रामिंग, लेकिन मेरे लिए काम करता है:

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

-4

प्रयत्न -

:set guioptions-=a
:set guioptions-=A

3
वे नियंत्रण जो चयनित पाठ को विंडोिंग सिस्टम के क्लिपबोर्ड (जैसे, X11 या Win32) में जोड़े जाते हैं, विम के आंतरिक कॉपी रजिस्टर में नहीं।
रोब कैनेडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.