เช่นเดียวกับ Ctrl-A และ Ctrl-X แต่ปรับเปลี่ยนเฉพาะตัวเลขตัวแรก


10

มีวิธีเพิ่ม / ลดดิจิตแรกหลัง / ภายใต้เคอร์เซอร์ไม่ใช่จำนวนเต็มหรือไม่

ฉันรู้ว่ามันไม่ทำงานเป็นกลุ่ม แต่มีปลั๊กอินที่ทำอย่างนั้น? ฉันหามันไม่เจอ

มันมีประโยชน์มากเมื่อแก้ไข css และในกรณีอื่นด้วย

ได้รับ:

▐margin: 10px

เมื่อฉันกดCTRL-Aฉันต้องการดู:

▐margin: 20px

จริง:

▐margin: 11px

10
คุณสามารถทำได้10<C-a>เพื่อเพิ่ม 10 หรือr2เพื่อแทนที่ 1 ด้วย 2
jamessan

คำตอบ:


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>annoremap <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>ยัง
firedev

รุ่นที่ปรับปรุงแล้ว ตอนนี้ข้ามไปยังหมายเลขถัดไปหรือหากคุณมีตัวเลขเกินกว่าตัวเลขจะอนุญาตให้คุณเพิ่มได้
jecxjo

ใช่ นี่มันสุดยอดมากขอบคุณ! ฉันไม่เข้าใจว่าทำไมคำถามจึงถูกลดระดับลง แต่นี่เป็นเรื่องที่น่ารำคาญสำหรับฉันตั้งแต่วันแรกและเห็นได้ชัดว่าหลายคนกำหนดใหม่<c-a>และ<c-x>เป็นอย่างอื่นเพราะพฤติกรรมเริ่มต้นไม่มีประโยชน์
firedev

ฉันเห็นว่ามันถูกลดระดับลงเนื่องจากคำถามนั้นมีบางสิ่งที่เฉพาะเจาะจงมากและคำถามเดิมที่เปลี่ยนไปตลอดทาง ... ความต้องการที่จะข้ามไปยังหมายเลขแรก นอกเหนือจากนั้นฉันใช้จริง ๆ<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. มันปิดกั้นการลงทะเบียนการค้นหา: "/และถ้าคุณมี hlsearch อยู่ตัวเลขทั้งหมดในบัฟเฟอร์ปัจจุบันจะถูกเน้นเมื่อคุณใช้สิ่งนี้ คุณสามารถต่อท้ายคำสั่ง:noh<CR>แต่ละmapคำสั่งด้านบนเพื่อหยุดการไฮไลต์ แต่ฉันไม่รู้ว่าจะหยุดการลงทะเบียนจากการถูกบล็อกได้อย่างไร
  3. มันทำงานกับตัวเลขแรกในบรรทัดไม่ใช่หมายเลขแรกหลังเคอร์เซอร์

นอกจากนี้ถ้าเป็นผมผม map ด้านบนเพื่อ<leader>aและมากกว่าที่จะ<leader>x CTRL-A/Xวิธีนี้คุณมีทั้งพฤติกรรมที่พร้อมใช้งานสำหรับคุณ <leader>โดยค่าเริ่มต้นแล้วคีย์แบ็กสแลช ( \)


ความจริงที่ว่ามันไม่สนใจจำนวนลบก็ดีในความเป็นจริงพฤติกรรมเริ่มต้นดูเหมือนจะแปลกสำหรับฉัน ฉันคิดว่ามันดูดีขึ้นด้วย:nohเช่นกัน แต่ปัญหาที่แท้จริงคือมันไม่สามารถใช้ตำแหน่งเคอร์เซอร์เป็นฐานและทำให้คุณสามารถเพิ่มตัวเลขแรกได้เท่านั้น
firedev

สิ่งนี้หยุดที่หมายเลข 9 และสูงกว่า 10 เพิ่มที 11 ไม่ใช่ 10 ... ฉันคิดว่านี่เป็นข้อผิดพลาดโดยไม่ตั้งใจ (เช่นข้อผิดพลาด) หรือไม่ นอกจากนี้คุณมักจะต้องการที่จะใช้การทำแผนที่ที่ไม่ใช่ recursive ( noremap) และไม่เคย mapดูหน้านี้ สำหรับคำอธิบายโดยละเอียดเพิ่มเติม
Martin Tournoij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.