Vimの永続的な取り消しを使用しますか?


96

Vim 7.3の新機能の1つは「永続的な取り消し」です。これにより、バッファーを終了するときに、取り消しツリーをファイルに保存できます。

残念ながら、これを適切に有効にすることができなかったか、間違って使用しているに違いありません。これが私がこれまでに試したことです:

以下を〜/ .vimrcに追加しました

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

この後、ファイルを開いて編集し、保存して閉じることができるはずです。もう一度開くと、元に戻せないように元に戻したりやり直したりできるはずです。残念ながら、これは当てはまりません。元に戻すファイルが書き込まれることはないからです。

ノート:

  1. 私は、Vim without CreamプロジェクトのVim 7.3を使用してWin 7を使用しています。永続的な取り消しは組み込まれています。

  2. $ HOME / .vim / undoがファイルシステムに存在する


38
強調しておくと、ポイント2)は非常に重要です。Vimはあなたに代わってディレクトリを作成せず、永続的な取り消しはあなたまでは機能しませんmkdir ~/.vim/undo
puk

2
+1。申し訳ありませんが、Linuxでは動作します...教えてくれてありがとう!
Ciro Santilli郝海东冠状病六四事件法轮功

この質問への将来の訪問者のためにします。Do NOT undodirの値を引用符で囲み!私はしばらくの間この問題に悩まされていました-引用符なしで絶対パスを使用してください。
naiveai 2018年

回答:


51

これをに入れて、存在しない場合は.vimrc作成し、undodir永続的な取り消しを有効にします。WindowsとLinuxの両方でテストされています。

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
これは、ディレクトリを作成するために好ましいかもしれない::silent call system('mkdir -p ' . &undodir)
カイルストランド

1
私が使用して&Iためではなく、ティンそれ。(私の心では、Vimscriptの多くの、多くの、多くの、気が遠くなるような恐ろしい "機能"の1つですが、YMMVです。)setundodirletletset
Kyle Strand

1
カイルのおかげで、.vim存在しない場合は作成することをお勧めします。残念ながらこの-pフラグはWindowsには存在しないmkdirため、Windowsとの互換性を確保するために、2回呼び出すように回答を編集しました。
Matthias Braun

2
ああ。-pフラグを使用する主な理由は、実際には、ディレクトリが存在する場合のエラーを回避するためです。if has('win32')ブロック内にコマンドがあるので、Windows mkdirなし-pで使用します。
カイルストランド

4
なぜ使用しないのmkdir()ですか?次にcall mkdir(myUndoDir, 'p')、これは次のようになりmkdir -pます。、のように動作します。
nelstrom 2017年

8

私は_gvimrcでこれを試しました:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

try-catchブラケットを削除すると、宣伝どおりに機能し始めました。

" Persistent undo
set undodir=C:\vim\undodir
set undofile

ディレクトリを作成する必要がありました。


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif"コメント付きメッセージを追加してメッセージの長さを増やす
Arelav

3

$ HOMEが宣伝どおりに機能しないと思います。

私のシステムでは、:echo $HOMEHを示しています\、しかし、: e $HOME/言う:~/無効なファイル名を。

あなたはそれがそれを治すかどうかを確認するために絶対パスで試すことができます


|:echo $ HOME | および|:e $ HOME / | 問題なく、とにかく物事を変えてみました。それは時々機能するようで、他では機能しないようでした。特に、〜/ .vimrcファイルを編集しているときにバックアップが保存されることはありません。
ダックワースド、2011

Windows 7ではを使用してい$TEMPます。私がset undodir?それを見るとき、それは示します~/AppData/Local/Temp。元に戻すファイルは永続化され、正しくロードされます。多分$TEMPもっと信頼できるでしょうか?
slawek 2013

1

これは期待どおりfile.txtに機能します。Windows7のVim 7.4バッファーで開いて:setlocal undofileから、変更をバッファーに保存すると、「undodir =」.file.txt.un~:set undodir?報告されるため、元に戻すファイルが一緒に作成されます。デフォルト-つまり、手動で指定する必要はありません。:set undofileモードラインでもできます。

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