Zaten kurtardığım Vim takas dosyalarını silmenin en kolay yolu nedir?


84

Bazen Vim çöker ve bana bir takas dosyası bırakır. Bu harika. Sonra düzenlemekte olduğum dosyayı açtım ve Vim kurtarma isteyip istemediğimi sordu. Yaptım, teşekkürler. Tamamlandığında, Vim bana,

You may want to delete the .swp file now.

Neden, evet yapıyorum. Bunu nasıl yaparım? Eski takas dosyasını tekrar takas dosyası olarak kullanmaya başlayacağını ve bıraktığımda temizleyeceğini düşündüm, ama bu doğru değil. Yeni bir tane oluşturur, onu temizler ve dosyayı tekrar açtığımda, birinciden kurtarmamı ister.

Elbette bir şeyleri özlüyorum.


Buraya bakın vi.stackexchange.com/questions/13518/… "Vim işlemi hala devam ediyorsa" Sil "seçeneğinin görüntülenmiyor" olduğunu ve TMUX oturumlarının yeniden yorumlandığını unutmayın; (ayrıca, GNU ekranı) arka planda bir yerde, bkz. vi.stackexchange.com/questions/13518/…
zenaan

Yanıtlar:


81

Biraz daha basit bir yol:

Terminal emülatöründen:

vim filename

Ardından kurtarmayı seçin ve takas alanını silmek istiyorsanız yazdığınız (kaydet) ve bunu vim içinden yapın:

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

... ve bu sefer sil'i seçin .

Bunu daha yeni öğrendim ve bundan sonra yapacağımı düşünüyorum. O zaman, kurtarma bozulduysa (daha önce hiç denememiş olmama rağmen), çalışan bir dosyanın üzerine yanlışlıkla yazmayacağım.

Bu soruya Yığın Taşması (bu ipucunu bulduğum yer) ile ilgili de ipuçları var .


16
Bir deleteseçenek yok, sadece var: [O] kalemi (E) dit (R) ecover (Q) uit (A) bort, ne yapmalıyım?
Arne

4
@Arne: Deneyimlerime göre bu genellikle dosyanın şu anda başka bir vim örneğinde açıldığı anlamına mı geliyor?
miyalys

1
[D] elete seçeneği sadece Vim 7.4’e güncelledikten sonra belirdi
jmlarson

@Arne Aynı sorunu vardı. Fakat bir süre sonra, bir saat kadar sonra, tekrar başlattım ve seçenek mevcuttu. PC o zaman yeniden başlatılmadı. vim, başka bir vim işleminin çalıştığını düşünebilir. Bu yüzden seçeneği göstermiyor.
ka3ak

6
Bir (D)eleteseçenek görmediklerini söyleyenler için bkz :help swap-exists; alıntı On Unix this choice is only offered when the process that created the swap file does not appear to be running.diğer bir deyişle, bu seçeneğin gizlenmesine neden olan başka bir vim işleminiz var. Ayrıca, neden bir swpdosyaya sahip olduğunuzu da açıklayabilir !
Lqueryvg

39

Bir dizindeki TÜM vim Takas Dosyalarını temizlemek için:

Eğer bir dizin ağacındaki herhangi vim takas dosyaları gerekmez emin ve bunlardan kurtulmak istiyorsanız vim iken dizinde aşağıdaki komutu kullanabilirsiniz değil çalışmıyor bile başka bir pencerede veya hatta başka bir giriş ( oturum, toplantı, celse):

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

Bazı ilham ve düşünceler Google Grupları'ndaki gereksiz .swp dosyalarını kaldırmaktan geldi . Bu isimleri ile biten tüm dosyaları siler .swk, .swl, .swm, .swn, .swo, veya .swp geçerli dizin ağacında.

