Ctrl-A 및 Ctrl-X와 같지만 첫 번째 숫자 만 수정하십시오.


10

정수가 아닌 커서 뒤 / 아래에서 첫 번째 숫자를 늘리거나 줄이는 방법이 있습니까?

나는 그것이 vim이 작동하는 방식이 아니라는 것을 알고 있지만 그것을하는 플러그인이 있습니까? 찾을 수 없었습니다.

CSS를 편집 할 때와 다른 경우에도 매우 유용합니다.

주어진:

▐margin: 10px

내가 누를 때보 CTRL-A고 싶습니다 :

▐margin: 20px

실제 :

▐margin: 11px

10
당신은 또한 할 수있는 10<C-a>열을 추가하거나 r22와 1을 대체
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>on -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>x0당신이 얻을 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. 커서 다음의 첫 번째 숫자가 아니라 줄의 첫 번째 숫자에서 작동합니다.

그랬 경우에도, 나는 위의지도 것 <leader>a하고 <leader>x대신에보다 CTRL-A/X. 이렇게하면 두 가지 동작을 모두 사용할 수 있습니다. <leader>기본적으로 백 슬래시 키 ( \)입니다.


음수를 무시한다는 사실은 괜찮습니다. 사실 기본 행동은 나에게 이상해 보였습니다. 나는 그것이 훨씬 더 좋아 보인다고 생각합니다 :noh. 그러나 실제 문제는 커서 위치를 기본으로 사용할 수 없으므로 줄의 첫 번째 숫자 만 증가시킬 수 있다는 것입니다.
firedev

이것은 숫자 9에서 멈추고 10 이상은 10이 아니라 11 씩 증가합니다 ... 이것은 의도하지 않은 것 같습니다 (예 : 버그)? 또한 항상 비 재귀 매핑 ( noremap) 을 사용하고 싶지 않습니다 map . 이에 대한 자세한 설명은 이 페이지 를 참조하십시오 .
Martin Tournoij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.