元に戻す

Nvim の:helpページ。 生成されたファイルは、ソースから tree-sitter-vimdoc パーサーを使用して生成されています。


元に戻すおよびやり直し
基本的な操作については、ユーザーマニュアルの 02.5 節を参照してください。

1. 元に戻すおよびやり直しのコマンド undo-commands

<Undo> または undo <Undo> u u [回数]個の変更を元に戻します。
:u :un :undo :u[ndo] 1つの変更を元に戻します。 E830
:u[ndo] {N} 変更番号{N}の後の状態にジャンプします。{N}の意味については、undo-branchesを参照してください。
:u[ndo]! 1つの変更を元に戻し、元に戻す履歴から削除します。 E5767
:u[ndo]! {N} ":u[ndo] {N}" と同様ですが、現在の元に戻すブランチの{N}までのすべての変更を忘れさります。 ":undo! {N}" は、同じ元に戻すブランチ内で後方に移動する場合にのみ使用でき、やり直しや別の元に戻すブランチへの切り替えには使用できません。
CTRL-R
CTRL-R 元に戻した[回数]個の変更をやり直します。
:red :redo redo :red[o] 元に戻した1つの変更をやり直します。
U
U 最新の変更を1行分(最新の変更が行われた行)すべて元に戻します。U自身も変更としてカウントされるため、Uは前のUを元に戻します。
最後の変更は記憶されます。上記の元に戻すコマンドとやり直しコマンドを使用して、テキストを各変更前の状態に戻すことができます。また、変更を適用して、元に戻す前のテキストに戻すこともできます。
"U"コマンドは、他のコマンドと同様に元に戻す/やり直しで処理されます。そのため、"u"コマンドは"U"コマンドを元に戻し、'CTRL-R'コマンドはそれをやり直します。"U"、"u"、'CTRL-R'を組み合わせると、"U"コマンドは1行の状態を前の"U"コマンドの状態に復元します。これは混乱を招く可能性があります。試してみて慣れてください。"U"コマンドは常にバッファを変更済みとしてマークします。"U"がバッファを未変更の状態に戻した場合でも、変更済みと見なされます。バッファが未変更になるまで"u"を使用して変更を元に戻してください。

2. 元に戻す方法2つ undo-two-ways

元に戻すコマンドとやり直しコマンドの動作は、'cpoptions'の'u'フラグによって異なります。Vim方式('u'を除外)とVi互換方式('u'を含む)があります。Vim方式では"uu"は2つの変更を元に戻します。Vi互換方式では"uu"は何もしません(元に戻す操作を元に戻します)。
'u'を除外したVim方式:元に戻すコマンドで時間を遡ることができます。その後、やり直しコマンドで再び先に進むことができます。元に戻すコマンドの後で新しい変更を加えると、やり直しはできなくなります。
'u'を含むVi互換方式:元に戻すコマンドは前の変更と前の元に戻すコマンドも元に戻します。やり直しコマンドは前の元に戻すコマンドを繰り返します。変更コマンドを繰り返すわけではありません。それには"."を使用してください。
例 Vim方式 Vi互換方式
"uu" 2回元に戻す 何もしない "u CTRL-R" 何もしない 2回元に戻す
理由:NviはCTRL-Rの代わりに"."コマンドを使用します。残念ながら、これはVi互換ではありません。たとえば、Viでは"dwdwu."は2つの単語を削除しますが、Nviでは何も行いません。

3. 元に戻すブロック undo-blocks

1つの元に戻すコマンドは通常、そのコマンドがどれだけ多くの変更を加えたかに関係なく、入力されたコマンドを元に戻します。この一連の元に戻せる変更は、元に戻すブロックを形成します。そのため、入力されたキーが関数を呼び出す場合、関数内のすべての命令がまとめて元に戻されます。
新しい元に戻せる変更を作成せずに、前の変更に結合する関数またはスクリプトを作成する場合は、次のコマンドを使用します。
:undoj :undojoin E790 :undoj[oin] 後続の変更を前の元に戻すブロックに結合します。警告:注意して使用してください。ユーザーが変更を適切に元に戻せなくなる可能性があります。元に戻すまたはやり直しの後では使用しないでください。
これは、変更の途中でユーザーにプロンプトを表示する必要がある場合に最も役立ちます。たとえば、getchar()を呼び出す関数の場合です。結合する必要がある関連する変更が事前に存在することを確認してください。
これはそれだけでは機能しません。次のキーを押すと、新しい変更が再び開始されるためです。しかし、次のようなことができます。
:undojoin | delete
その後、"u"コマンドは削除コマンドと前の変更を元に戻します。undo-break undo-close-block 逆を行うには、次の変更に対して新しい元に戻すブロックを使用します。挿入モードではCTRL-G uを使用します。これは、挿入コマンドを部分的に元に戻す必要がある場合に役立ちます。たとえば、文ごとに。i_CTRL-G_u
'undolevels'の値を設定すると、元に戻すブロックも閉じられます。新しい値が古い値と同じ場合でも同様です。'undolevels'のグローバル値のみを明示的に読み書きするには、g:undolevelsを使用します。
let &g:undolevels = &g:undolevels
同様に見える代入let &undolevels=&undolevelsは、ローカルオプションが異なる値に設定されている場合に、'undolevels'のグローバルオプション値を保持しません。たとえば
" Start with different global and local values for 'undolevels'.
let &g:undolevels = 1000
let &l:undolevels = 2000
" This assignment changes the global option to 2000:
let &undolevels = &undolevels

