विम स्वैप को हटाने का सबसे आसान तरीका क्या है जो मैंने पहले से ही पुनर्प्राप्त किया है?


84

कभी-कभी विम दुर्घटनाग्रस्त हो जाता है और मुझे एक स्वैपफिल छोड़ देता है। वह तो कमाल है। फिर मैं जिस फ़ाइल को संपादित कर रहा था, उसे खोल देता हूँ और विम मुझसे पूछता है कि क्या मैं ठीक होना चाहता हूँ। मैं करता हूं, धन्यवाद। जब यह हो गया, विम ने मुझे बताया,

You may want to delete the .swp file now.

क्यों, हां, मैं करता हूं। मैं उसको कैसे करू? मुझे लगा कि यह पुराने स्वैफाइल को स्वैफाइल के रूप में फिर से उपयोग करना शुरू कर देगा और जब मैं छोड़ दूंगा, तब इसे साफ कर दूंगा, लेकिन यह सच है। यह एक नया बनाता है, उस एक को साफ करता है, और जब मैं फ़ाइल को फिर से खोलता हूं तो यह मुझे पहले वाले से पुनर्प्राप्त करने के लिए फिर से संकेत देता है।

निश्चित रूप से मुझे कुछ याद आ रहा है।


यहाँ देखें vi.stackexchange.com/questions/13518/… "" इसे हटाएं "विकल्प प्रदर्शित नहीं होता है यदि विम प्रक्रिया अभी भी चल रही है" और टिप्पणी फिर से TMUX सत्रों को नोट करें अर्थात सुनिश्चित करें कि आपके पास अभी भी नहीं चल रहा है (जीएनयू स्क्रीन भी) कहीं पृष्ठभूमि में, यहाँ देखें vi.stackexchange.com/questions/13518/…
zenaan

जवाबों:


81

थोड़ा सरल तरीका:

टर्मिनल एमुलेटर से:

vim filename

फिर पुनर्प्राप्ति का चयन करें , और यदि आप अपने द्वारा लिखे गए स्वैप को हटाना चाहते हैं (सहेजें) और फिर इसे vim से करें:

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

... और इस समय को हटाएं चुनें ।

मुझे अभी इस बारे में पता चला है, और मुझे लगता है कि मैं अभी से ऐसा करूँगा। तब मैं गलती से किसी कार्यशील फ़ाइल को अधिलेखित नहीं करूंगा, यदि रिकवरी भ्रष्ट हो गई (हालांकि मैंने पहले कभी कोशिश नहीं की है)।

स्टैक ओवरफ्लो (जहां मुझे यह टिप मिली) पर इस सवाल पर प्रासंगिक सुझाव दिए गए हैं।


16
मेरे पास कोई deleteविकल्प नहीं है , केवल यही है: [O] पेन (E) डिट (R) इकोवर (Q) uit (A) बोर्ट, मुझे क्या करना चाहिए?
अर्ने

4
@Arne: मेरे अनुभव से, आमतौर पर इसका मतलब है कि फ़ाइल वर्तमान में विम के दूसरे उदाहरण में खोली गई है?
मियालिस

1
[D] elete विकल्प केवल तब दिखाई दिया जब मैंने Vim 7.4
jmlarson

@ मेरे पास एक ही मुद्दा था। लेकिन कुछ समय बाद, एक या दो घंटे बाद, मैंने विम को फिर से शुरू किया और विकल्प उपलब्ध था। उस समय पीसी को पुनः आरंभ नहीं किया गया था। 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.Ie शायद आपके पास एक और विम प्रक्रिया चल रही है जो इस विकल्प को छिपा रही है। यह भी समझा सकता है कि आपके पास swpपहली जगह में फाइल क्यों है!
लेक्वेर्विग

39

एक निर्देशिका में सभी विम स्वैप फ़ाइलों को साफ करने के लिए:

