不完全なキーボードマクロの記録を再開するにはどうすればよいですか?


10

クラシックなユースケース:

  1. マクロの記録を開始します。 C-x (
  2. あなたはいくつかのことをします、としましょうhello
  3. エラーをスローするコマンドをC-g実行するC-sとします(たとえば、誤って実行し、それをでキャンセルする必要がある場合C-g、作業は失われます)。

これで、これまでの録音は失われました。

録音を中断するコマンドを実行する前に中断したところから再開したいと思います。を見てみましたC-h f start-kbd-macroが、Cで書かれているので、いじれません。私ものような変数を探して回りましたcurrent-kbd-macroが、今のところ何も見つかりませんでした。

回復できますか?

更新:

なぜうまくいかなかったのかC-u C-x (はわかりませんが、でテストしていることが原因であることがわかりましたC-g

それC-gは特別なことがわかります-あなたが別の種類のエラーをトリガーした場合

C-x ( M-: (signal 'quit nil) 

次に、これは記録を停止しlast-kbd-macroますが、を含みます"M-: M-( signal 'quit nil"が、

C-x ( C-g

これにより、記録が停止し、記録されたものはすべて破棄されます。Cgハッピーなユーザーとして(少なくとも2人の友人と同様に)、これはかなり残念な違いです。編集してみましkeyboard-quitたが、何もできません。

これを回復する唯一の方法は、を介してrecent-keys、start-kbd-macro(または同様の)が呼び出された場所を介して自動的に特定することのようkmacro-edit-lossageです。

回答:


8

私が始めたここ実装あなたが再バインドすることができますC-x (にしますresmacro-start-macro

ここで、マクロの途中でミスをしてを押したとしC-gます。たとえば、誤って実行C-sC-g、打ち消してキャンセルしたり、w / eを押したりします。

C-x ( hello C-s C-g 

実行C-u C-x (すると、ミニバッファーで次のプロンプトが表示されます。

(RET:続行、DEL:最後を削除)でマクロを再開します: h e l l o C-s

したがって、バックスペース(DEL)を押してを削除しC-s、次にRET進みます。今それは言う:

kbdマクロに追加しています...

そして、あなたは続けることができます。

合計で:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

便利な、ないコンテキストスイッチは、最低限のキーバインドは、あなたのマクロが(で始めた場所に自動的に割り出し、タスクを達成するC-x (から)(recent-keys)


1
ねえ、それは本当にいいですね。Emacsへのパッチとして提出しますか?
Stefan

あなたは好きなようにそうする/再ライセンスすることを歓迎します!信頼できることを確認できるように、どこかで発表する前に、ローカルでしばらく試用するつもりです。Emacsのメンテナは、それがあまりにもハックだと思うかもしれません。;-)
Christopher Done

これをEmacsに含めるには、著作者が著作権の書類に署名する必要があります(もちろん、同じ書類は神モードもカバーします)。
Stefan

リンクが壊れています:(
DirtY iCE

2

kmacro-start-macro-or-insert-counter接頭辞(C-u)を付けて実行し、前のマクロに追加します。


2
ドキュメンテーション文字列はそう言うが、ダブル前置引数(しないC-u C-u)セットの両方APPENDNO-EXECの引数にstart-kbd-macroあなたが追加することができます、することなく、それほど遠くマクロの最初のリプレイ。この動作はされてマニュアルに記載され、しかし:(emacs) Basic Keyboard Macro
PHILS

私の質問の例でこれを試してください、動作しません。
Christopher Done

2

stsquadとartagnonからの良い答えを組み合わせると、完全に合理的な問題の完全な解決策が(私の心に)与えられます。

  • C-xC-keC-hl 損失から生成されたマクロを編集するには
  • マクロを編集して、元の記録に縮小する
  • C-cC-c 編集したマクロを保存するには
  • どちらかC-u<f3>最初にそのマクロを再生し、その後マクロ定義に追加される後続のキーストロークの記録を継続します
  • ...または、マクロからファーまでの最初の再生なしでC-uC-u<f3>記録を続行します。

マクロとしてのlossage-as-macroを編集する必要は理想的ではないかもしれませんが、(a)記録を中止した場合に関係なくマクロを編集する必要があり、(b)これが頻繁に発生しないはずです。マクロを通常どおりに停止する方法を覚えているだけの場合(例:<f4>ではなくC-g)。

いずれも、打ち切られたマクロがどこかに保存されていても役に立たないと言っているわけではありません。これが実際に発生するとは思わないだけです。M-x report-emacs-bugこの機能を提案することはおそらく価値があります。


これは問題に対処していません。半分の時間のソリューションでは、マクロを最初からやり直す方が簡単です。問題をうまく解決する答えを他の場所に投稿しました。
Christopher Done

1
確かに、単純なケースでは最初からやり直す方が簡単でしょう。ただし、それでも残りの部分には役立ちます。特にデフォルトで利用可能です。私が示したように、より自動化されたアプローチのアイデアは良いものだと思うので、あなたがソリューションに取り組んでいるのを見て私は幸せであり、確かにあなたの答えに賛成票を投じました。
フィル、2014年

0

正規の解決策はC-x C-k C-ekmacro-edit-macro)で、キーを押すたびにステップを実行して、必要なものを挿入または削除できます。エディターのコマンド構文は少し簡潔ですが?、ガイドが表示されます。C-x C-k eedit-kbd-macro)にバインドされたより自然なエディターがあり、コメント付きのプレーンテキストマクロエディターを提供します。

もう1つのオプションはM-x insert-kbd-macro、マクロをLispとして編集できるようにすることですが、これは世界で最も読みやすいものではありません。

限り変数が懸念しているとして、あなたが探しているlast-kbd-macrokmacro-ring

あなたがあなたのマクロを完了していないことを述べているように、あなたはあなたの損失からそれを作成することができます。C-x C-k e C-h l先行する最大300文字を削除します。


これは、できれば反対票を投じるのは悪い答えです。質問を読んでいないか、無視しています。以前に押されたキーlast-kbd-macroもエラーも発生していません。私は特に、そのような悪い答えを見越して、タイトルのINCAPPLETEをすべて大文字にしています。でも、助けてくれてありがとう。kmacro-ringC-g
Christopher Done

1
@ChristopherDone:できます-損失について言及するために下部にメモを追加しました。以前に入力した最大300文字からマクロを作成できます。
stsquad 2014年

ええ、誰かが#emacsの損失について言及しました。中断したところから再開したいだけです。何かをしている最中にエディタを開いてそこから削除を始めたくありません。
Christopher Done

2
これとartagnonの回答の組み合わせは、細かいソリューションを提供:C-x C-k e C-h l、編集、C-c C-c、その後、C-u f3(それが最後のことは注目に記録に運ぶためにf3、まずます果たしマクロ、これまで、さらに入力を待つ前に)。たぶん、lossage-as-macroを編集する必要は理想的ではありませんが、(a)記録を中止した場合に関係なく、マクロを編集する必要がありました。(b)これは頻繁には発生しないはずです。マクロを正常に停止する方法を覚えているだけなら。
phils 2014年

1
@phils +1多分それを別の答えに変えるべきでしょう。
itsjeyd 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.