Emacsで「元に戻す」後、どのように変更を「やり直し」ますか?


268

この記事では、「Emacsはやり直しの際に方向を逆にできるため、やり直しを元に戻すことができるため、やり直しができる」と述べています。

これは何を意味するのでしょうか?ユーザーはどのようにしてEmacsで「やり直す」ことができますか?


3
受け入れられた回答の下にある回答は、その回答がどのように表示されているのかを示しています。その回答が書かれているので、ほとんどの人が実際にそれを探しているはずです。
アーロンホール

スペースバーを押すだけです。その後、スペースを元に戻し、最後までやり直したやり直しをやり直します。最後まで戻り、再び元に戻ります。もっと複雑な方法があることはわかっていますが、これは高速で、簡単で、それが私が転がる方法です。
2016年

回答:


294

ショートバージョン:元に戻すを元に戻します。取り消してから、などの編集以外のコマンドを実行するとC-f、次の取り消しで取り消しが取り消され、結果としてやり直しになります。

長いバージョン:

元に戻す操作は、操作のスタックを操作していると考えることができます。C-f一連の取り消し操作の後に何らかのコマンド(のようなナビゲーションコマンドを含む)を実行すると、すべての取り消しが操作スタックにプッシュされます。したがって、次の取り消しは最後のコマンドを取り消します。次のような操作シーケンスがあるとします。

  1. 「foo」を挿入
  2. 「バー」を挿入
  3. 「スパムが大好き」を挿入

今、あなたは元に戻します。最後のアクションが取り消され、次のリストが表示されます。

  1. 「foo」を挿入
  2. 「バー」を挿入

この時点で元に戻す以外C-fの操作を行うと、操作スタックは次のようになります。

  1. 「foo」を挿入
  2. 「バー」を挿入
  3. 「スパムが大好き」を挿入
  4. 「スパムが大好き」の挿入を元に戻す

元に戻すと、最初に元に戻すのは元に戻すです。元のスタック(およびドキュメントの状態)になります:

  1. 「foo」を挿入
  2. 「バー」を挿入
  3. 「スパムが大好き」を挿入

元に戻すシーケンスを解除するために変更コマンドを実行すると、そのコマンドは元に戻すの後に追加されるため、後で元に戻す必要があります。を押すのではなく、「bar」の上でバックスペースしたとしますC-f。その後、あなたは持っていただろう

  1. 「foo」を挿入
  2. 「バー」を挿入
  3. 「スパムが大好き」を挿入
  4. 「スパムが大好き」の挿入を元に戻す
  5. 「バー」を削除

この追加/再追加は無限に起こります。慣れるには少し時間がかかりますが、Emacsには非常に柔軟で強力な元に戻す/やり直しメカニズムが備わっています。


117
これが面倒に聞こえるかもしれませんが、大きな利点は、いつでも以前の状態に戻ることができることです。ほとんどのエディターでは、いくつかの変更を元に戻してから誤って文字を入力すると、元に戻した内容をやり直す方法がなく、「取り残された」状態になります。Emacsはこれを簡単にします。
phils '20

3
私はあなたの構築で、誰かが紙でそれをしたいのであれば、あなたは2つのスタックが必要になると思います。たとえば、「今、元に戻す。最後のアクションを元に戻します。リスト:「あなたは(当然のことながら)取り消しを表示しませんでした。そして、彼が多くの取り消しを行った場合、取り消しシーケンスを解除するために何かが行われるまでそれらを表示せず、それらを追加します。それは1つのリストを持っているだろう、と彼らはその後、壊れている前であっても、リストにアンドゥを追加するが、アンドゥから逆方向に働いている場所を、我々は知っているので、カーソルは、リストにあるノートにして表示する別の方法
barlop

25
それは迷惑に聞こえます。
フェリペ

13
それもあなたを教えていない場合、この答えが受け入れられた理由を私は知らないどのように
アーロンホール

8
悲しいことに、この答えはCg C- /であるredoコマンドについては何も述べていません。
vishnuprasanth 2017

211

元に戻すには: C-_

元に戻した後にやり直すには: C-g C-_

複数回入力し C-_ て、元に戻した操作 C-_ をやり直します。emacsコマンドを複数回やり直すには、コマンドを実行してC-xzから、zキーを何度か入力してからコマンドを繰り返します(マクロを複数回実行する場合に興味深い)。


