Ctrl-A और Ctrl-X की तरह लेकिन केवल पहले अंक को संशोधित करें


10

क्या कर्सर के बाद / पहले अंक को बढ़ाने / घटाने का एक तरीका है, न कि पूरी संख्या।

मुझे पता है कि यह कैसे काम नहीं करता है, लेकिन क्या ऐसा कोई प्लगइन है जो ऐसा करता है? मैं इसे खोजने में असमर्थ था।

सीएसएस और अन्य मामलों में भी संपादन करते समय यह बहुत उपयोगी है।

दिया हुआ:

▐margin: 10px

जब मैं दबाता CTRL-Aहूं तो मैं देखना चाहता हूं:

▐margin: 20px

वास्तविक:

▐margin: 11px

10
आप 10<C-a>10 को जोड़ने के लिए या r21 को 2 के साथ बदलने के लिए भी कर सकते हैं
जामेसन

जवाबों:


6

यह काफी अच्छी तरह से काम करने लगता है, और <C-a>9 (95 पर 105) हो जाता है, या <C-x>0 (105 हो जाता है 95) का उपयोग करते समय काफी समझदार बातें करता है :

nnoremap g<C-a> :call search('\d', 'c')<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c')<CR>a <Esc>h<C-x>lxh
  • सबसे पहले, हम किसी भी अंक की खोज करते हैं, search()रीसेट न करने का लाभ है @/
  • a <Esc>h - इन्सर्ट मोड में जाएं, डिजिट के बाद स्पेस डालें और बाईं ओर जाएं ताकि कर्सर डिजिट के ऊपर हो।
  • हम अब उपयोग कर सकते हैं <C-a>या <C-x>
  • हम अपने द्वारा lxhजोड़े गए स्थान को हटाने के लिए उपयोग करते हैं ।

मैंने इसे मैप किया है g<C-a>और g<C-x>इसलिए, आप अभी भी मूल कॉल कर सकते हैं।

थोड़ा अलग संस्करण जो केवल वर्तमान लाइन पर संख्याओं की खोज करेगा (लेकिन यदि वर्तमान रेखा पर कोई संख्या नहीं है तो झूलने वाला स्थान छोड़ देगा):

nnoremap g<C-a> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-x>lxh

