5

たとえば、ある行で23から24のすべてのオカレンスを変更し、次の行で24から25を変更したい場合など、複数のクエリと置換操作を連続して実行する必要があることがよくあります(通常は次のように記述しているため)後続の行で複数回ヤンクし、わずかに変更する必要がある行の式)...

Cx qを使用したマクロ、または複数のクエリ置換を実行する通常のマクロは、このような状況では十分に強力ではないようです。変数の置換またはこのような可変マクロのバリエーションを処理するためのより一般的/柔軟なものがありますか?Webで、lisp式が特定のコマンドに導入されてより強力になった例に出くわしたことがあると思いますが、これやどこで読んだか思い出せません。

4

4 に答える 4

6

これがあなたの質問に完全に答えるかどうかはわかりませんが、レジスターが強力なマクロを構築するための便利なツールであることがわかりました。最も重要な機能は次のとおりです。

  • C-x r n number-to-registerポイントの番号をレジスタにコピーします
  • C-x r + increment-registerレジスタに格納されている値をインクリメントします
  • C-x r i insert-registerレジスタの値をバッファに挿入します

これらの関数を使用すると、各行の増分数を次のように置き換える問題を解決できます。

  • 最初の番号を次のレジスタにシードしますnumber-to-register
  • マクロ定義を開始
  • 行を選択します
  • replace-string、、、、insert-register_ increment-register_insert-register
  • 次の行の先頭に移動します
  • マクロ定義の終了

emacsマニュアルには、レジスタに関する詳細情報があります:https ://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html

于 2012-04-30T19:22:07.083 に答える
3

ataylorによって表示されるコマンドなど、既存のコマンドを適切に使用するだけでなく、キーボードマクロを使用して、ほぼ任意に複雑で動的な動作を実行できます。

特に注目すべきは、C-uM-:入力したelispフォーム(もちろん、マクロの一部として作成できるフォーム)の結果を現在のバッファーに挿入するため、特定の操作に対するコマンドが存在しない場合でも、目標を達成するためにマクロを使用することを妨げられる可能性はほとんどありません。

(もちろん、elispが答えではない場合は、シェルコマンド出力を組み込むことにも簡単C-uM-!C-uM-|アクセスできます。)

当然、より的を絞った解決策が利用可能であり、マクロが価値よりも厄介な場合があります(コメントにリンクされている「検索してelisp評価に置き換える」手法も非常に強力で、多くの場合理想的な解決策です)。ただし、キーボードマクロは、信じられないほど少ない労力で驚くほどのパワーを提供し、他の方法では実装するのに苦労する可能性のあるいくつかのことを簡単に実行できます。

私のお気に入りの例の1つは、1つのバッファー(実質的に考えられる任意の形式)で「古い->新しい」マッピングデータを使用し、それを使用して別のバッファーでそれらの値の検索と置換を実行することです。単純な移動とキーストロークの編集だけで、この種のことをアドホックベースで実行できる速度は驚くべきものです。

マクロエディタを使用すると、最初に正しくない場合でも、すべての手順を再記録しなくても、マクロを簡単に調整できます。

私は一度、いくつかの有用なアドバイスを読みました。それは、些細なことではない何かに遭遇したときはいつでも、キーボードマクロでタスクを達成できるかどうかを常に考えようとすることでした。それらを使用すればするほど、それらを使用するさまざまな方法に気づきすぐにツールボックスに新しい不可欠なツールができあがります。

于 2012-05-01T11:03:57.420 に答える
2

あなたが尋ねる特定の状況は、使用するのに最適な場所のように聞こえますquery-replace-regexp

M-x query-replace-regexp
Regexp: \([0-9]+\)
Replace with: \,(+ 1 (string-to-number \1))

その使用は、1つ以上の数字のすべてのセットを見つけ(Emacs正規表現はサポートしていません\d)、それらをそれらの増分に置き換え、毎回プロンプトを表示します。

重要なポイントは次のとおりです。

  • キャプチャされたグループは、置換操作で呼び出すことができる文字列です
  • で任意のコードを置換操作につなぎ合わせることができます\,
  • この方法でステッチする任意のコードで、キャプチャされたグループを引数として使用できます
于 2012-05-01T13:32:46.323 に答える
1

エリスプ置換とキーボードマクロカウンターを使用して、述べた問題に対する別の可能な解決策を次に示します。これは、数値のプレフィックス引数でシードできます。

(これが優れているとは言いませんが、別の利用可能なオプションを示しています。)

したがって、23が開始番号であると仮定すると、次のマクロを次のように定義できます。

C-2C-3F3

C-SPC       ;; set-mark-command
C-e         ;; move-end-of-line
<<replace-regexp>>  ;; replace-regexp
<f3>        ;; kmacro-start-macro-or-insert-counter
C--         ;; negative-argument
M-@         ;; mark-word
M-w         ;; kill-ring-save
RET         ;; indent-new-comment-line
\           ;; self-insert-command
,(1+        ;; self-insert-command * 4
SPC         ;; self-insert-command
C-y         ;; yank
)           ;; self-insert-command
RET         ;; indent-new-comment-line

録音をF4停止します。

(nbこのマクロは、領域内の各行にシーケンス内の値が含まれていることを前提としています。)

次に、残りの行を強調表示し、を使用C-xC-krしてリージョン内のすべての行を更新します。

マクロカウンターを任意の値にC-xC-kC-c再設定して、別の領域でマクロを再生できます。

また、データが実際にどのように見えるかに応じて、replace-regexpを完全に削除し、代わりに番号がわかっている場所に移動し、既存の番号を削除し、その場所にカウンター値を挿入することで、これを大幅に簡略化できます。

于 2012-05-01T14:06:06.467 に答える