回答:
これは非常にうまく機能しているよう<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>
により、数字の前のムニ記号はすべて無視されます(デフォルトでは、<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
1文字右に移動する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
。負の数についても同様です。関数は、1つの文字を切り取り、増分、減分、またはロールオーバーして、所定の位置に貼り付けます。
<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]の範囲にある場合は1を加算または減算します。これには3つの問題があります。
"/
を上書きします:hlsearchをオンにしている場合、これを使用すると、現在のバッファー内のすべての数値が強調表示されます。:noh<CR>
上記の各map
コマンドに追加して強調表示を停止することができますが、レジスターが破壊されないようにうまく停止する方法がわかりません。また、それが私である場合、上記ではなく<leader>a
とにマップ<leader>x
しCTRL-A/X
ます。このようにして、両方の動作を利用できます。<leader>
デフォルトでは、円記号キー(\
)です。
:noh
も同様にはるかに良く見えると思います。しかし、実際の問題は、カーソル位置をベースとして使用できないため、行の最初の桁のみをインクリメントできることです。
noremap
)を使用し、絶対 に使用したくない場合map
。詳細については、このページ を参照してください。
10<C-a>
10を追加したり、r2
2と1を交換する