4
繰り返しを行うにはC-u、たとえばを使用することもできますC-u 8 *(キャレットがある場所に8 *を挿入します)。したがって、xステップC-u x C-_を元に戻すために使用できます。
Patrick

10
これは元の質問とは関係ありませんが、キーボードマクロを(を使用してC-x e)実行した直後はe、もう一度実行するのに必要なだけ押すことができます。
クリスチャンバーグ

7
また、C-/およびC-x uは、と同等の代替undoキーバインディングC-_です。C-/打ちやすいので好きです。
Rory O'Kane 2013

8
警告:この回答でC-g C-_「元に戻した後にやり直す」と回答した場合、その組み合わせに初めてアクセスしたときにのみ適用されます。その後、なしで取り消しキーを繰り返しますC-g。元に戻した直後に3回やり直すには、と入力しC-g C-_ C-_ C-_ます。「」と入力C-g C-_ C-g C-_ C-g C-_すると、円を一周して、やり直しのやり直しを取り消します...
Rory O'Kane

@ RoryO'Kane emacsについてよく知らないので、私が間違っている箇所を修正してください。元に戻す(「元に戻した後のやり直し」という説明のように)。これは、元に戻す操作が直前に行われたのではないため、元に戻してやり直したりやり直したりすることなど、サークル内で行われることではありません。CgC- _ CgのC-_それは文字通り何もしないです、最初の1の後の円に行くのではありません。
barlop

56
  • するには元に戻すいったん:C-/
  • 2回元に戻すには: C-/ C-/
  • するにはやり直しすぐに元に戻すの後、一度:C-g C-/
  • :すぐに元に戻した後、二回やり直すにC-g C-/ C-/C-g繰り返されないことに注意してください。
  • すぐに元に戻す、1回:C-g C-/
  • すぐに元に戻すには、2回: C-g C-/ C-/
  • するために再びやり直し、同じ...

最後の元に戻すコマンド以降にキーを押した場合(文字を入力する場合でも、カーソルを移動する場合でも)、C-g次の元に戻す/やり直す前に入力する必要はありません。C-gそれ自体は何もしない、ヒットするだけの安全なキーですが、元に戻すシーケンスの終了を知らせる非元に戻すキーとしてカウントされます。などの別のコマンドを押してC-fも機能します。カーソルが移動した場所から移動するだけです。

あなたがヒットした場合C-g、または別のコマンドあなたが意味するものではありませんでした、とあなたは今、間違った方向に取り消しされている場合、単にヒットC-gもう一度あなたの方向を逆にします。意図したやり直しに到達する前に、偶発的なやり直しと元に戻す操作を最後までやり直す必要がありますが、を押し続けるだけでC-/、最終的に希望する状態に到達します。実際、C-g一度ヒットしてから押すと、バッファがこれまでにあったすべての状態に到達できます。C-/十分な回数。

以下のための代替ショートカットundo以外の、C-/ある、C-_C-x u、およびM-x undo

Emacsの取り消しシステムの詳細については、Emacsマニュアルの取り消しを参照してください。


38

より一般的な元に戻す/やり直し機能を使用したい人のために、誰かが書いていundo-tree.elます。Emacs以外の取り消しのルックアンドフィールを提供しますが、取り消し履歴の「ツリー」全体へのアクセスを提供します。

私はEmacsの組み込みの取り消しシステムが好きですが、このパッケージは非常に直感的であることがわかりました。

これはファイル自体からのコメントです:

Emacsには強力な取り消しシステムがあります。ほとんどのソフトウェアで標準アンドゥ/リドゥシステムとは異なり、それはあなたが回復することができますいずれかを(標準アンドゥ/リドゥシステムは、あなたがやり直しとすぐに過去の状態を失うことができるのに対し)バッファの過去の状態を。ただし、このパワーには代償が伴います。多くの人々は、Emacsのundoシステムが混乱して使いにくいことに気付き、強力ではないが直感的なundo / redoシステムに置き換える多くのパッケージを生み出します。