यदि आप सुनिश्चित हैं कि आपको डायरेक्टरी ट्री में किसी 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 में समाप्त नहीं होती हैं। अगर विम को एक स्वैप फाइल बनाने की जरूरत है और एक .swp पहले से मौजूद है, तो विम नए के लिए एक्सटेंशन .swo का उपयोग करेगा और उसके बाद .swn करेगा। मुझे लगता है कि यह सिर्फ वर्णमाला के माध्यम से पीछे की ओर जारी है। तो कुछ का उपयोग कर की तरह

      \*.sw[nop] 
    

    या और भी

      \*.sw? 
    

    अधिक गहन होगा।

    इस पोस्ट के मूल लेखक कहते हैं,

    'klmnop' ओवरकिल हो सकता है, लेकिन आमतौर पर यह सुनिश्चित करता है कि मैं उन सभी को प्राप्त करूं।

  • दूसरी ओर, यह कम हो सकता है।  रूबल सुझाव देता है

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

    जो सभी (लोअर-केस) तीन-अक्षर के एक्सटेंशन से मेल खाता .saaहै .swp। वह कहते हैं, "हालांकि सावधान रहें, जबकि यह एक अधिक संपूर्ण समाधान है, यह किसी भी .svg छवि फ़ाइलों और .swf adobe फ़्लैश फ़ाइलों को निकाल लेगा। आप यह भी मेल खाता है तो आप उन फाइलों के साथ काम regex संशोधित करने के लिए चाहते हो सकता है। " .sav, .snd(ध्वनि डेटा), .sql, .src, .srt(सबरिप वीडियो उपशीर्षक प्रारूप), और कई अन्य आम एक्सटेंशन।

  • यह ओवरकिल हो सकता है। कहा गया है, यह जिनके नाम के साथ समाप्त सभी फाइलों को नष्ट करेगा .swk, .swl, .swm, .swn, .swo, या .swp। लेकिन, जाहिरा तौर पर, विम स्वैप फाइलें आमतौर पर "डॉट" फाइलें होती हैं। यदि आप संपादित करते हैं hello.cpp, तो स्वैप फ़ाइल हो सकती है .hello.cpp.swp। जैसा कि दिखाया गया है (लेकिन समझाया नहीं गया है) rouble के जवाब में , यह केवल उन फ़ाइलों को हटाने के लिए सुरक्षित है जिनके नाम डॉट के साथ शुरू होते हैं; जैसे, साथ

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

14

टाइप करें ls -aजो डायरेक्टरी की सभी फाइलों को सूचीबद्ध करता है

प्रकार rm .whatever.your.swpहै और दबाएँenter

यह इत्ना आसान है।

कोई भी फ़ाइल जो .सामने दिखती है, एक छिपी हुई फ़ाइल है और सामान्य रूप से नहीं देखी जाती है।

याद रखें कि परिवर्तन तत्काल और स्थायी हैं इसलिए सावधान रहें।


4
हालांकि यह बहुत सरल नहीं है। मुझे विम को छोड़ना है, स्वैप निर्देशिका को नेविगेट करना है, फ़ाइल का नाम याद रखना है, और संभवतः यह तय करना है कि यह है file.swpया नहीं file.swo। फिर मुझे वापस वहीं जाना है जहाँ मैं था। मारना :eबहुत सरल उपाय है।
पीजा

1
ls: cannot access +A: No such file or directory
जोनाथन

यह वही है जो मुझे चाहिए
user5510975

7

Btw। कुछ प्लगइन्स आपके लिए स्वचालित रूप से करते हैं: autoswap.vim

विवरण से:

  1. क्या फ़ाइल पहले से ही किसी अन्य विंडो में किसी अन्य विम सत्र में खुली है?
  2. यदि हां, तो उस विंडो पर स्वैप करें जहां हम उस फ़ाइल को संपादित कर रहे हैं।
  3. अन्यथा, यदि स्वैपफाइल फ़ाइल से पुराना है, तो इससे छुटकारा पाएं।
  4. अन्यथा, फ़ाइल को केवल पढ़ने के लिए खोलें ताकि हम इसे देख सकें और इसे सहेज सकें।

6
क्या कोई मुझे बता सकता है कि वाइम डिफ़ॉल्ट रूप से, प्लग इन के बिना समझदार व्यवहार क्यों नहीं कर सकता है?
पावेल Paमरदा

6

नहीं, AFAIK आप कुछ भी नहीं याद कर रहे हैं। Vimजब तक आप स्पष्ट रूप से इसे हटा नहीं देते तब तक स्वैप को बैकअप के रूप में जारी रखता है।

