いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

vimのコマンドラインモードで一気に編集する (vim, command line mode, range)

f:id:gsf_zero1:20211217140202g:plain

以前の記事

vimでカーソル位置の単語をコマンド行に挿入 - いろいろ備忘録日記

現場でvim慣れていない人が知っておくと便利なTips - いろいろ備忘録日記

vim の3種類のビジュアルモード (v, V, Ctrl-v) - いろいろ備忘録日記

vim のビジュアルモードで使える o コマンド(端点移動) - いろいろ備忘録日記

vimで関数の中身を全部削除するコマンド (Inner Block, di{, ci{, vi{ ) - いろいろ備忘録日記

プログラミング時に便利なvimの選択モーション (i{, i(, i[, i", it) - いろいろ備忘録日記

プログラミング時に便利なvimのビジュアルモードコマンド (I, A, X, c) - いろいろ備忘録日記

概要

よく忘れるのでここにメモメモ。。。知っているとちょっと楽できます。

頻繁に使うわけではないのですが、たまに以下のような作業が必要なときがあります。

  • 指定範囲を全部XXXXしたい

どのエディタでも出来ることなのですが、vimだとコマンドラインモードでもいい感じにできます。

コマンドラインモードとは、皆さんがいつも :wq とか打ち込んでいるあの部分で実行するモードの事ですね。

あの場所には、実は範囲が指定できます。

よく置換するときに :%/hello/world/g みたいなコマンド打つときがあると思いますが、この % の部分が範囲です。

% は特殊な範囲を示すもので、「そのファイルの全部」って意味になります。

同じ意味をちゃんと範囲指定の書き方で書くと以下のようになります。

:1,$/hello/world/g

$ も特殊な範囲で「ファイルの末尾」を表します。なのでこれも「ファイル全部」って意味になります。

:1,10/hello/world/g

とすると1行目から10行目までが範囲となります。

指定範囲を全部XXXXしたい

以下のような状態とします。

f:id:gsf_zero1:20220214142134p:plain

この状態で、ファイル全体に対してコメントアウトしたい場合、コマンドラインモードで以下のように打つことでも出来ます。

:%normal i//

書式としてはこうなります。

:範囲normal オペレーション

normalが来るとvimがノーマルモードに切り替えてくれます。その後に続く文字は操作です。コメントを先頭に入れたいので i// としています。

すると以下のようになります。

f:id:gsf_zero1:20220214142404p:plain

指定範囲全部に何かしたい (行番号指定)

また、10行目から12行目にある for ブロックのみをコメントアウトしたい場合も以下のように出来ます。

:10,12normal i//

実行すると以下のようになります。

f:id:gsf_zero1:20220214142530p:plain

指定範囲全部に何かしたい (マーク指定)

まあ、あまり行番号を直打ちすることは個人的にはないです。結構便利なのが、この範囲指定にマークが使える点です。

上のソースコードにて、10行目つまりforの最初に 'a 、12行目つまりforブロックの終わりに 'b というマークをつけていたとします。

以下のように指定すると前述した状態と同じになります。

:'a,'bnormal i//

実際、こんな3行程度をコメントアウトするのだったら、手動でやったほうが多分速いですが、クソコードをメンテしていたとしてこのforブロックが何百行にも渡っているとか想像すると、結構便利です。

forブロックの先頭にマークつけて、% 押してブロックの末尾にジャンプして、 :'a,'bnormal i// ってすると一気にコメントアウトできます。

指定範囲全部に何かしたい (検索指定)

マークで指定できるのも便利ですが、この範囲の部分には検索結果で範囲指定することも出来ます。

/ここから/,/ここまで/normal オペレーション

例えば、forブロックを全部コメントアウトしたい場合は以下のように指定することも出来ます。

以下のように指定すると前述した状態と同じになります。

:/\v\s+for/,/\v\s+}$/normal i//

f:id:gsf_zero1:20220214143658p:plain

f:id:gsf_zero1:20220214143712p:plain

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。