किसी फ़ाइल को कैसे सहेजा जाए जिसके लिए मेरे पास कोई लिखने की अनुमति नहीं है?


26

कभी-कभी ऐसा होता है कि मैं एक फ़ाइल खोलता हूं और बिना किसी सूचना या [read-only]स्टेटस लाइन (यानी कुछ रैंडम /etcकॉन्फिग्रेशन फाइल जैसे /etc/resolv.conf) को नोटिफाई करने के लिए या "भूल" के बिना अपने उपयोगकर्ता के रूप में कुछ संशोधन करता हूं ।

:w!इस मामले में स्पष्ट रूप से विफल रहता है क्योंकि मेरे उपयोगकर्ता की वैसे भी कोई लिखित अनुमति नहीं है। इसलिए मुझे :w /home/filenameबाहर निकलना होगा और sudo mv ...बहुत असहज होना पड़ेगा ।

क्या कोई ऐसा तरीका है जिससे मैं वर्तमान में खोली गई फ़ाइल को सहेजने में सक्षम होने के लिए अस्थायी रूप से जड़ तक बढ़ जाऊं? (दिया मैं sudoersया में हूँ / और मैं suसीधे कर सकते हैं)?

जवाबों:


24

चाल के लिए एक बाहरी कॉल का उपयोग करना है sudo:

:w !sudo tee %

यह कैसे काम करता है:

  • :w !<command>स्टड <command>के रूप में बफर की सामग्री के साथ निष्पादित करता है ।
  • teeडुप्लिकेट को एक फ़ाइल & stdout में डुप्लिकेट करता है; %मौजूदा फ़ाइल नाम के लिए विस्तारित ..
  • आप इसे sudoरूट अनुमतियों के लिए उपसर्ग करते हैं ।

आप वास्तव में फ़ाइल को विम के साथ नहीं सहेज रहे हैं , बल्कि, आप जिस बाह्य फ़ाइल को संपादित कर रहे हैं उसकी सामग्री को अधिलेखित करने के लिए एक बाहरी कार्यक्रम को बुला रहे हैं। यही कारण है कि आपको विम से चेतावनी मिलेगी:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

आप इसे एक समारोह में बदल सकते हैं:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

और कीबाइंड:

nnoremap <Leader>w! :call SuperWrite()<CR>

साथ su, केवल रूट उपयोगकर्ता उपयोग कर सकते हैं -cतुरंत एक आदेश पर अमल करने के लिए। मुझे नहीं लगता कि आप ऐसा करने के suलिए उपयोग कर सकते हैं , लेकिन शायद एक चाल है जिससे मैं अनजान हूं ...


SuperWriteकाम करता है, लेकिन यह आप पर फ़ाइल वापस गूँजती है। यह चल रहा है :silently आप अदृश्य रूप से अपना पासवर्ड दर्ज किया है।
टैंकरस्मैश

@TankorSmash धन्यवाद; अद्यतन उत्तर। यकीन नहीं है कि आप "अदृश्य रूप से अपना पासवर्ड दर्ज करें" के साथ क्या मतलब है, हालांकि? जोड़ना silentठीक काम करने लगता है?
मार्टिन टूरनोइज

मैं sudo के साथ vim नहीं चलाता, ताकि यहां पर खेल हो सके, लेकिन जब मैं sudo को फ़ाइल को जाता हूं, तो यह मुझे sudo पासवर्ड के लिए संकेत देता है। यदि इसकी खामोशी है, तो मुझे संकेत नहीं दिख रहा है, लेकिन फिर भी पासवर्ड दर्ज करने की आवश्यकता है।
टैंकरस्मैश

1
आप जो देख रहे हैं, वह टी-टू-स्टेपआउट के साथ-साथ दी गई फ़ाइल को गूँजने की मानक कार्यक्षमता है। एक समाधान के लिए stdout / dev / null को रीडायरेक्ट करना है, a la: w ! tee % > /dev/null यह अभी भी कमांड के परिणाम (एक लाइन) को प्रतिध्वनित करेगा, लेकिन संपूर्ण बफर सामग्री को नहीं।
जॉन कार्टर

उपयोग करने के बजाय teeइसके उत्पादन को फेंकने से, catअगर आप फ़ाइल को प्रिंट नहीं करना चाहते हैं तो भी काम नहीं करेगा ?
लेयन रेयान

12

मैं अपने .vimrc में निम्नलिखित मैपिंग का उपयोग करता हूं, जो मुझे उपयोगी लगता है:

cnoremap w!! w !sudo tee %

यह याद रखना आसान है, क्योंकि w"लिखना," w!"बल लिखना " है, और w!!"सुपर-डुपर-बल लिखना" है। : पी


1
मैंने लंबे समय से इसे मैप किया था W, लेकिन w!!बहुत अधिक समझ में आता है, मेरे .vimrc को अपडेट करेगा। धन्यवाद
jalanb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.