बस सहेजें और छोड़ दें और उसी फ़ाइल को फिर से खोलें। आपको (फिर से) संकेत दिया जाएगा

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

अब बस दबाएं d:)


11
वास्तव में? मेरा मतलब है, मुझे पता था कि। लेकिन यह बेवकूफी है। यह निश्चित रूप से "सरल" नहीं है।
पूजा

1
वैसे, छोड़ने और गर्भपात के बीच अंतर क्या है?
त्रिकूट

5
मेरे मामले में कोई डिलीट ऑप्शन नहीं है। मुझे क्या करना चाहिए? (मैंने बचाया, छोड़ दिया, और फिर से खोल दिया)
पासचलिस

आपको पहले वीम छोड़ने की जरूरत नहीं है, बस टाइप करें: ई <वापसी> एक बार जब आप फ़ाइल पर "वैसे भी संपादित करें" या "पुनर्प्राप्त करें" चुनते हैं, और आपको इसे हटाने का विकल्प मिलेगा
00prometheus

2

विम, अधिकांश यूनिक्स आदेशों की तरह, सरल और स्पष्ट है, बजाय अनुमान और निहित।

आप (आर) के साथ ठीक हो। यह आपको पुनर्प्राप्ति पसंद नहीं है या पुनर्प्राप्ति भ्रष्ट है, आप इसे त्याग सकते हैं। यदि आप इसे पसंद करते हैं, तो आप फ़ाइल को सहेज सकते हैं। पुनर्प्राप्ति फ़ाइल आपके लिए नहीं हटाई गई है क्योंकि यह स्पष्ट नहीं है और 100% स्थितियों के लिए सही नहीं होगी।

तो आप (r) ecover, (w) संस्कार और (q) uit, फिर या तो फिर से संपादित करें और चुनें (d) elete या "rm .myfile.js.swp" और फिर से संपादित करें। यह करने के लिए त्वरित है और हमेशा विम के दृष्टिकोण से, 100% सही व्यवहार है।


ठीक है, तो क्या मुझे स्वैप फ़ाइल का रास्ता देने के लिए विम पाने का कोई तरीका है? मैं स्वैपफाइल को हटाने के लिए एक दूसरी कमांड चलाने के लिए खुश हूं (वास्तव में, मुझे उस का गवाह पसंद है), लेकिन मैं जहां कहीं भी स्वैप को हटाने के लिए कमांड चाहता हूं। उदाहरण के लिए, मुझे एक अलग स्वैप निर्देशिका मिली है। यदि दो खुली फाइलों में एक ही बेसनेम है, तो मैं प्रोग्रामेटिक रूप से यह तय नहीं कर सकता कि वर्तमान बफर के लिए सही स्वैपफाइल क्या है।
पीजा

1
सच है, लेकिन एक सरल "पुनर्प्राप्त और हटाना" विकल्प प्रदान करना अच्छा होगा। यह भी शायद आसान टॉम कार्यान्वयन है। जब मैं स्कूल जाऊंगा तो किसी दिन यह करूंगा, अगर यह पहले से ही नहीं किया गया है।
त्रिकुटा

1
अधिकांश यूनिक्स कमांड सरल, स्पष्ट हैं और समझदार डिफ़ॉल्ट व्यवहार हैं। विम रिकवरी सरल नहीं है, यूएक्स लिबरऑफिस में उतना ही बुरा है, व्यवहार सरल गलत है और परिणाम, कई मामलों में, डेटा हानि है।
पावेल Paमरदा

1

ये फाइलें मेरे लिए भी कष्टप्रद थीं, लेकिन मैंने .vimrc में विकल्प सेट किया - set noswapfile vim बनाने के लिए इसे रोकने के लिए और इसके बजाय, फाइलों को स्मृति में रखते हुए।


ओपी के अनुसार, स्वैपफाइल्स उपयोगी होते हैं, इसलिए उन्हें बंद करना सबसे अच्छा विकल्प नहीं हो सकता है।
कुसलानंद

स्वैप फ़ाइलें बंद न करें। यदि आपकी मशीन दुर्घटनाग्रस्त हो जाती है, तो आप अपना काम खो देंगे।
लेक्वेर्विग

