
私はvimを使用しています。サラウンド.vim
(非常に長い)数学式(一致する括弧を含む)のすべての項目をsin(...)
変更したいと思います。sin[...]
入力例:
sin(A*(B+C))+sin((X+Y)*sin((A+D)*C))
希望の出力:
sin[A*(B+C)]+sin[(X+Y)*sin[(A+D)*C]]
現在は、まずカーソルがある次の/sin\zs(
式に移動するために検索し、一致する括弧を置き換えるために入力します。その後、(次の検索)と(前のコマンドの繰り返し)を使用してこれら2つのコマンドを繰り返すことができます。これはうまくいきますが、式が大きすぎて面倒です。sin
(
cs(]
n
.
完全なコマンドシーケンスを自動化する方法はありますか、またはvim
完全に自動化された方法で内部交換を実行する方法はありますか?
vimの外で変換する全く異なる方法があるかもしれませんが、教育的な理由から、私は次の方法に興味があります。vimソリューション問題に。
答え1
典型的なケースですが、再帰マクロ助けることができるキーシーケンスを再帰マクロに入れて実行します。 SEマスターを怒らせないように、Wikiの記事をまとめてみましょう。
- qqq-
q
レジスタのクリア - qq- マクロ記録開始
q
/\msin\zs(
Enter-sin(
カーソルを見つけて維持する(
- cs(]-replace
(...)
with[...]
(余分なスペースを追加したくない場合は]代わりに使用)[ - @q-
q
マクロを実行します。 (レジスタが空なのでまだ何もしませんq
。) - q- マクロ記録を終了します。
次に、記録したばかりのマクロを実行します@q。それはすべてです。@q
最後に、マクロ呼び出し自体を実行します。/sin(
もう何も見つからない場合は、最初のエラーが発生すると停止します。
注:これらの変更をファイル全体に適用せずに行10と20の間にのみ適用したいのですが、再帰を使用して手動チェックを回避するには、正規表現の一致のみを使用して作成\%>...l
できます。\%<...l
望ましい限界間: /\m\%>9l\%<21lsin\zs(
。