すでに回復したVimスワップファイルを削除する最も簡単な方法は何ですか?


84

時々、Vimがクラッシュし、スワップファイルが残ることがあります。すごい。その後、編集していたファイルを開くと、Vimが回復するかどうかを尋ねてきます。ありがと。完了したら、Vimは私に言った、

You may want to delete the .swp file now.

なぜ、はい、そうです。それ、どうやったら出来るの?古いスワップファイルをスワップファイルとして再び使用し始め、終了時にクリーンアップするだけだと思いましたが、それは正しくありません。新しいファイルが作成され、そのファイルがクリーンアップされます。ファイルを再度開くと、最初のファイルから回復するように再度求められます。

きっと私は何かが欠けています。


こちらをご覧くださいvi.stackexchange.com/questions/13518/…「Vim プロセスがまだ実行中の場合、「Delete it」オプションは表示されません」。TMUXセッションのコメントに注意してください。つまり、Vimがまだ実行されていないことを確認してください(また、GNU画面)背景にどこか、ここを参照してくださいvi.stackexchange.com/questions/13518/...
zenaan

回答:


81

少し簡単な方法:

ターミナルエミュレータから:

vim filename

次にrecoverを選択、あなたが書いた(保存)スワップを削除したい場合、vim内からこれを行います:

:e          // no argument needed. It assumes the current buffer.

...そして今回は削除を選択します。

これについて知りましたが、これからやろうと思います。リカバリが破損していることが判明した場合、作業ファイルを誤って上書きすることはありません(以前に試したことはありませんが)。

Stack Overflow(このヒントを見つけた場所)でこの質問に関連するヒントもあります。


16
deleteオプションはありません。[O] pen(E)dit(R)ecover(Q)uit(A)bortのみです。どうすればよいですか?
アルネ

4
@Arne:私の経験から、それは通常、ファイルが現在vimの別のインスタンスで開かれていることを意味しますか?
miyalys

1
[D] eleteオプションは、Vim 7.4に更新した後にのみ表示されました
-jmlarson

@Arne私も同じ問題を抱えていました。しかし、しばらくしてから1時間ほどで、vimを再起動し、オプションが利用可能になりました。その時間にPCは再起動されませんでした。vimは、別のvimプロセスが実行されていると考える場合があります。そのため、オプションが表示されません。
ka3ak

6
(D)eleteオプションが表示されないと言う人は、を参照してください:help swap-exists。引用On Unix this choice is only offered when the process that created the swap file does not appear to be running.すなわち、おそらくあなたは、このオプションを非表示にする原因になっている他のVimのプロセスが実行されています。swpそもそもファイルがある理由を説明するかもしれません!
Lqueryvg

39

ディレクトリ内のすべてのvimスワップファイルを削除するには:

ディレクトリツリーにvimスワップファイルが不要で、それらを削除したい場合は、vimが実行されていないときにディレクトリで次のコマンドを使用できます(別のウィンドウや別のログインでも)セッション):

find . -type f -name "*.sw[klmnop]" -delete

いくつかのインスピレーションと考えは 、Googleグループでのジャンク.swpファイルの削除から来ました。これは、名前で終わるすべてのファイルを削除します.swk.swl.swm.swn.swo、または.swp 現在のディレクトリツリーインチ