Bu, birkaç nedenden ötürü istediğiniz şey olmayabilir:

  • Belirtildiği gibi, geçerli dizin ağacını arar  ; yani, geçerli dizin ve tüm alt dizinler, tekrarlı olarak Bu, sorunun ne istediğinin ötesine geçer ve fazla önemsenmiş sayılabilir.
  • Belirtildiği gibi, bu isimleri ile biten tüm dosyaları siler .swk, .swl, .swm, .swn, .swo, veya .swp, ve sadece .swpGary Johnson diyor ki :

    Ayrıca, takas dosyalarının tümü .swp ile bitmez. Vim'in bir takas dosyası oluşturması gerekiyorsa ve .swp ile biten bir dosya zaten varsa, Vim yenisi için .swo uzantısını ve bundan sonra .swn'yi kullanır. Ben sadece alfabe ile geriye doğru devam ediyor düşünüyorum. Yani gibi bir şey kullanarak

      \*.sw[nop] 
    

    ya da

      \*.sw? 
    

    daha kapsamlı olurdu.

    Asıl yazar bu yazı diyor

    'klmnop' fazladan olabilir, ancak bu genellikle hepsini almamı sağlar.

  • Öte yandan, underkill olabilir.  Rublesi önerir

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

    hangi arasında değişen tüm (küçük harfle) üç harfli uzantıları maçları .saaiçin .swp. “Bu daha eksiksiz bir çözüm olsa da, .svg görüntü dosyalarını ve .swf adobe flash dosyalarını alacaktır, ancak dikkatli olun. Eğer bu dosyalarla çalışıyorsanız regex değiştirmek isteyebilirsiniz.”Aynı zamanda maçları .sav, .snd(ses verisi), .sql, .src, .srt(SubRip video altyazı formatı) ve diğer birçok ortak uzantıları.

  • Overkill olabilir. Belirtildiği gibi, bu isimleri ile biten tüm dosyaları siler .swk, .swl, .swm, .swn, .swo, veya .swp. Ancak, görünüşe göre, vim takas dosyaları genellikle "nokta" dosyalardır. Düzenlerseniz hello.cpp, takas dosyası olabilir .hello.cpp.swp. Ruble'nin cevabında gösterildiği gibi (ancak açıklanmadı), sadece isimleri nokta ile başlayan dosyaları silmek daha güvenlidir; örneğin

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

14

ls -aDizindeki TÜM dosyaları listeleyen tür

yazın rm .whatever.your.swpveenter

Bu kadar basit.

.Önünde gösterilen herhangi bir dosya gizli bir dosyadır ve normalde görülmez.

Değişikliklerin derhal ve kalıcı olduğunu unutmayın, bu yüzden dikkatli olun.


4
Bu çok basit değil. Vim'den ayrılmalı, takas dizininde dolaşmalı, dosyanın adını hatırlamalı ve muhtemelen file.swpya da olmasına karar vermeliyim file.swo. O zaman bulunduğum yere geri dönmeliyim. Vurmak :eçok daha basit bir çözümdür.
Peeja

1
ls: cannot access +A: No such file or directory
Jonathan

ihtiyacım olan şey bu
user5510975

7

Btw. bazı eklentiler bunu sizin için otomatik olarak yapar: autoswap.vim

açıklamadan:

  1. Dosya başka bir pencerede başka bir Vim oturumunda zaten açık mı?
  2. Öyleyse, bu dosyayı düzenlediğimiz pencereye geçin.
  3. Aksi takdirde, takas dosyası dosyanın kendisinden daha eskiyse, ondan kurtulun.
  4. Aksi takdirde, salt okunur dosyayı açın, böylece bir göz atabilir ve kaydedebiliriz.

6
Birisi bana vim'in neden eklentiler olmadan varsayılan olarak mantıklı bir davranışı olamayacağını söyleyebilir mi?
Pavel Šimerda

6

Hayır, AFAIK hiçbir şey kaçırmıyorsun. Vimaçıkça silinene kadar takas dosyasını bir yedek olarak tutmaya devam eder.

Sadece kaydedin ve çıkın ve aynı dosyayı tekrar açın. Sizden tekrar istenir

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

Şimdi sadece basın d:)


11
Gerçekten mi? Yani bunu biliyordum. Ama bu aptalca. Kesinlikle "basit" değil.
Peeja

1
Bu arada, istifa ve iptal arasındaki fark nedir?
trusktr

5
benim durumumda Sil seçeneği yoktur. ne yapmalıyım? (Kurtardım, istifa ettim ve yeniden açtım)
Paschalis

Önce vim'den çıkmanıza gerek yok, sadece şunu yazın: e <return>, dosya üzerinde "yine de düzenle" veya "recover" ı seçtikten sonra, dosyayı silme seçeneğini elde edin
00prometheus

2

Vim, çoğu Unix komutunda olduğu gibi, varsaymak ve ima etmek yerine basit ve açıktır.

(R) ile kurtarırsınız. Kurtarma işleminden hoşlanmıyorsanız veya kurtarma işlemi bozuksa, onu atabilirsiniz. İsterseniz dosyayı kaydedebilirsiniz. Kurtarma dosyası sizin için silinmedi çünkü bu açık değil ve durumların% 100'ü için doğru olmayacak.

Böylece (r), ecover, (w) rite ve (q) uit yaparsınız, sonra tekrar düzenleyin ve (d) elete veya "rm .myfile.js.swp" yi seçin ve tekrar düzenleyin. Bunu yapmak hızlı ve her zaman Vim'in bakış açısından% 100 doğru davranış.


Tamam, o zaman takas dosyasının yolunu bana vermesi için vim almanın bir yolu var mı? Takas dosyasını silmek için ikinci bir komut çalıştırdığım için mutluyum (aslında bunun açıklığını seviyorum), ancak takas dosyasının olduğu her yerde silmek için bir komut istiyorum. Mesela ayrı bir takas dizinim var. İki açık dosyanın aynı temel adı varsa, programlı olarak geçerli arabellek için hangisinin takas dosyası olduğuna karar veremem.
Peeja

