VIM के साथ नई फ़ाइल लिखते समय अनुमतियाँ बिट्स बनाए रखें


8

विम में, जब मैं वर्तमान बफर की एक कॉपी का उपयोग करते हुए एक नई फ़ाइल में लिखता हूं, तो :w [filename]ऐसा प्रतीत होता है कि विम नई फ़ाइल के लिए डिफ़ॉल्ट (यानी umask द्वारा सेट या जो भी) फ़ाइल अनुमतियों का उपयोग करता है। यदि मौजूदा बफर को एक मौजूदा फ़ाइल से लोड किया गया था, हालांकि, उस फ़ाइल से अनुमतियों की नकल करने के लिए "सही" व्यवहार नहीं होना चाहिए ? उदाहरण के लिए, यदि मैं एक निष्पादन योग्य फ़ाइल को संपादित कर रहा हूं, और मैं फ़ाइल की एक नई प्रतिलिपि लिखता हूं, तो विम एक नया निष्पादन योग्य क्यों नहीं लिखता है ? क्या कोई तरीका है विम को मजबूर करने का कि मैं जिस तरह का वर्णन कर रहा हूं, उसे करने के अलावा, ! chmod --reference % [newfilename]नई फ़ाइल लिखने के बाद कुछ करने जैसा है ?


संभवतः संबंधित: unix.stackexchange.com/q/58880/22703
allquixotic

मुझे लगता है कि जवाब पहले से ही सवाल में है - आपको एक मैक्रो या कीबाइंडिंग करना चाहिए जो आपके chmodलिए करता है । AFAIK, vim में यह बिल्ट नहीं है।
केविन पेंको

जवाबों:


3

आप ऐसा कुछ कर सकते हैं। सबसे पहले, मूल फ़ाइल का नाम कैप्चर करें।

au BufRead * let b:oldfile = expand("<afile>")

फिर, जब आप नई फ़ाइल को सहेजते हैं, तो इसकी अनुमतियों को मूल फ़ाइल के समान ही बदल दें।

au BufWritePost * if exists("b:oldfile") | let b:newfile = expand("<afile>") | if b:newfile != b:oldfile | echo system("chmod --reference=".b:oldfile." ".b:newfile) | endif |endif

बस उन दोनों ऑटोकॉम्ड को अपने ~ / .vimrc में डालें।


यह उत्तर भयानक है, लेकिन मेरे पास एक सुझाव है: echo system(आदि को बदलने के लिए silent echo system(। यह "प्रेस एंटर टू कंटिन्यू" हैंग से बचा जाता है।
काइल स्ट्रैंड

@KyleStrand: मैं call system(...प्रदर्शन के लिए कुछ भी प्रिंट करने से बचने के लिए इस्तेमाल कर सकता था, लेकिन मैं चुपचाप असफल होने की कमांड की समस्या से बचने की कोशिश कर रहा था। यदि आपको नहीं लगता कि यह कभी विफल होगा, या कभी-कभी pesky के बजाय सामयिक विफलता के साथ रहेगा Press ENTER..., तो मैं आपके सुझाव से सहमत हूं। मुझे लगता है कि एक बेहतर समाधान, हालांकि, एक फ़ंक्शन लिखना होगा जो सिस्टम के आउटपुट () को कैप्चर करता है और इसे केवल तभी खाली करता है जब यह खाली न हो। मैंने प्लगइन्स में किया है और यह बहुत अच्छी तरह से काम करता है।
गैरीजोन

काफी उचित। मैं विम्स्क्रिप्ट को बिल्कुल भी अच्छी तरह से नहीं समझता, इसलिए मैं सिर्फ यह देखने के लिए "चुप" रह गया कि क्या यह काम करेगा, और जब यह ठीक लगने लगा तो मैंने अपने .vimrc को उसी तरह छोड़ दिया। मैं निश्चित रूप से लगातार विफलता को पसंद करूंगा Press ENTER,, हालांकि, मुझे लगता है कि मैं या तो साथ रहूंगा silentया उपयोग करूंगा call। सुझाव के लिए फिर से धन्यवाद!
काइल स्ट्रैंड

0

सुनिश्चित करें कि फ़ाइल में कोई सहेजे नहीं गए परिवर्तन हैं और फिर cpप्रतिलिपि बनाने के लिए उपयोग करें। यह मूल के रूप में एक ही अनुमति के साथ एक प्रति में परिणाम होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.