いくつかの理由により、これはあなたが望むものではないかもしれません:

  • 前述のように、現在のディレクトリツリーを検索します  。つまり、再帰的に現在のディレクトリとすべてのサブディレクトリ。それは質問が求めるものを超えており、やり過ぎだと考えられるかもしれません。
  • 述べたように、それは名前で終わるすべてのファイルを削除します.swk.swl.swm.swn.swo、または.swp、だけではなく.swp。  ゲイリー・ジョンソンは言う

    また、すべてのスワップファイルが.swpで終わるわけではありません。Vimがスワップファイルを作成する必要があり、.swpで終わるファイルが既に存在する場合、Vimは新しいファイルに拡張子.swoを使用し、その後.swnを使用します。アルファベットを逆にたどっていくと思います。のようなものを使用して

      \*.sw[nop] 
    

    あるいは

      \*.sw? 
    

    より徹底的になります。

    この投稿 の元の著者は、

    「klmnop」はやり過ぎかもしれませんが、通常はそれらすべてを取得できます。

  • 一方で、それは不十分かもしれません。  ルーブルが 示唆する

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    からまでのすべての(小文字の)3文字の拡張子に一致.saa.swpます。さらに、「これはより完全なソリューションですが、.svgイメージファイルと.swf adobeフラッシュファイルをすべて削除することに注意してください。」あなたは、あなたがそれらのファイルを扱う場合には正規表現を変更したい場合があります。」それはまた一致する.sav.snd(音データ)、 、、 .sql (SubRipビデオ字幕フォーマット)、および他の多くの一般的な機能拡張。.src.srt

  • やり過ぎかもしれません。述べたように、それは名前で終わるすべてのファイルを削除します.swk.swl.swm.swn.swo、または.swp。しかし、明らかに、vimスワップファイルは一般に「ドット」ファイルです。編集するhello.cpp場合、スワップファイルは.hello.cpp.swprouble's answerに示されているように(説明されていません)、名前がドットで始まるファイルのみを削除する方が安全です。例えば、

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

ls -aディレクトリ内のすべてのファイルをリストするタイプ

タイプrm .whatever.your.swpは押しますenter

そのシンプル。

示す任意のファイル.正面には、隠しファイルであり、通常は見られません。

変更は即時かつ永続的なものであるため、注意してください。


4
ただし、これはそれほど単純ではありません。Vimを終了し、スワップディレクトリをナビゲートし、ファイルの名前を覚えて、場合によってはそれがであるかどうかを判断するfile.swp必要がありfile.swoます。それから私は私がいた場所に戻らなければなりません。打つこと:eははるかに簡単な解決策です。
ピージャ

1
ls: cannot access +A: No such file or directory
ジョナサン

これは私が必要なものです
-user5510975

7

ところで 一部のプラグインは自動的にそれを行います:autoswap.vim

説明から:

  1. 別のウィンドウの別のVimセッションでファイルが既に開いていますか?
  2. その場合、そのファイルを編集しているウィンドウに切り替えます。
  3. それ以外の場合、swapfileがファイル自体よりも古い場合は、単にそれを取り除きます。
  4. それ以外の場合は、ファイルを読み取り専用で開き、ファイルを確認して保存できるようにします。

6
なぜプラグインなしではvimがデフォルトで賢明な動作をすることができないのか誰にも教えてもらえますか?
パベルシメルダ

6

いいえ、あなたは何も見逃していません。Vim明示的に削除するまで、スワップファイルをバックアップとして保持し続けます。

同じファイルを保存して終了し、再度開くだけです。(もう一度)プロンプトが表示されます

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

今すぐ押してくださいd:)


11
本当に?つまり、私はそれを知っていました。しかし、それは愚かです。確かに「単純」ではありません。
ピージャ

1
ところで、終了と中止の違いは何ですか?
trusktr

5
私の場合、削除オプションはありません。私は何をすべきか?(私は、保存終了し、リニューアルオープン)
Paschalis

あなたは、ファイルに「とにかく編集」または「回復」を選択したら、<戻る>電子、そしてあなたはそれを削除するオプションを取得します:あなたは、最初だけのタイプをVimを終了する必要はありません
00prometheus

2

Vimは、ほとんどのUnixコマンドと同様に、暗黙的であると仮定するのではなく、単純で明示的です。

(r)で回復します。リカバリが気に入らない場合、またはリカバリが破損している場合は、破棄できます。気に入ったら、ファイルを保存できます。これは明示的ではなく、100%の状況では正しくないため、回復ファイルは削除されません。

したがって、(r)ecover、(w)rite、および(q)uitを選択してから、もう一度編集して(d)eleteまたは「rm .myfile.js.swp」を選択して、もう一度編集します。これは簡単に実行でき、Vimの観点からは常に100%正しい動作です。


さて、vimにスワップファイルへのパスを与える方法はありますか?スワップファイルを削除するために2番目のコマンドを実行できてうれしいです(実際、その明示性が気に入っています)が、どこにいてもスワップファイルを削除するコマンドが欲しいです。たとえば、私は別のswapfileディレクトリを持っています。2つの開いているファイルのベース名が同じである場合、プログラムで現在のバッファーの正しいスワップファイルを決定することはできません。
ピージャ

