swpファイルに保存されていない変更が含まれているかどうかを検出する方法


11

gvim(v.7.4.488)を使用してソースコードを編集するとき、vcsにいくつかの変更をコミットしたい(Ubuntu linuxのコマンドラインからgit 2.1.4を使用しています)。

git --status

変更したファイルを示します。ただし、.*.swp現在表示されているバッファーのvimも表示されます(ファイルに未保存の変更が含まれている場合、および編集されたファイルが.*.swp-file と同じ場合)。もちろん、gitはこれらのファイルを無視することも、vimがスワップファイルを別の場所に保存することもできます(vim.wikiaまたはstackoverflowのこの質問を参照)。しかし、保存.*.swpされgit --statusていない変更が含まれているときに-filesが表示されるのは気に入っています。これは、自分が思っているのとは異なる状態でファイルをコミットしていることを示しているからです。

保存したファイルが-file と同じ.*.swpであるgit --statusときに表示される-files の誤検知を回避し.*.swpながら、コミットするファイルがvimで編集しているものとは異なる状態であることを確認できますか?

  • .*.swpディスク上のファイルとvim内のファイルが異なる場合、-files のみを持つことは可能ですか?
  • 保存されていないファイルを検出する他の方法はありますか?

@elyashiv@VanLaserのコメントを組み合わせると、スワップファイルが未保存のファイルを意味するかどうかを検出するよりも簡単な方法になります。

  1. gitに。*。sw [po]ファイルを無視させないでください。
  2. コミット時に、ファイルがgit --status明らかになった場合はviで.*.sw[po]a :waを実行します。そして、
  3. 追加してコミットします。

1
:wa保存していないファイルがないことを確認するために使用できます。
elyashiv

2
実際には、すべてのファイルがあなたの前に確実に保存されるようにするのはかなり「賢明」ですgit commit...
VanLaser

回答:


8

vim -rコマンドラインで、現在のディレクトリと一時ディレクトリにあるすべてのスワップファイルと、保存されていない変更が含まれているかどうかを一覧表示します。と言う行を探しますmodified: no/YES

Vimに別のディレクトリを探すように指示する方法がわからないので、スワップファイルを含む各ディレクトリに移動してを実行する必要がありますvim -r。の出力を解析しgit statusたりfind -name '.*.sw[po]'、を使用したりvim -r、各ディレクトリで実行したりして、変更が保存されていないすべてのスワップファイルを表示するスクリプトを考え出すことができます。

(既にスワップファイルがあるファイルを編集すると、ファイルに加えてファイルが作成されることがあるので、の.*.sw[po]代わりに使用します。2つの既存のスワップファイルを含むファイルを編集すると、ファイルも作成できますが、私は野生でこれまで見たことがあります。あなたが本当に偏執的であるなら、あなたは使うことができますまたは単に。.*.swp.swo.swp.swn.*.sw[a-p].*.sw?

オプションの:help -r(少し)詳細情報-r、または:help recover.txtリカバリとスワップファイル名の詳細については、を参照してください。


1
まあ、Vimのスワップファイルは隠しファイル(.ファイル名の先頭)なので、正しいパターンになります.*.sw[a-p](ただし、病理学的なケースでは、実際にまで到達できます.foo.saa)。また、一致するFlashファイルも除外されるはずです。これらは通常、隠しファイルになるとは思えないからです。
jamessan

@jamessanシェルグロブでは先頭.が必要ですが*.swp、の引数として機能しますfind。しかし、リーディング.は物事をより単純にします。ありがとう!
Lithis

8
  • .*.swpディスク上のファイルとvim内のファイルが異なる場合、-files のみを持つことは可能ですか?

はい。以下のスニペット(tpopeのvimrcから変更)は、変更されていないバッファーのスワップファイルを無効にするため、変更されたファイルに対してのみスワップファイルが存在します。

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

警告:バッファが変更された場合にのみスワップファイルが存在するため、アドバイザリロックとしてのスワップファイルの使用は失われます。バッファーが変更されていない場合、別のVimは、既に開いていることに気付かずに編集を開始できます。最初のVimが変更を加える前に2番目のVimが保存する場合、ユーザーが保存を試みるか、何かがVimをトリガーしてファイルが変更されているかどうかを確認するまで、それらは通知されません。

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