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>(নম্বর আগে কোনো munis চিহ্ন ডিফল্টরূপে উপেক্ষা <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>

Negativeণাত্মক এবং সংখ্যা 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>অন্য কোনও কিছুতে কারণ ডিফল্ট আচরণটি তেমন কার্যকর নয়।
বরখাস্ত

আমি দেখতে পেলাম যে এটি নিম্নমানের হয়ে গেছে কারণ প্রশ্নটি খুব নির্দিষ্ট কোনও কিছুর জন্য ছিল এবং মূল প্রশ্নের ধরণটি পরিবর্তিত হয়েছিল ... প্রথম সংখ্যাটিতে ঝাঁপিয়ে পড়ার প্রয়োজন to একদিকে, আমি আসলে ব্যবহার করি <c-a>এবং <c-x>অনেক কিছু। যে কোনও সময় আমি কোনও সংস্করণ আপডেট করি বা একটি পরিসীমা পরিবর্তনশীল বাড়িয়ে তুলি, আমি কেবল [N]<c-a>মুছুন এবং প্রতিস্থাপনের পরিবর্তে।
jecxjo

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. এটি অনুসন্ধান রেজিস্টারটিকে ক্লোবার করে: "/এবং যদি আপনার এইচএসআরচ চালু থাকে তবে আপনি যখন এটি ব্যবহার করবেন তখন বর্তমান বাফারের সমস্ত নম্বর হাইলাইট হবে। হাইলাইটিং বন্ধ করার জন্য আপনি :noh<CR>উপরের প্রতিটি mapকমান্ডের সাথে যুক্ত করতে পারেন , তবে কীভাবে নিবন্ধটি ক্লোবারড হতে নিখুঁতভাবে বন্ধ করবেন তা আমি জানি না।
  3. এটি কার্সারের পরে প্রথম সংখ্যা নয়, লাইনে প্রথম সংখ্যাটিতে কাজ করে।

এছাড়াও, এটি যদি আমি থাকতাম তবে আমি উপরেরটিতে <leader>aএবং <leader>xপরিবর্তে মানচিত্র করতাম CTRL-A/X। এইভাবে, আপনার উভয় আচরণ আপনার কাছে উপলব্ধ। <leader>ডিফল্টরূপে ব্যাকস্ল্যাশ কী ( \)।


এটি নেতিবাচক সংখ্যাকে উপেক্ষা করার বিষয়টি ঠিক, আসলে ডিফল্ট আচরণটি আমার কাছে অদ্ভুত বলে মনে হয়েছিল। আমি মনে করি এটি :nohপাশাপাশি আরও ভাল দেখায় । তবে আসল সমস্যাটি হ'ল এটি কার্সার অবস্থানটিকে বেস হিসাবে ব্যবহার করতে পারে না এবং এভাবে আপনি লাইনটিতে কেবল প্রথম সংখ্যাটি বাড়িয়ে নিতে পারেন।
বরখাস্ত

এটি 9 নম্বরে থামবে এবং 10 এর উপরে এটি 11 দ্বারা বাড়বে, 10 নয় ... আমার মনে হয় এটি অনিচ্ছাকৃত (অর্থাত্‍ একটি বাগ)? তদতিরিক্ত, আপনি সর্বদা নন-রিকার্সিভ ম্যাপিং ( noremap) ব্যবহার করতে চান এবং কখনই না map । এর আরও বিশদ ব্যাখ্যার জন্য এই পৃষ্ঠাটি দেখুন ।
মার্টিন টর্নোইজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.