क्या मैं विम को "1 रजिस्टर में" छोटे विलोपन भी बचा सकता हूं?


14

मैंने हाल ही में अपने सेटअप से YankRing प्लगइन को आंशिक रूप से हटा दिया क्योंकि यह मैक्रोज़ के साथ कुछ समस्याएँ पैदा कर रहा था, लेकिन ज्यादातर इसलिए कि मैंने यह तय किया कि विम के रजिस्टरों का उपयोग करने के लिए खुद को प्रशिक्षित करना बेहतर होगा - विशेष रूप से, जिस तरह से हटाए गए पाठ को रजिस्टर में शुरू में संग्रहीत किया जाता है "1और उसके बाद के माध्यम से ऊपर स्थानांतरित कर दिया "2, "3आदि के रूप में आगे विलोपन बना रहे हैं बहुत उपयोगी है।

हालाँकि, जब कोई विलोपन / परिवर्तन पाठ की एक पंक्ति से कम निकालता है, तो इसे बजाय "-छोटे डिलीट रजिस्टर (कुछ आंदोलन कमांड के लिए कुछ अपवादों के साथ) में संग्रहीत किया जाता है । यदि बाद में छोटे विलोपन किए जाते हैं, तो पाठ का वह हिस्सा खो जाता है।

क्या रजिस्टर में सभी विलोपन को संग्रहीत करने के लिए विम प्राप्त करना संभव है "1?

nnoremap d "1d लगभग काम करता है, लेकिन आप दोनों रजिस्टरों में पाठ के साथ समाप्त होते हैं "1 और "2

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

जवाबों:


10

यह पुराने Vim 7.3 संस्करणों में काम करता था जब आप :set clipboard=unnamed( इस Reddit चर्चा को देखते हैं , बग के परिणामस्वरूप, जो मैंने यहां रिपोर्ट किया है

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


1
दिलचस्प! (विशेष रूप से दहलीज के बारे में आपका विचार।) जानकारी के लिए धन्यवाद। किसी को इस अंतरिम में ऐसा करने के लिए कुछ पागल VimScript के साथ आने के लिए प्रोत्साहित करने के प्रयास में upvote / समय के लिए स्वीकार करते हैं।
रिच

5

मुझे एक प्रूफ-ऑफ-कॉन्सेप्ट सॉल्यूशन मिला है, जो dमोशन के साथ और विजुअल मोड में कमांड के लिए काम करता है। यह अभी तक पूरी तरह से मजबूत समाधान नहीं है (उदाहरण के लिए, d[count]dकाम नहीं करता है , और न ही करता है [count]D), लेकिन यह बहुत सारे मेरे वास्तविक उपयोग के मामलों को कवर करता है।

यह एक ग्राहक ऑपरेटर फ़ंक्शन सेट करके काम करता है जो:

  1. एक शब्दकोश में रजिस्टर 1-8 की सामग्री को संग्रहीत करता है,
  2. रजिस्टर 1 में विलोपन करता है,
  3. रजिस्टर 1-8 के पहले से बचाई गई सामग्री के लिए 2-9 सेट करता है।

:help map-operatorऑपरेटर काम कैसे करता है, इसकी व्याख्या के लिए देखें ।

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

पुराने उत्तर पर टिप्पणी करने के लिए क्षमा करें। मैं इस समाधान को अपनाया yऔर cलेकिन के लिए cमेरी nvim कार्रवाई के बाद मोड डालने में प्रवेश नहीं करता ... वर्तमान में मैं करने के लिए है execute lऔर startinsertजो एक उचित ठीक (तरह नहीं है c$गलत स्थिति में कर्सर रखें होगा)। कोई विचार?
सनी पुन

2

नवोदित संपादक में पुल अनुरोध देखें :

[RFC] छोटे विलोपन # 8169 के लिए गिने हुए रजिस्टरों का उपयोग करने के लिए एक विकल्प जोड़ें

मैंने smalldelविकल्प जोड़ने की कोशिश की है, जो आपको हटाए गए पात्रों की न्यूनतम संख्या को गिने हुए रजिस्टरों में धकेलने की अनुमति देता है "1 .." 9

इस पीआर के विलय के बाद अगली नवविराम रिहाई (यदि ऐसा होता है) में यह विकल्प होगा।

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