標準の元に戻す/やり直しによるデータの損失とEmacsの元に戻すの混乱の両方は、元に戻す履歴を一連の変更として処理しようとすることに起因します。そうではありません。このパッケージが提供する「undo-tree-mode」は、Emacsの「元に戻す」システムを、元に戻す履歴を処理するシステム、つまり変更の分岐ツリーに置き換えます。この単純なアイデアにより、標準の元に戻す/やり直しシステムのより直感的な動作を、履歴を失うことのない力と組み合わせることができます。追加の副次的なボーナスとして、取り消し履歴をより効率的に保存できる場合があり、Emacsが履歴の破棄を開始する前に、より多くの変更を蓄積できます。


3
素晴らしい!emacs undoは計り知れないと誰が言ったのですか?:-)
Peter.O、2011年

すごい!概念的には健全でユーザーは直感的です。これはデフォルトのパッケージにあるはずです。1つのコメント:分岐点からやり直すときだけでなく、分岐点からやり直すときにも警告メッセージが表示されたらいいのにと思います。たとえば、ユーザーがREDOを呼び出す場合:「ブランチポイントからやり直す」または「使用されるデフォルトのREDOブランチ」-複数のブランチがあることをユーザーに警告するだけです。
バーゼルシシャニ

1
実装がはるかに簡単でビジュアライザを必要としないこの問題への別のアプローチは、最後の分岐点のみを維持し、3つのコマンド(元に戻す、やり直し、分岐の切り替え)を提供することです。元に戻す/やり直しは分岐がヒットしたときに警告し、分岐で分岐が切り替わるだけで、分岐がない場合は「分岐にない」というメッセージが表示されます。いつでも分岐が発生すると、以前の分岐点は失われます。これは、状態損失の問題を合理的に適切に解決し、最小限の複雑さで解決します。
バーゼルシシャニ

1
これは、ランダムに失敗することができたREDOにおける長年のバグがある注意してください:github.com/syl20bnr/spacemacs/issues/9903を - 2014年以降についても知られている
ideasman42

@ ideasman42どうやらこれは「非バグ」です:dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

用心アンドゥツリーのための癖のREDO

アンドゥツリーには、多くの人気の「スターターキット」(プレリュード、パーセル、スペースマック)がバンドルされています。ほとんど(すべて?)でも自動で有効にします。前述のように、元に戻すツリーは、元に戻す/やり直しツリーを視覚化してトラバースするための便利な方法です。Preludeはそれにキーコード(uu)を提供しますC-x u

問題は次のとおりです。アンドゥツリーは、Emacsのデフォルトを破壊するようだと、よく知られたバインディングのREDOC-g C-/

代わりに、これらの対称キーを使用して元に戻す/やり直すことができます

C-/     undo
C-S-/   redo

ビジュアライザーを開かずにすばやくやり直したい場合があるので、これらは便利です。


この。私はSpacemacsを使用していますが、なぜそれが機能しないのか理解できませんでした。ありがとう!
mghaoui 2016年

11

「通常の」元に戻す/やり直しを行うにはredo.el非常に便利です。通常、次のように、CSzにバインドしてCzに元に戻します。

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

ファイルをダウンロードしてlisp-pathに入れ、上記をに貼り付けます.emacs


redo.elのヘッダーにあるコメントには、XEmacs用に作成されたと書かれています。GNU Emacsや他の関連するEmacsenでそれを使用することに問題はありますか?
A.レヴィ

私はまだ何の問題もなく、少なくとも6か月間それを使用してきました:)
monotux

4
emacswiki.org/emacs/RedoModeから:ただし、redo.elは古く、しばしば「バッファの内容を破棄します。これは、Emacs 22以降、「primitive-undo」の動作が古いものと少し異なるためです。RedoPlusはredo.elのフォークで、新しいバージョンのEmacsで正しく動作します。ここでRedoPlusを入手できます:emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 は、redoコマンド(と呼ばれるundo-redo)を追加します

より典型的な元に戻す/やり直しが必要な場合は、次のコマンドを使用できます。

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)

1

最後の操作をやり直す場合は、次の操作を行います。

  1. ESC
  2. 別の元に戻す(C + /

0

デフォルトでは、Emacsでやり直すにはCgを押してから元に戻す必要があります。

ただし、Emacsの組み込みundoを使用してredoコマンドを実装することもできます。

パッケージundo-fuは、Emacs組み込みの取り消し機能を使用して、取り消しとやり直しの両方を公開します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.