*undo.txt* For Vim バージョン 8.1. Last change: 2019 May 07 VIMリファレンスマニュアル by Bram Moolenaar
undo と redo
基本的なことは |02.5| で說明されてゐます。
1. undo と redo のコマンド | |undo-commands| |
2. Undo の 2 つの方式 | |undo-two-ways| |
3. Undo ブロック | |undo-blocks| |
4. Undo ブランチ | |undo-branches| |
5. Undo の永續化 | |undo-persistence| |
6. 備考 | |undo-remarks| |
[count] 個の變更を元に戾す。
1 つの變更を元に戾す。
變更番號 {N} の直後にジャンプする。{N} の意味については |undo-branches| を參照。
undo された變更を [count] 個やり直す (redo する)。
undo された變更を 1 つやり直す。
最近變更された行の、1 つの行の中でのすべての最近の變更を元に戾す。|U| 自體も變更としてカウントされます。つまり |U| によつてその前の |U| を元に戾すことができます。
變更は記錄されます。上記の undo コマンドや redo コマンドを使ふと、それぞれの變更が加へられる前のテキストに戾したり、變更を元に戾した後でその變更を再び加へることができます。
"U
" コマンドは他のコマンドと同樣に undo/redo の對象となります。つまり、"u
" コマンドで "U
" コマンドを undo したり、’CTRL-R’ コマンドでそれを redo したりできます。"U
" と "u
" と ’CTRL-R’ を混ぜて使ふと、"U
" コマンドが直前の "U
" コマンド以前の狀態を復元することに氣づくでせう。この動作はわかりにくいかもしれませんが、練習して慣れてください。
"U
" コマンドはバッファを變更有りの狀態にします。つまり、"U
" コマンドで變更が加へられる前のテキストに戾しても、それは變更有りの狀態として認識されます。"u
" を使つて變更無しの狀態まで undo してください。
undo コマンドと redo コマンドの動作は ’cpoptions’ の ’u’ フラグに依存してゐます。Vim 方式 (’u’ がない場合) と Vi 互換方式 (’u’ がある場合) があります。Vim 方式では "uu" は 2 つの變更を undo します。Vi 互換方式では "uu" は何もしません (undo を undo する)。
undo コマンドで過去に戾れます。そして、redo コマンドで再び先に進むことができます。undo コマンドを實行した後で新しい變更を加へると、redo はできなくなります。
undo コマンドは直前の變更と undo コマンドを undo します。redo コマンドは直前の undo コマンドを繰り返します。變更コマンドが繰り返されるわけではないので、さうしたい場合は "." を使つてください。
例 | Vim 方式 | Vi 互換方式 |
---|---|---|
"uu" | 2回 undo | 變更なし |
"u CTRL-R" | 變更なし | 2 回 undo |
理由:
Nvi では CTRL-R の代はりに "." コマンドを使ひます。あいにくこれは Vi 互換ではありません。例へば、"dwdwu." は Vi では 2 つの單語が削除されますが、Nvi では何も變更されません。
undo コマンドは普通は 1 つのコマンドを undo します。そのコマンドがいくつの變更を加へるかは關係ありません。この undo 可能な變更の組が undo ブロックです。例へば、キーの入力によつて函數が呼ばれた場合、その函數內のすべてのコマンドは一緖に undo されます。
函數やスクリプトを作るとき、undo 可能な變更を新しく追加するのではなく、その變更を直前の變更につなげたい場合は、次のコマンドを使つてください:
以降の變更を直前の undo ブロックにつなげる。
警告:
注意して使つてください。ユーザーが適切に變更を undo するのを妨げてしまふかもしれません。undo や redo の後でこのコマンドを使はないでください。
これは特に變更の途中でプロンプトを表示するやうな場合に便利です。例へば函數の中で |getchar()| を呼び出すなど。變更をつなげてしかるべき關聯性のある變更がそこにあることがわかつてゐる場合に使つてください。
このコマンドは單獨では機能しません。なぜなら、次のキー入力によつて再び新しい變更が開始されるからです。しかし例へば次のやうに使ふことはできます:
:undojoin | delete
この後で "u" コマンドを實行すると delete コマンドとその直前の變更が undo されます。
反對の動作、つまり變更を 2 つの undo ブロックに分けるには、插入モードで CTRL-G u を使ひます。插入コマンドを部分ごと (例へば文單位) に undo できるやうにしたい場合に便利です。|i_CTRL-G_u|
’undolevels’ の値を設定したときも undo は區切られます。新しい値と古い値が同じでもさうなります。
ここまでは一線上の undo/redo について說明してきました。しかし、それを枝分かれさせることもできます。枝分かれは、變更を undo してから新しい變更を加へることで起こります。undo された變更は枝 (ブランチ) になります。以下のコマンドで枝に移動できます。
ユーザーマニュアルに說明があります: |usr_32.txt|。
變更木 (tree) の、葉 (leaf) を一覽表示する。例: number changes when saved 88 88 2010/01/04 14:25:53 108 107 08/07 12:47:51 136 46 13:33:01 7 166 164 3 seconds ago
"number" 列は變更番號です。この番號は連續的に增えていき、undo 可能な變更の識別番號として使へます。|:undo| 參照。
"changes" 列は木のルートから葉までの變更の數です。
"when" 列は變更が加へられた日附と時刻です。日時の表記は 4 種類あります:
N seconds ago | 秒前 |
HH:MM:SS | 時:分:秒 |
MM/DD HH:MM:SS | 月/日 時:分:秒 |
YYYY/MM/DD HH:MM:SS | 年/月/日 時:分:秒 |
"saved" 列は變更がディスクに保存されたかどうか、そしてそれがどの書き込みだつたかを示します。この番號は |:later| コマンドと |:earlier| コマンドで使用できます。詳細を取得するには |undotree()| 函數を使ひます。
古いテキスト狀態に移動する。カウント指定で繰り返し回數を指定できます。
{count} 回前の古いテキスト狀態に移動する。
{N} 秒前の古いテキスト狀態に移動する。
{N} 分前の古いテキスト狀態に移動する。
{N} 時閒前の古いテキスト狀態に移動する。
{N} 日前の古いテキスト狀態に移動する。
{N} 回前のファイルを保存したときのテキスト狀態に移動する。
最後の保存から何か變更が加へられてゐたとき、":earlier 1f
" は保存時の狀態に移動します。變更がない場合は 1 つ前の保存時の狀態に移動します。
最初にファイルを保存した直後か、ファイルをまだ保存してゐないときは、":earlier 1f
" は最初の變更の前に移動します。
新しいテキスト狀態に移動する。カウント指定で繰り返し回數を指定できます。
{count} 回後の新しいテキスト狀態に移動する。
{N} 秒後の新しいテキスト狀態に移動する。
{N} 分後の新しいテキスト狀態に移動する。
{N} 時閒後の新しいテキスト狀態に移動する。
{N} 日後の新しいテキスト狀態に移動する。
{N} 回後のファイルを保存したときのテキスト狀態に移動する。最後に保存した狀態にゐるときは、":later 1f
" は一番新しいテキスト狀態に移動します。
Note:
テキスト狀態は、’undolevels’ により undo 情報がクリアされると、到達不可能になります。
時閒を移動すると一度に複數の變更が現れることもあります。これは undo ツリーを移動して新しい變更を加へたときに起こります。
例
次のテキストがあります:
one two three
"x" を 3 回押して最初の單語を削除します:
ne two three e two three two three
"u" を 3 回押してそれを undo します:
e two three ne two three one two three
"x" を 3 回押して 2 番目の單語を削除します:
one wo three one o three one three
"g-" を 3 回押してそれを undo します:
one o three one wo three two three
最初の undo ブランチ ("one" を削除した後) に戾りました。さらに "g-" を押していくと元のテキストに戾ります:
e two three ne two three one two three
":later 1h
" を實行すると最後の變更にジャンプします:
one three
":earlier 1h
" を實行すると最初に戾ります:
one two three
Note:
"u" と CTRL-R では "g-" と "g+" のやうにすべてのテキスト狀態に移動することはできません。
バッファがアンロードされるとき、通常はバッファの undo ツリーは廢棄されます。’undofile’ オプションを設定することで、ファイルを書き込んだときに自動的に undo 履歷が保存され、後でファイルを開いたときに undo 履歷が復元されます。
’undofile’ オプションはファイルを書き込んだ後、BufWritePost 自動コマンドの前に參照されます。undo 情報の保存をファイルごとに制禦したい場合は BufWritePre 自動コマンドを使ひます:
au BufWritePre /tmp/* setlocal noundofile
undo ツリーは undo ファイルとして分けて保存されます。undo ファイルは編輯ファイルごとに作られます。保存場所の決定にはファイルシステムのパスをそのまま使用した簡單な方法が使はれます。
Vim は編輯ファイルと undo ファイルの同期がとれてゐるかどうかを確認し (ファイルの中身のハッシュ値で判斷)、undo ファイルが書き込まれた後で編輯ファイルが變更されてゐたときは、データの損失を防ぐため、undo ファイルを無視します。
開いてゐるファイルと undo ファイルの所有者が違ふときも undo ファイルは無視されます。ただし、undo ファイルの所有者が現在のユーザーである時を除きます。
ファイルを開いたときにこの事についてのメッセージを表示させるには ’verbose’ を設定してください。
通常、undo ファイルは編輯ファイルと同じディレクトリに保存されます。この動作は ’undodir’ オプションで變更できます。
ファイルが暗號化されてゐるときは、undo ファイル內のテキストも暗號化されます。ファイルと同じ暗號化メソッドとキーが使用されます。 |encryption|
Note:
テキストプロパティは undo ファイルには保存されません。バッファがロードされてゐる限りテキストプロパティを復元できますが、undo ファイルから復元することはできません。 理論的根據: 關聯するテキストプロパティタイプを以前と全く同じ方法で定義する必要がありますが、これは保證できません。
":wundo
" と ":rundo
" を使ふことで undo 履歷の保存と復元を手動で實行することもできます。
undo 履歷を {file} に保存する。{file} が存在し、それが undo ファイルでないなら (ファイル先頭のマジックナンバーが違ふなら)、コマンドは失敗します。それでも保存したい場合は ! を付けてください。
{file} が存在し、それが undo ファイルなら上書きされます。undo 履歷がない場合は何も書き込まれません。 實裝詳細: 上書きは、最初にそのファイルを削除して、同じ名前のファイルを新しく作成することで實行されます。そのため、書き込み制限のかかつたディレクトリ內の undo ファイルは上書きできません。
{file} から undo 履歷を讀み込む。
自動コマンドを使ふことで undo ファイルの名前を明示的に指定することができます。例:
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 つの undo ファイルが作成されてしまひます。
|undofile()| 函數を使ふと、Vim が使用する undo ファイルの名前を取得できます。
Note:
’undofile’ が設定された狀態でファイルを讀み書きするとき、ほとんどのエラーは表示されません (’verbose’ が設定されてゐなければ)。:wundo と :rundo を使ふときはより多くのエラーメッセージが表示されます。例へばファイルが讀めない、書き込めないとき。
Note:
Vim は undo ファイルを削除しません。自分で削除する必要があります。
パーミッションの設定によりファイルを開けない。
ファイル先頭のマジックナンバーが違ふ。普通はそのファイルが undo ファイルでないことを意味します。
undo ファイルのバージョン番號が、それが Vim の新しいバージョンで書き込まれたことを示してゐる。新しいバージョンで開く必要があります。undo ファイルの情報を維持したいならそのバッファを保存してはいけません。
"ファイルが變更されてゐます。undo 情報を使用できません" ("File contents changed, cannot use undo info")
ファイルのテキストが undo ファイルを保存したときから變はつてゐます。テキストが壞れてしまふため、その undo ファイルは使用できません。これは ’encoding’ の設定が undo ファイル保存時と違ふ場合にも起こります。
undo ファイルの中身が不正なので使用できません。
undo ファイルが暗號化されてゐて、復號に失敗しました。
undo ファイルが暗號化されてゐて、使用中の Vim が暗號化をサポートしてゐません。他の Vim でファイルを開いてください。
undo ファイルが暗號化されてゐて、’key’ が設定されてをらず、テキストファイルは暗號化されてゐません。これはテキストファイルが暗號化を使用して保存された後で、暗號化を使用しないで上書きされた場合に起こります。おそらく undo ファイルを削除する必要があります。
"undo ファイルを讀み込めません。所有者が違ひます" ("Not reading undo file, owner differs")
undo ファイルの所有者とテキストファイルの所有者が違ひます。安全のため undo ファイルは使用されません。
書き込みのためのファイルを作成できません。おそらくディレクトリの書き込み權限がありません。
"’undodir’ で指定されたディレクトリに undo ファイルを保存できません" ("Cannot write undo file in any directory in ’undodir’")
’undodir’ で指定されたディレクトリの中に使用可能なものがありません。
"undo ファイルを上書きしません。讀み込み不可です" ("Will not overwrite with undo file, cannot read")
undo ファイルと同じ名前のファイルが存在し、それが讀み込みできない狀態になつてゐます。そのファイルを削除するか名前を變更する必要があります。
"上書きしません。undo ファイルではありません" ("Will not overwrite, this is not an undo file")
undo ファイルと同じ名前のファイルが存在し、そのファイルの先頭に正しいマジックナンバーがありません。そのファイルを削除するか名前を變更する必要があります。
"undo ファイルの書き込みをスキップします。undo がありません" ("Skipping undo file write, noting to undo")
保存する undo 情報がありません。何も變更されてゐないか ’undolevels’ がマイナス値です。
undo ファイルの保存中にエラーが發生しました。もう一度試してみてください。
記錄される變更の數は ’undolevels’ オプションで設定できます。ゼロに設定すると、Vi 互換方式の動作になります。マイナスの値に設定すると undo は使用できなくなります。メモリが足りない場合に設定してください。
’undolevels’ を -1 に設定しても、undo 情報はすぐにはクリアされません。次の變更が加へられたときにクリアされます。强制的に undo 情報をクリアしたいときは次のコマンドを使つてください:
:let old_undolevels = &undolevels :set undolevels=-1 :exe "normal a \<BS>\<Esc>" :let &undolevels = old_undolevels :unlet old_undolevels
バッファのマーク (’a から ’z) はテキストと同樣に記錄、復元されます。
すべての變更を undo したとき、バッファは變更ありとはみなされません。その狀態からは ":q" (":q!" ではなく) で Vim を終了できます。
{Vi にはない}
Note:
これはいつファイルを保存したかに關係します。":w" の後で "u" を實行すると、保存したときから見てバッファは變更された狀態なので、バッファは變更ありと認識されます。
マニュアル設定の折り疊み (|folding|) を使つてゐるとき、折り疊みは記錄も復元もされません。變更が折り疊みの中だけで行はれた場合のみ (折り疊みの最初と最後の行が變はらないので) 折り疊みは維持されます。
番號レジスタを使つて削除を元に戾すこともできます。テキストを削除すると、それは "1 レジスタに記錄されます。元々 "1 にあつたものは "2 にシフトされ、他の番號レジスタも同樣にシフトされます。"9 レジスタの內容は失はれます。
そして、プットコマンド ’"1P’ を使つて削除されたテキストを元に戾すことができます。(削除やコピーの操作をした後ならテキストは無名レジスタに入つてゐるので ’P’ や ’p’ でも元に戾せます)。3 回前に削除されたテキストなら ’"3P’ で戾せます。
數回に分けて削除されたテキストを戾したい場合は、"." コマンドの特殊な機能が役に立ちます。"." コマンドは使用されたレジスタの番號を增加させます。例へば、""1P" を實行した後で "." を押すと ’"2P’ が實行されます。さらに "." を押していくとすべての番號レジスタが插入されます。
例: ’dd....’ でテキストを削除したら ’"1P....’ で元に戾せる。
削除されたテキストがどのレジスタに記錄されてゐるかわからないときは :display
コマンドで確認できます。あるいは、’"1P’ を實行してみて、もしそれが違ふものなら ’u.’ を實行します。’u.’ は最初にプットされたテキストを削除し、2 番目のレジスタを使つてプットコマンドを實行します。目的のものが出るまで ’u.’ を繰り返してください。