Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimでマクロを使わず、縦の連番を作成する

$
0
0

デモ

renban_demo.gif

縦の連番の作成

Vimで縦の連番を作成する場合、その場限りのマクロを組んで対応するのが一般的だと思います。

vimで連番の作成 - Qiita

ただ、個人的な意見としてマクロの作成は結構面倒というか、タイプを間違えて最初からやり直しになるあの徒労感を考えると、できれば避けたいやり方です。

幸い、連番作成系のタスクはおおまかなマクロの形が決まっているので、
数字を選択するテキストオブジェクト(textobj-numeral)を使うと簡単に書けます。

vimrc
setnrformats-=octal

NeoBundle 'kana/vim-textobj-user'
NeoBundle 'tkhren/vim-textobj-numeral'function! Increment(step)let inc_key =a:step >0 ? '^A' : '^X'let @z ='"zyadjvad"zp'. abs(a:step) . inc_key
    return'@z'endfunction

nmap <expr>+ Increment(1)
nmap <expr>- Increment(-1)"" 補足1) `^A`と`^X`は、`<C-v><C-a>`それぞれ`<C-v><C-x>`で入力できる特殊文字"" 補足2) `ad` は '[-+]?\d+' にマッチするテキストオブジェクト 

これで ++++++++++++++とか-------------を押し続けるだけで上のGIF画像のようなインクリメント/デクリメントができます。また、Increment()関数が返すのはマクロなので、100+のように行数を指定して実行することもできます。

Submode.vim を使う

Submode.vimを使うと、 例えば、<Space>+++++++++++++++++のようにprefix付きでマッピングできます。

NeoBundle 'kana/vim-submode'

call submode#enter_with('increment', 'n', 'e', '<Space>+', 'Increment(1)')
call submode#map('increment', 'n', 'e', '+', 'Increment(1)')
call submode#enter_with('decrement', 'n', 'e', '<Space>-', 'Increment(-1)')
call submode#map('decrement', 'n', 'e', '-', 'Increment(-1)')

その他

需要があるのか分かりませんが、コードをいじれば

  • step=2とすれば 0,2,4,6,8,10,... の連番になる
  • adaxとすれば、16進数を対象にできる

のような派生もできます。

同じようなマクロを返す関数を作れば、発想次第でいろいろできそうです。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>