1
確かに、単純な「回復と削除」オプションを提供することは素晴らしいことです。また、おそらく簡単にトムを実装できます。まだ学校に行っていない場合は、いつか学校に行ったらやります。
trusktr

1
ほとんどのUNIXコマンドは、単純で明示的であり、賢明なデフォルト動作を備えています。Vimの回復は単純ではありません。UXはLibreOfficeと同じくらい悪いです。動作は明らかに間違っており、多くの場合、結果はデー​​タの損失です。
パベルシメルダ

1

これらのファイルは私にとっても迷惑でしたが、.vimrcでオプションを設定します-vimがset noswapfile 作成するのを防ぎ、代わりにファイルをメモリに保持します。


OPによれば、swapfilesは便利なので、それらをオフにすることは最良の選択肢ではないかもしれません。
クサラナンダ

スワップファイルをオフにしないでください。マシンがクラッシュすると、作業が失われます。
Lqueryvg

もちろん、このオプションはリスクを意味し、私が知っているように、これらのスワップファイルは、クラッシュが非常に頻繁に発生したvi *エディターの出現時に作成されたものです。今、私はvimが安定して動作し、レガシーのものとして存在すると言うことができます、imho。
ドミトリー

1

Vim用のGithub独自のgitignoreファイルに基づいてすべてのvimスワップファイルを消去するためのより完全な正規表現を次に示します。

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

ただし、これはより完全なソリューションですが、.svgイメージファイルと.swf adobeフラッシュファイルを削除することに注意してください。これらのファイルを使用する場合は、正規表現を変更できます。


1

追加するスニペットを次に示し.vimrcます。現在のファイルバッファに関連付けられているすべてのスワップファイルを削除し、スワップ拡張機能をリセットします。

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

苦境に遭遇すると、実行することができます:DeleteFileSwaps これは、:windoまたは:tabdoコマンドと組み合わせる場合に最適です。

:tabdo DeleteFileSwaps 

詳細:ファイルには、複数のスワップファイルを含めることができます。その理由は.swp、拡張子がのスワップファイルがまだ存在し、そのvimために新しいファイルを作成し続けるためです。.swp存在するかどうかを確認するには:

  • ターゲットファイルをvimで開いた状態で実行:swして、現在のスワップファイルを取得します。
  • 現在のスワップファイルが含まれているディレクトリを確認します。
  • 次に、ディレクトリに、開いているファイルの名前のスワップファイルが含まれ、拡張子がであるかどうかを確認します.swp

上記のスニペットは同じプロセスに従いますが、すべてのスワップファイルを削除します。

お役に立てれば。


0

マニュアルから:h swap

コマンドで使用されている現在のスワップファイルの名前を確認できます。 :sw[apname]


警告...これはおそらく削除する必要があるファイルの名前ではありません。.swpファイルを削除するまで、:swコマンドはおそらく.swoファイルの名前を提供します-これは削除したいものではありません
Lqueryvg

0

D現在のファイルのスワップファイルを削除するように求められたら、を押します。

そうでない場合は、手動で行う必要があります。

これを行う別の方法の1つは次のとおりです。

ファイルを検索/検索するには:

find | grep ".searchRefineVertTabs.jsp.swp"

そして、このファイルを削除します:

rm ./.searchRefineVertTabs.jsp.swp

1
尋ねられますが、私の選択は回復することです。問題はそれを削除する方法はありませんした後に、それはもはや必要なので、私が回復してきました。私のためにそれをしないvimの失敗のようです。しかし、受け入れられた答えは、私がこれまで見つけた最もクリーンなワークフローです。
ピージャ

-1

使用できます

rm -f .<filename>.<ext>.swp

例:

rm -f .rc.local.swp

これは技術的には機能しますが、現在受け入れられている答えほど簡単ではありません。
ピージャ

<ext>少なくともLinuxではファイル名にゼロ以上の拡張子が含まれるため、Plus は冗長です。
パベルシメルダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.