4. 元に戻すブランチ undo-branches undo-tree

上記では、元に戻す/やり直しの1行についてのみ説明しました。しかし、分岐することも可能です。これは、いくつかの変更を元に戻してから、新しい変更を加えた場合に発生します。元に戻された変更はブランチになります。次のコマンドを使用して、そのブランチに移動できます。
これはユーザーマニュアルで説明されています:usr_32.txt.
:undol :undolist :undol[ist] 変更ツリーの葉を一覧表示します。例
保存時の変更数
88 88 2010/01/04 14:25:53 108 107 08/07 12:47:51 136 46 13:33:01 7 166 164 3秒前
"number"列は変更番号です。この番号は連続して増加し、特定の元に戻せる変更を識別するために使用できます。:undoを参照してください。"changes"列は、ツリーのルートからのこの葉への変更数です。"when"列は、この変更が行われた日時です。4つの可能な形式があります:N秒前 HH:MM:SS 時間、分、秒 MM/DD HH:MM:SS 同上、月と日 YYYY/MM/DD HH:MM:SS 同上、年 "saved"列は、この変更がディスクに書き込まれたかどうか、そしてそれがどのファイル書き込みであったかを指定します。これは:laterコマンドと:earlierコマンドで使用できます。詳細については、undotree()関数を使用してください。
g-
g- より古いテキストの状態に移動します。回数を使用して、その回数だけ繰り返します。:ea :earlier :ea[rlier] {count} より古いテキストの状態に{count}回移動します。:ea[rlier] {N}s 約{N}秒前の古いテキストの状態に移動します。:ea[rlier] {N}m 約{N}分前の古いテキストの状態に移動します。:ea[rlier] {N}h 約{N}時間前の古いテキストの状態に移動します。:ea[rlier] {N}d 約{N}日前の古いテキストの状態に移動します。
:ea[rlier] {N}f ファイル書き込みから{N}回前の古いテキストの状態に移動します。最後の書き込み以降に変更が行われた場合、":earlier 1f"はテキストを書き込まれた時の状態に戻します。そうでない場合は、その前の書き込みに移動します。最初のファイル書き込みの状態にある場合、またはファイルが書き込まれていない場合、":earlier 1f"は最初の変更前の状態に移動します。
g+
g+ より新しいテキストの状態に移動します。回数を使用して、その回数だけ繰り返します。:lat :later :lat[er] {count} より新しいテキストの状態に{count}回移動します。:lat[er] {N}s 約{N}秒後の新しいテキストの状態に移動します。:lat[er] {N}m 約{N}分後の新しいテキストの状態に移動します。:lat[er] {N}h 約{N}時間後の新しいテキストの状態に移動します。:lat[er] {N}d 約{N}日後の新しいテキストの状態に移動します。
:lat[er] {N}f ファイル書き込みから{N}回後の新しいテキストの状態に移動します。最後のファイル書き込みの状態にある場合、":later 1f"は最新のテキストの状態に移動します。
'undolevels'のために元に戻す情報がクリアされると、テキストの状態にアクセスできなくなる場合があります。
時間移動中に複数の変更が同時に発生しても驚かないでください。これは、元に戻すツリーを移動してから新しい変更を加えた場合に発生します。

