Ctrl-A ve Ctrl-X gibi, ancak yalnızca ilk basamağı değiştirin


10

Tam sayıyı değil, imleçten sonraki / sonraki ilk basamağı artırmanın / azaltmanın bir yolu var mı?

Vim'in nasıl çalıştığını bilmiyorum, ama bunu yapan bir eklenti var mı? Bulamadım.

Css'i düzenlerken ve diğer durumlarda da çok kullanışlıdır.

Verilen:

▐margin: 10px

Ben bastığımda CTRL-Agörmek istiyorum:

▐margin: 20px

Gerçek:

▐margin: 11px

10
Ayrıca 10<C-a>10 ekleyebilir veya r21'i 2 ile değiştirebilirsiniz.
jamessan

Yanıtlar:


6

Bu oldukça iyi çalışıyor gibi görünüyor ve <C-a>bir 9 (95 105 olur) veya <C-x>0 (105 95 olur) kullanırken bir şeyleri aklı başında tutar :

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
  • İlk olarak, herhangi bir rakamı ararız, search()sıfırlamama avantajına sahiptir @/.
  • a <Esc>h - Ekleme moduna gidin, rakamdan sonra bir boşluk ekleyin ve imleç rakamın üstünde olacak şekilde sola gidin.
  • Şimdi <C-a>veya kullanabiliriz <C-x>.
  • lxhEklediğimiz alanı kaldırmak için kullanıyoruz .

Ben bu eşlediyseniz g<C-a>ve g<C-x>hala orijinal arayabilecekleri.

Yalnızca geçerli satırdaki sayıları arayacak (ancak geçerli satırda sayı yoksa sarkan bir alan bırakacak) biraz farklı bir sürüm:

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

Ve işte önceki ile aynı kavramı kullanan ancak rakamdan önce boşluk ekleyen başka bir sürüm . Bu, g<C-a>sayıdan önceki herhangi bir munis işaretini yoksayacaktır (varsayılan olarak, <C-a>açık olarak -42'artıracaktır') -41.

Ayrıca bir sayıyı kabul eder, böylece 5g<C-a>sayıyı 5 arttırır:

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

Temel artış

Eylemi gerçekleştirmek için basit bir makro:

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

Normal modda

  • m` Konumunuzu işaretleyin
  • l bir karakter sağa git
  • v$x çizginin sonuna kadar kes
  • h orijinal pozisyonuna geri dön
  • <c-a> artış (veya azalma)
  • p kesini geri yapıştır
  • `` işaretine geri dön

Sonraki sayıya atla

Bir sonraki sayıya atlamak (veya bir sayıdaysa geçerli konumunuzda kalmak) istiyorsanız, mevcut imleçli karakteri kontrol eden ve bir sonraki sayıya atlayabilen bir işleve ihtiyacınız vardır.

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``

NextNumkarakteri imlecin altına alır, bir sayı olup olmadığını kontrol eder ve değilse sonraki sayıyı arar. Bundan sonra gerisi aynı. Eşlemenin farklı nnoremap <leader>aolmasını istiyorsanız, örneğin istediğinizi değiştirin nnoremap <c-a>.

9'dan büyük negatifleri ve sayıları yok saymak

Sadece rakamlar arasında dolaşmak ve bunların işaretli tamsayılar olarak davranmasını istemiyorsanız, aşağıdaki işlevler artar ve azalır ve 0 ve 9'da devredilir.

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>

Şimdi olduğunuzda 8ve <leader>ayazarken olsun 9. Tekrar yapmak sonuçlanır 0. Eğer basarsanız <leader>xüzerinde 0almak 9. Negatif sayılar için de aynı şey geçerlidir. Fonksiyonlar tek bir karakteri keser, arttırır, azaltır veya yuvarlar ve sonra yerine yapıştırır.


Burada bir şey yok, ama bu fikri aklımda tutacağım, belki geliştirilebilir. Varsa, mevcut satırdaki ilk basamağa atlamalı ve üzerinde çalışmalıdır. Tercihen ayrıca haritalanabilir olmalıdır <c-a>/<c-x>.
firedev

Güncellenmiş sürüm. Şimdi bir sonraki sayıya atlar ya da şu anda bir rakamın üzerindeyseniz onu artırmanıza izin verir.
jecxjo

Evet! Bu inanılmaz, teşekkürler! Sorunun neden reddedildiğini anlamıyorum, ilk günden beri bu beni rahatsız ediyor ve görünüşe göre birçok insan yeniden tanımlıyor <c-a>ve <c-x>başka bir şeye.
firedev

Sorunun çok spesifik bir şey için olduğunu ve orijinal soru türünün yol boyunca değiştiğini görebiliyordum ... ilk sayıya atlama ihtiyacı. Bu bir yana, aslında <c-a>ve <c-x>çok kullanıyorum. Bir sürümü güncellediğimde veya bir aralık değişkenini artırdığımda, sadece [N]<c-a>silmek ve değiştirmek yerine.
jecxjo

1
Bu mümkün olabilir, ancak çok daha büyük bir işlevler kümesi olabilir. Mevcut uygulama , aynı şeyi yapan ancak kısa çizgiyi göz ardı eden bir işlev için avantajlı <c-a>ve <c-x>bırakılması gerekir.
jecxjo

5

İşte yedek bir ifade kullanarak yazdığım bir sürüm:

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>

Her biri satırdaki ilk basamak karakterini arar ve sırasıyla [0-8] veya [1-9] aralığındaysa bir karakter ekler veya çıkarır. Üç sorunu var:

  1. Çoğunlukla metin manipülasyonudur ve sadece ilk karaktere bakar, bu nedenle bir sayının negatif olup olmadığını bilmez. Bu düzeltilebilir, ancak mevcut davranışı olduğu gibi seviyorum.
  2. Arama kaydını clobbers: "/ve üzerinde hlsearch varsa, bunu kullandığınızda geçerli arabellekteki tüm sayılar vurgulanır. Vurgulamayı durdurmak :noh<CR>için yukarıdaki mapkomutların her birine ekleyebilirsiniz , ancak kaydın tıkanmasını nasıl güzel bir şekilde durduracağımı bilmiyorum.
  3. İmleçten sonraki ilk sayı değil, satırdaki ilk sayı üzerinde çalışır.

Ben olsaydım Ayrıca, ben yukarıdaki harita ediyorum <leader>ave <leader>xyerine daha, CTRL-A/X. Bu şekilde, her iki davranışı da kullanabilirsiniz. <leader>varsayılan olarak ters eğik çizgi tuşudur ( \).


Negatif sayıyı göz ardı etmesi iyi, aslında varsayılan davranış bana garip geldi. Bence de çok daha iyi görünüyor :noh. Ancak asıl sorun imleç konumunu bir taban olarak kullanamaması ve böylece satırdaki sadece ilk basamağı arttırabilmenizdir.
firedev

Bu 9 numarada durur ve 10'un üzerinde 10 değil 11 ile artar ... Bence bu kasıtsız (yani bir hata)? Ayrıca, her zaman yinelemesiz eşleme ( noremap) kullanmak ve asla kullanmak istemezsiniz map. Bunun daha ayrıntılı bir açıklaması için bu sayfaya bakınız .
Martin Tournoij
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.