Ctrl-AとCtrl-Xに似ていますが、最初の桁のみを変更します


10

整数ではなく、カーソルの後/下の最初の桁を増減する方法はありますか?

vimがどのように機能するかはわかりませんが、それを行うプラグインはありますか?見つかりませんでした。

CSSを編集する場合など、他の場合にも非常に役立ちます。

与えられた:

▐margin: 10px

私が押すCTRL-Aと、私は見たいです:

▐margin: 20px

実際:

▐margin: 11px

10
あなたも行うことができます10<C-a>10を追加したり、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>により、数字の前のムニ記号はすべて無視されます(デフォルトでは、<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 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>

ネガと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。負の数についても同様です。関数は、1つの文字を切り取り、増分、減分、またはロールオーバーして、所定の位置に貼り付けます。


何かがここでは正しくありませんが、私はその考えを覚えておきます。存在する場合は、現在の行の最初の桁にジャンプして操作する必要があります。<c-a>/<c-x>また、マッピング可能であることが望ましい。
firedev 2015

更新されたバージョン。次の数字にジャンプするか、現在数字の上にいる場合は、数字を増やすことができます。
jecxjo 2015

はい!これは素晴らしいです、ありがとう!なぜ質問が反対票を投じられたのか理解できません。これは、最初の日から、そしてデフォルトの動作がそれほど役に立たないため、明らかに多くの人々が何かを再定義し<c-a>たり<c-x>、他の何かに迷惑をかけたりしました。
firedev 2015

質問が非常に具体的なものに対するものであり、元の質問が途中で変化したため、最初の数にジャンプする必要があるため、私はそれが反対票を投じているのを見ることができました。それ以外に、私が実際に使用<c-a>して<c-x>多くのことを。バージョンを更新したり、範囲変数を増やしたりするときはいつでも[N]<c-a>、削除して置き換えるのではなく、
jecxjo 2015

1
それは可能ですが、はるかに大きな機能のセットになります。現在の実装では、を活用する<c-a>と、<c-x>同じことを行いますが、ダッシュを無視する機能のためにドロップされている必要があります。
jecxjo 2015

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を加算または減算します。これには3つの問題があります。

  1. これは主にテキストの操作であり、最初の文字のみを見ているため、数値が負であるかどうかはわかりません。これは修正可能ですが、現在の動作はそのままです。
  2. 検索レジスタ"/を上書きします:hlsearchをオンにしている場合、これを使用すると、現在のバッファー内のすべての数値が強調表示されます。:noh<CR>上記の各mapコマンドに追加して強調表示を停止することができますが、レジスターが破壊されないようにうまく停止する方法がわかりません。
  3. カーソルの後の最初の番号ではなく、行の最初の番号で機能します。

また、それが私である場合、上記ではなく<leader>aとにマップ<leader>xCTRL-A/Xます。このようにして、両方の動作を利用できます。<leader>デフォルトでは、円記号キー(\)です。


負の数を無視することは問題ありませんが、実際にはデフォルトの動作が奇妙に思えました。私はそれ:nohも同様にはるかに良く見えると思います。しかし、実際の問題は、カーソル位置をベースとして使用できないため、行の最初の桁のみをインクリメントできることです。
firedev 2015

これは9で止まり、10を超えると10ではなく11ずつ増加します...これは意図的ではない(バグなど)と思いますか?さらに、常に非再帰的マッピング(noremap)を使用し、絶対 に使用したくない場合map。詳細については、このページ を参照してください
Martin Tournoij、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.