निश्चित रूप से यह विकल्प जोखिमों का तात्पर्य है, और जैसा कि मुझे पता है कि ये स्वैप फाइलें vi * editiors के उभरने के समय बनी थीं जब यह दुर्घटनाग्रस्त हो जाती हैं। अब मैं कह सकता हूँ कि विम स्थिर काम करता है और वे विरासत चीज़, इहो के रूप में मौजूद हैं।
दिमित्रि

1

यहाँ Vim के लिए Github की अपनी gignignore फ़ाइल के आधार पर सभी vim स्वैप फ़ाइलों को साफ़ करने के लिए एक अधिक पूर्ण regex है

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

हालांकि सावधान रहें, जबकि यह एक अधिक पूर्ण समाधान है, यह किसी भी .svg छवि फ़ाइलों और .swf एडोब फ़्लैश फ़ाइलों को बाहर निकाल देगा। यदि आप उन फ़ाइलों के साथ काम करते हैं, तो आप regex को संशोधित करना चाह सकते हैं।


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 

अधिक जानकारी : एक फ़ाइल में 1 से अधिक स्वैप फ़ाइल हो सकती है। इसका कारण यह है कि स्वैप फ़ाइल, के विस्तार के साथ .swp, अभी भी मौजूद है और vimइसकी वजह से नए बनाए रखेगा। यह पता लगाने के लिए कि क्या .swpमौजूद है:

  • विम में लक्ष्य फ़ाइल खुली होने के साथ, :swवर्तमान स्वैप फ़ाइल प्राप्त करने के लिए निष्पादित करें।
  • निर्देशिका की जाँच करें कि वर्तमान स्वैप फ़ाइल में निहित है।
  • फिर जाँच करें कि क्या निर्देशिका में खुली फ़ाइल के नाम के साथ एक स्वैप फ़ाइल है और इसका विस्तार है .swp

ऊपर स्निपेट एक ही प्रक्रिया का अनुसरण करता है, लेकिन सभी स्वैप फ़ाइलों को हटा दें।

उम्मीद है की यह मदद करेगा।


0

मैनुअल से :h swap:

आप वर्तमान स्वैप फ़ाइल का नाम कमांड के साथ उपयोग किया जा रहा है देख सकते हैं: :sw[apname]


चेतावनी ... शायद उस फ़ाइल का नाम नहीं है जिसे आपको हटाने की आवश्यकता है। जब तक आप .swpफ़ाइल को हटाते हैं, तब तक :swकमांड संभवतः आपको .swoफ़ाइल का नाम देगा - जो कि आप हटाना नहीं चाहते हैं।
लेक्वेर्विग

0

यदि आपसे पूछा जाए तो Dवर्तमान फ़ाइल की स्वैप फ़ाइल को हटाने के लिए दबाएँ ।

यदि आप नहीं हैं तो आपको इसे मैन्युअल रूप से करना होगा।

ऐसा करने का एक वैकल्पिक तरीका है:

फ़ाइल खोजने / खोजने के लिए:

find | grep ".searchRefineVertTabs.jsp.swp"

और फिर इस फ़ाइल को हटा दें:

rm ./.searchRefineVertTabs.jsp.swp

1
मैं कर रहा हूँ कहा, लेकिन मेरी पसंद है ठीक हो । सवाल यह है कि मैं ठीक होने के बाद इसे कैसे हटाऊं , क्योंकि यह अब जरूरी नहीं है। ऐसा लगता है कि मेरे लिए ऐसा नहीं करना विम की विफलता है। लेकिन स्वीकृत उत्तर मैं अब तक पाया गया सबसे साफ वर्कफ़्लो है।
पीजा

-1

आप उपयोग कर सकते हैं,

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

उदाहरण:

rm -f .rc.local.swp

यह तकनीकी रूप से काम करता है, लेकिन यह वर्तमान स्वीकृत उत्तर पर उतना आसान नहीं है।
पीजा

प्लस <ext>यहां बेमानी है क्योंकि कम से कम लिनक्स पर एक फ़ाइल नाम में शून्य या अधिक एक्सटेंशन शामिल हैं।
पावेल Paमेरर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.