1
Doğru, ancak basit bir "Kurtar ve sil" seçeneği sunmak iyi olurdu. Muhtemelen Tom'un uygulaması kolaydır. Eğer daha önce yapılmadıysa, okula gitmeyi bitirdiğimde bir gün yapacağım.
trusktr

1
Çoğu unix komutu basit, açık ve mantıklı bir varsayılan davranışa sahiptir. Vim kurtarma basit değil, UX LibreOffice'deki kadar kötü, davranışlar açık ve yanlış, çoğu durumda veri kaybı.
Pavel Šimerda

1

Bu dosyalar benim için de can sıkıcıydı, ama ben set noswapfile vim oluşturmak ve bunun yerine dosyaları bellekte tutmak için -.


OP’ye göre, takas dosyaları kullanışlıdır, bu nedenle bunları kapatmak en iyi seçenek olmayabilir.
Kusalananda

Takas dosyalarını kapatmayın. Makineniz çökerse işinizi kaybedersiniz.
Lqueryvg

Tabii ki bu seçenek riskleri de beraberinde getiriyor ve bu takas dosyalarının vi * editörlerinin ortaya çıkmasında çok sık meydana geldiklerinde ortaya çıktığını biliyorum. Şimdi vim'in istikrarlı çalıştığını ve eski bir şey olduklarını söyleyebilirim, yani.
Dmitrii

1

Github'ın Vim için kendi gitignore dosyasını temel alan tüm vim takas dosyalarını temizlemek için daha eksiksiz bir regex

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

Ancak bu daha eksiksiz bir çözüm olsa da, .svg görüntü dosyalarını ve .swf adobe flash dosyalarını alacaktır. Bu dosyalarla çalışıyorsanız, regex'i değiştirmek isteyebilirsiniz.


1

İşte eklemek için bir snippet .vimrc. Geçerli dosya arabelleğiyle ilişkilendirilmiş tüm takas dosyalarını siler ve takas uzantısını sıfırlar.

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()

Bir çıkmazla karşılaştığında, biri çalıştırılabilir. :DeleteFileSwaps Bu, komutlarla :windoveya :tabdokomutlarla birleştirildiğinde harikadır .

:tabdo DeleteFileSwaps 

Diğer ayrıntılar : Bir dosyada 1'den fazla takas dosyası bulunabilir. Bunun nedeni takas dosyasının uzantısı ile birlikte .swphala var ve vimbu nedenle de yenilerini yaratmaya devam edecek. Var olup olmadığını bulmak için .swp:

  • Hedef dosya vim açıkken :swmevcut takas dosyasını almak için çalıştır .
  • Geçerli takas dosyasının bulunduğu dizini kontrol edin.
  • Ardından, dizinin açık dosyanın adı ile bir takas dosyası içerip içermediğini ve bunun bir uzantısı olup olmadığını kontrol edin .swp.

Yukarıdaki kod parçası aynı işlemi izler, ancak tüm takas dosyalarını kaldırın.

Bu yardımcı olur umarım.


0

Kılavuzdan :h swap:

Bu komutla kullanılan mevcut takas dosyasının adını görebilirsiniz: :sw[apname]


Uyarı ... muhtemelen silmeniz gereken dosyanın adı değildir. .swpDosyayı silene kadar , :swkomut muhtemelen .swodosyanın adını verecektir - bu silmek istediğiniz şey değildir .
Lqueryvg

0

Sizden istenirse, Dgeçerli dosyanın takas dosyasını silmek için düğmesine basın .

eğer değilseniz o zaman manuel olarak yapmanız gerekir.

Bunu yapmanın alternatif bir yolu:

Dosyayı bulmak / aramak için:

find | grep ".searchRefineVertTabs.jsp.swp"

ve sonra bu dosyayı silin:

rm ./.searchRefineVertTabs.jsp.swp

1
Ben am istedi, ama benim seçim etmektir kurtarmak . Sorun , artık iyileştiğimden hemen sonra nasıl silineceğidir . Benim için bunu yapmamak bir vim'in başarısızlığına benziyor. Ancak kabul edilen cevap, şu ana kadar bulduğum en temiz iş akışı.
Peeja

-1

Kullanabilirsiniz,

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

Örnek:

rm -f .rc.local.swp

Bu teknik olarak çalışır, ancak mevcut kabul edilen yanıtta hiçbir yere yakın değildir.
Peeja

Ayrıca <ext>burada gereksiz bir dosya adı olduğundan dolayı en azından Linux'ta sıfır veya daha fazla uzantı var.
Pavel Šimerda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.