और यहां एक और संस्करण है जो पहले की तरह ही अवधारणा का उपयोग करता है, लेकिन अंक से पहले एक स्थान भी जोड़ता है । यह g<C-a>संख्या से पहले किसी भी मौन संकेत को अनदेखा कर देगा (डिफ़ॉल्ट रूप से, उस <C-a>पर -42'वेतन वृद्धि' करेगा -41

यह एक गिनती भी स्वीकार करता है, जिससे 5g<C-a>संख्या 5 से बढ़ जाएगी:

fun! Increment(dir, count)
    " No number on the current line
    if !search('\d', 'c', getline('.'))
        return
    endif

    " Store cursor position
    let l:save_pos = getpos('.')

    " Add spaces around the number
    s/\%#\d/ \0 /
    call setpos('.', l:save_pos)
    normal! l

    " Increment or decrement the number
    if a:dir == 'prev'
        execute "normal! " . repeat("\<C-x>"), a:count
    else
        execute "normal! " . repeat("\<C-a>", a:count)
    endif

    " Remove the spaces
    s/\v (\d{-})%#(\d) /\1\2/

    " Restore cursor position
    call setpos('.', l:save_pos)
endfun

nnoremap <silent> g<C-a> :<C-u>call Increment('next', v:count1)<CR>
nnoremap <silent> g<C-x> :<C-u>call Increment('prev', v:count1)<CR>

9

मूल वेतन वृद्धि

यहां कार्रवाई करने के लिए एक सरल मैक्रो है:

:nnoremap <leader>a m`lv$xh<c-a>p``
:nnoremap <leader>x m`lv$xh<c-x>p``

सामान्य मोड में आप

  • m` अपना स्थान चिह्नित करें
  • l एक पात्र को दाईं ओर ले जाएं
  • v$x लाइन के अंत में कटौती
  • h मूल स्थिति पर वापस जाएं
  • <c-a> वेतन वृद्धि (या गिरावट)
  • p अपने कट को वापस चिपकाएँ
  • `` अपने निशान पर वापस जाएं

अगली संख्या पर जाएं

यदि आप अगले नंबर पर कूदना चाहते हैं (या किसी नंबर पर अपनी वर्तमान स्थिति में रहना चाहते हैं) तो आपको एक फ़ंक्शन की आवश्यकता है जो वर्तमान शापित चरित्र की जांच करता है और अगले नंबर पर संभव कूदता है।

function! NextNum()
  let ch = getline(".")[col(".")-1]
  if ch !~ "[0-9]"
    execute "normal! /[0-9]\<cr>"
  endif
endfunction

nnoremap <leader>a :call NextNum()<cr>m`lv$xh<c-a>p``
nnoremap <leader>x :call NextNum()<cr>m`lv$xh<c-x>p``

NextNumकर्सर के नीचे वर्ण प्राप्त करता है, यह जांचता है कि क्या उसका नंबर है और यदि अगले नंबर की खोज नहीं करता है। उसके बाद बाकी वही है। यदि आप चाहते हैं कि मैपिंग अलग-अलग हो तो आप अपनी इच्छानुसार बदल nnoremap <leader>aसकते हैं, उदाहरण के लिए nnoremap <c-a>

नकारात्मक और संख्याओं को अनदेखा करना 9 से अधिक है

यदि आप अंकों के माध्यम से केवल चक्र करना चाहते हैं और उन्हें हस्ताक्षरित पूर्णांकों के रूप में कार्य नहीं करना चाहते हैं, तो निम्नलिखित कार्य बढ़ेंगे और घटेंगे और 0 और 9 पर रोल होंगे।

function! NextNum()
  let ch = getline(".")[col(".")-1]
  if ch !~ "[0-9]"
    execute "normal! /[0-9]\<cr>"
  endif
endfunction

function! IncDec(val, dec)
  if a:dec
    if a:val == 0
      return 9
    else
      return a:val - 1
    endif
  else
    if a:val == 9
      return 0
    else
      return a:val + 1
    endif
  endif
endfunction

function! DoMath(dec)
  call NextNum()
  normal! x
  let @" = IncDec(@", a:dec)
  normal! P
endfunction

nnoremap <leader>a :call DoMath(0)<cr>
nnoremap <leader>x :call DoMath(1)<cr>

अब जब आप चालू हों 8और <leader>aआप टाइप करें 9। ऐसा करने से फिर परिणाम मिलता है 0। यदि आप <leader>xपर 0मिलता है आप दबाते हैं 9। वही नकारात्मक संख्या के लिए जाता है। फ़ंक्शंस में एक एकल वर्ण, वेतन वृद्धि, गिरावट या रोल कट जाता है और फिर जगह में पेस्ट किया जाता है।


यहां कुछ ठीक नहीं है, लेकिन मैं उस विचार को ध्यान में रखूंगा, शायद इसमें सुधार किया जा सके। यह वर्तमान रेखा पर पहले अंक के लिए कूदना चाहिए यदि कोई हो और उस पर संचालित हो। अधिमानतः नीच <c-a>/<c-x>भी हो सकता है ।
निकाल दिया गया

अद्यतन संस्करण। अब अगली संख्या के लिए आगे कूदता है या यदि आप वर्तमान में एक अंक से अधिक हैं, तो आप इसे बढ़ा सकते हैं।
jecxjo

हाँ! यह आश्चर्यजनक है, धन्यवाद! मुझे समझ में नहीं आता है कि प्रश्न को क्यों अस्वीकृत किया गया था, यह मुझे पहले दिन से ही परेशान कर रहा था और जाहिर तौर पर बहुत से लोगों को फिर से परिभाषित करने <c-a>और <c-x>कुछ और करने के लिए क्योंकि डिफ़ॉल्ट व्यवहार उतना उपयोगी नहीं है।
firedev

मैं देख सकता था कि यह अस्वीकृत हो गया क्योंकि प्रश्न कुछ बहुत विशिष्ट के लिए था और मूल प्रश्न क्रमबद्ध तरीके से बदल गया था ... पहले नंबर पर कूदने की आवश्यकता थी। एक तरफ, मैं वास्तव में उपयोग करता हूं <c-a>और <c-x>बहुत कुछ। किसी भी समय मैं एक संस्करण को अद्यतन करता हूं या एक रेंज चर बढ़ाता हूं, मैं केवल [N]<c-a>हटाने और बदलने के बजाय।
जेकज़ो

1
यह संभव होगा लेकिन कार्यों का एक बड़ा सेट होगा। वर्तमान कार्यान्वयन इसका लाभ उठाता है <c-a>और <c-x>जिसे ऐसे कार्य के लिए छोड़ना पड़ता है जो वही करता है लेकिन डैश की उपेक्षा करता है।
jecxjo

5

यहां मैंने एक विकल्प अभिव्यक्ति का उपयोग करते हुए लिखा है:

map <c-a> :s/\d/\=submatch(0) < 9 ? submatch(0) + 1 : submatch(0)/<CR>
map <c-x> :s/\d/\=submatch(0) > 0 ? submatch(0) - 1 : submatch(0)/<CR>

हर एक बस लाइन पर पहले अंक चरित्र के लिए लग रहा है, और जोड़ता है या एक घटाना अगर यह क्रमशः [0-8] या [1-9] सीमा में है। इसके तीन मुद्दे हैं:

  1. यह ज्यादातर पाठ हेरफेर है, और केवल पहले चरित्र को देखता है, इसलिए यह नहीं जानता कि कोई संख्या नकारात्मक है या नहीं। यह ठीक करने योग्य है, लेकिन मुझे वर्तमान व्यवहार जैसा है, पसंद है।
  2. यह खोज रजिस्टर "/को देखता है : और यदि आपके पास hlsearch है, तो जब आप इसका उपयोग करते हैं तो वर्तमान बफ़र के सभी नंबर हाइलाइट हो जाएंगे। आप हाइलाइटिंग को रोकने :noh<CR>के लिए उपरोक्त प्रत्येक mapकमांड के लिए अपील कर सकते हैं, लेकिन मुझे नहीं पता कि रजिस्टर को अच्छी तरह से बंद करने से कैसे रोका जाए।
  3. यह लाइन पर पहले नंबर पर काम करता है, कर्सर के बाद पहला नंबर नहीं।

इसके अलावा, अगर यह मेरे होते, तो मैं ऊपर <leader>aऔर <leader>x, बल्कि करने के लिए मैप करता CTRL-A/X। इस तरह, आपके पास दोनों व्यवहार उपलब्ध हैं। <leader>डिफ़ॉल्ट रूप से, बैकस्लैश कुंजी ( \) है।


यह तथ्य कि यह नकारात्मक संख्या की उपेक्षा करता है, ठीक है, वास्तव में डिफ़ॉल्ट व्यवहार मुझे अजीब लगा। मुझे लगता है कि यह साथ :nohही बहुत बेहतर लग रहा है । लेकिन असली समस्या यह है कि यह कर्सर की स्थिति को आधार के रूप में उपयोग नहीं कर सकता है और इस प्रकार आप लाइन में केवल पहला अंक बढ़ा सकते हैं।
फरिदेव

यह संख्या 9 पर रुकता है, और 10 से ऊपर यह 11 से बढ़ जाता है, 10 नहीं ... मुझे लगता है कि यह अनजाने में है (यानी एक बग)? इसके अलावा, आप हमेशा गैर-पुनरावर्ती मैपिंग ( noremap) का उपयोग करना चाहते हैं और कभी नहीं map । अधिक विस्तृत विवरण के लिए इस पृष्ठ को देखें ।
मार्टिन टूरनोइज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.