답변:
이것은 꽤 잘 작동하는 것으로 보이며 <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>
다음은 작업을 수행하는 간단한 매크로입니다.
: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>
.
숫자를 순환하고 부호있는 정수로 작동하지 않으려면 다음 함수가 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>
는 또한 맵핑 가능 하다.
<c-a>
하고 <c-x>
기본 행동이 그다지 유용하지 않기 때문에 다른 것에 대해 짜증이났습니다 .
<c-a>
하고 <c-x>
많이. 버전을 업데이트하거나 범위 변수를 늘릴 때마다 [N]<c-a>
삭제 및 교체 대신에.
<c-a>
하고 <c-x>
동일한 작업을 수행하지만 대시를 무시하는 기능에 대해 삭제할 수있는 필요가있다.
대체 식을 사용하여 작성한 버전은 다음과 같습니다.
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] 범위에 있으면 문자를 더하거나 뺍니다. 세 가지 문제가 있습니다.
"/
클로버합니다. hlsearch가 켜져 있으면 이것을 사용할 때 현재 버퍼의 모든 숫자가 강조 표시됩니다. :noh<CR>
위의 각 map
명령에 추가 하여 강조 표시를 중지 할 수는 있지만 레지스터가 제대로 표시되지 않도록 중지하는 방법을 모르겠습니다.그랬 경우에도, 나는 위의지도 것 <leader>a
하고 <leader>x
대신에보다 CTRL-A/X
. 이렇게하면 두 가지 동작을 모두 사용할 수 있습니다. <leader>
기본적으로 백 슬래시 키 ( \
)입니다.
:noh
. 그러나 실제 문제는 커서 위치를 기본으로 사용할 수 없으므로 줄의 첫 번째 숫자 만 증가시킬 수 있다는 것입니다.
noremap
) 을 사용하고 싶지 않습니다 map
. 이에 대한 자세한 설명은 이 페이지 를 참조하십시오 .
10<C-a>
열을 추가하거나r2
2와 1을 대체