CamelCaseをsnake_caseに置換したいけど、:%s/CamelCalse/snake_case/gでは全部消えてしまう……!
そんなとき、1つずつ置換するか決められる方法がcgnコマンドですね。
/CameclCaseで検索cgnで検索結果に対して編集を開始snake_caseと入力してEscで確定nで次の候補に移動し、置換対象であれば.で置換をリピート
Undo(u)とRedo(<C-r>)も使えるので、間違えても安心です。
n.n.n.せずに....して間違えたときだけuする、なんて使い方もできます。
ある程度Vimに慣れてきたユーザーが好む傾向にあり、monaqaさんの中級 Vim 操作でもトップバッターで紹介されています。
中級 Vim 操作
https://zenn.dev/vim_jp/articles/2024-06-05-vim-middle-class-features
このcgn、実は単体のコマンドではなく、cgnはc+gnで構成されています。
cはおなじみ「変更(change)」ですね。
cを入力するとOperator Pendingモードに入り、次に入力するモーションで変更範囲が決まります。
cwならカーソル位置からwモーションで移動する範囲を変更対象にします。
gnはモーションの中でもtext objectに分類されるもので、Operator Pendingモードで使うと「最後に検索したパターンにマッチする範囲」をOperatorの対象にします。
従って、Operator Pendingモードのgnは任意のOperatorと組み合わせて使うことができます。
cgn以外にもgnの使いどころが眠っているのです!
たとえば……
- Prefix削除のようなシーンでは、
dgnで検索結果を削除 - URLを
<>で囲いたいシーンでは、sagn<で検索結果を<>で囲う- vim-sandwichなどのプラグインが必要
といった具合。
URLを<>で囲う操作は、ブログをMarkdownで書いていて、<>をつけ忘れたときによくやっています。一括置換するにはなんやかんや例外があちことに表れるケースがあるので、sagn<で1つずつ囲うのが便利です。
## <>で囲う対象
https://example.com
## 例外
<https://example.com>
```
https://example.com
```
[example](https://example.com)別解として、Git commitしておいて、一斉置換してからdiffを見て要否判断するなんて方法もあります。色んな手段をもって、効率的に編集していきましょう!
ENJOY!
ところで、gnはノーマルモードで使うと検索にマッチした範囲をVisual選択します。
Visual選択して次にやりたいことと言ったらOperatorなので、個人的には使いどころがなく、上書き対象です。
flash.nvimを使って、表示領域内の検索マッチにラベルをつけ、指定したラベルにジャンプするようにしています。
Atusy's blog