このテキストから開始します
one two three
"x"を3回押して最初の単語を削除します
ne two three
e two three
two three
"u"を3回押して元に戻します
e two three
ne two three
one two three
"x"を3回押して2番目の単語を削除します
one wo three
one o three
one three
"g-"を3回使用して元に戻します
one o three
one wo three
two three
"one"を削除した後の最初の元に戻すブランチに戻ります。"g-"を繰り返すと、元のテキストに戻ります
e two three
ne two three
one two three
":later 1h"で最後の変更にジャンプします
one three
":earlier 1h"で再び先頭に戻ります
one two three
"u"とCTRL-Rを使用しても、すべての可能なテキスト状態に到達できませんが、"g-"と"g+"を繰り返すと到達できます。

5. 元に戻すの永続性 undo-persistence persistent-undo

バッファをアンロードするとき、Vimは通常、そのバッファに対して作成された元に戻すツリーを破棄します。'undofile'オプションを設定すると、ファイルを書き込むときに元に戻す履歴が自動的に保存され、ファイルを再度編集するときに元に戻す履歴が復元されます。
'undofile'オプションは、BufWritePostオートコマンドの前に、ファイルを書き込んだ後にチェックされます。元に戻す情報を書き込むファイルを制御する場合は、BufWritePreオートコマンドを使用できます。
au BufWritePre /tmp/* setlocal noundofile
Vimは、編集されたファイルごとに個別のアンドゥファイルにアンドゥツリーを保存します。これは、ファイルシステムパスをアンドゥファイルに直接マッピングする単純なスキームを使用しています。Vimは、アンドゥファイルが対応するファイルと同期しなくなった場合(ファイルの内容のハッシュを使用)、アンドゥファイルが書き込まれた後にファイルが変更された場合はそれを無視して、破損を防ぎます。アンドゥファイルの所有者が編集されたファイルの所有者と異なる場合も、アンドゥファイルの所有者が現在のユーザーである場合を除き、アンドゥファイルは無視されます。ファイルをオープンするときにその旨のメッセージを表示するには、'verbose' を設定してください。
アンドゥファイルの場所は'undodir' オプションで制御されます。デフォルトでは、アプリケーションデータフォルダ内の専用のディレクトリに保存されます。
また、":wundo"と":rundo"を使用して、アンドゥ履歴を保存および復元することもできます。:wundo :rundo :wundo[!] {file} アンドゥ履歴を{file}に書き込みます。{file}が存在し、アンドゥファイルのように見えない場合(ファイルの先頭にあるマジックナンバーが間違っている)、!を追加した場合を除き、これは失敗します。存在し、アンドゥファイルのように見える場合は上書きされます。アンドゥ履歴がない場合は、何も書き込まれません。実装の詳細:上書きは、既存のファイルを最初に削除してから、同じ名前の新しいファイルを作成することによって行われます。そのため、書き込み禁止ディレクトリにある既存のアンドゥファイルを上書きすることはできません。
:rundo {file} {file}からアンドゥ履歴を読み込みます。
これらをautocommandで使用して、履歴ファイルの名前を明示的に指定できます。例:
au BufReadPost * call ReadUndo()
au BufWritePost * call WriteUndo()
func ReadUndo()
  if filereadable(expand('%:h') .. '/UNDO/' .. expand('%:t'))
    rundo %:h/UNDO/%:t
  endif
endfunc
func WriteUndo()
  let dirname = expand('%:h') .. '/UNDO'
  if !isdirectory(dirname)
    call mkdir(dirname)
  endif
  wundo %:h/UNDO/%:t
endfunc
'undofile' はオフにしておく必要があります。そうでないと、書き込みごとに2つのアンドゥファイルが作成されます。
Vimが使用するファイル名を調べるには、undofile() 関数を使用できます。
ファイルの読み書き中に'undofile' が設定されている場合、'verbose' が設定されていない限り、ほとんどのエラーはサイレントになります。:wundoと:rundoでは、ファイルを読み書きできない場合など、より多くのエラーメッセージが表示されます。
注意:アンドゥファイルはVimによって削除されることはありません。自分で削除する必要があります。
既存のアンドゥファイルの読み込みは、いくつかの理由で失敗することがあります。E822 ファイルのパーミッションが許可していないため、開けません。E823 ファイルの先頭にあるマジックナンバーが一致しません。これは通常、アンドゥファイルではないことを意味します。E824 アンドゥファイルのバージョン番号は、より新しいバージョンのVimによって書き込まれたことを示しています。それを開くには、その新しいバージョンが必要です。ファイル内のアンドゥ情報を保持したい場合は、バッファを書き込まないでください。「ファイルの内容が変更されました。アンドゥ情報を使用できません」ファイルのテキストは、アンドゥファイルが書き込まれたときとは異なります。これは、アンドゥファイルを使用できないことを意味し、テキストが破損する可能性があります。'encoding'がアンドゥファイルが作成されたときと異なる場合にも発生します。E825 アンドゥファイルに有効な内容が含まれておらず、使用できません。「アンドゥファイルを読み込んでいません。所有者が異なります」アンドゥファイルは、テキストファイルの所有者とは異なる人物が所有しています。安全のために、アンドゥファイルは使用されません。
アンドゥファイルの書き込みは、これらの理由で失敗することがあります。E828 書き込むファイルを作成できません。おそらく、そのディレクトリへの書き込み権限がありません。「'undodir'内のどのディレクトリにもアンドゥファイルを書き込めません」'undodir'内のどのディレクトリも使用できません。「アンドゥファイルで上書きしません。読み込めません」書き込むアンドゥファイルと同じ名前のファイルが存在しますが、読み込めません。このファイルを削除するか、名前を変更することを検討してください。「上書きしません。これはアンドゥファイルではありません」書き込むアンドゥファイルと同じ名前のファイルが存在しますが、正しいマジックナンバーで始まっていません。このファイルを削除するか、名前を変更することを検討してください。「アンドゥファイルの書き込みをスキップします。アンドゥするものがありません」書き込むアンドゥ情報がありません。何も変更されていなかったか、'undolevels'が負の数です。E829 アンドゥファイルの書き込み中にエラーが発生しました。再試行してください。

6. アンドゥに関する備考 undo-remarks

記憶される変更の数は、'undolevels' オプションで設定します。0の場合、常にVi互換の方法が使用されます。負の数の場合、アンドゥはできません。メモリ不足の場合に使用します。
アンドゥのクリア
'undolevels' を -1 に設定した場合、アンドゥ情報はすぐにクリアされません。次の変更時にクリアされます。アンドゥ情報を強制的にクリアするには、これらのコマンドを使用できます。
:let old_undolevels = &l:undolevels
:setlocal undolevels=-1
:exe "normal a \<BS>\<Esc>"
:let &l:undolevels = old_undolevels
:unlet old_undolevels
'undolevels' のローカル値を明示的に読み取るための&l:undolevels の使用、およびローカルオプションのみを変更するための:setlocal の使用に注意してください(これは対応するグローバルオプション値よりも優先されます)。&undolevels を使用してオプション値を保存することは予測不可能です。ローカル値(設定されている場合)またはグローバル値(それ以外の場合は)を読み取ります。また、ローカル値が設定されている場合、:set undolevels を使用してオプションを変更すると、グローバル値とローカル値の両方が変更されるため、両方の値を保存および復元するための追加作業が必要になります。
バッファのマーク('a~'z)もテキストと一緒に保存および復元されます。
すべての変更がアンドゥされた場合、バッファは変更されたと見なされません。その場合、":q!"ではなく":q"でVimを終了できます。これは、ファイルの最後の書き込みを基準とした相対的なものです。":w"の後に"u"を入力すると、実際に書き込まれたものと比較してバッファが変更されるため、バッファは変更されたと見なされます。
手動の折りたたみを使用している場合、折りたたみは保存および復元されません。折りたたみ内の変更のみが、折りたたみの最初と最後の行が変更されないため、折りたたみのまま維持されます。
番号付きレジスタも、削除のアンドゥに使用できます。テキストを削除するたびに、レジスタ"1に格納されます。レジスタ"1の内容は"2などにシフトされます。レジスタ"9の内容は失われます。putコマンドを使用して、最後に削除されたテキストを復元できます:"1P'。(また、削除されたテキストが最後の削除またはコピー操作の結果である場合、'P'または'p'も機能します。これは名前のないレジスタの内容を配置します)。3つ前に削除したテキストを復元するには'"3P'を使用できます。
リドゥレジスタ
削除されたテキストの複数の部分を復元したい場合は、リピートコマンド"."の特別な機能を使用できます。使用されるレジスタの番号が増加します。最初に'"1P'を実行した場合、次の"."は'"2P'になります。これを繰り返すと、すべての番号付きレジスタが挿入されます。
例:「dd....」でテキストを削除した場合は、「"1P....」で復元できます。
削除されたテキストがどのレジスタにあるかわからない場合は、:displayコマンドを使用できます。別の方法は、'"1P'で最初のレジスタを試してみて、目的のものでない場合は'u.'を実行することです。これにより、最初のputの内容が削除され、2番目のレジスタのputコマンドが繰り返されます。目的のものが見つかるまで'u.'を繰り返します。
メイン
コマンド索引
クイックリファレンス