मैं Emacs का उपयोग करके किसी फ़ाइल के लिए रीड / राइट मोड को कैसे बदलूं?


126

यदि कोई फ़ाइल केवल मोड पढ़ने के लिए सेट की गई है, तो मैं इसे मोड लिखने के लिए कैसे बदलूं और इसके विपरीत Emacs से?

जवाबों:


178

एमएक्स टॉगल-रीड-ओनली

या Emacs के अधिक हाल के संस्करणों में

एमएक्स रीड-ओनली-मोड

मेरे विंडोज बॉक्स पर, जो एल्ट-एक्स के लिए सही त्वरित फ़ंक्शन को कॉल करने के लिए मेटा प्रॉम्प्ट और "टॉगल-रीड-ओनली" टाइप करने के लिए है।

यदि आप डिफ़ॉल्ट कीबोर्ड बाइंडिंग का उपयोग कर रहे हैं,

Cx Cq

(जिसे आप "कंट्रोल-एक्स कंट्रोल-क्यू" के रूप में जोर से पढ़ते हैं) का प्रभाव समान होगा। हालांकि, याद रखें कि एमएसीएस अनिवार्य रूप से असीम रूप से फिर से कॉन्फ़िगर करने योग्य है, आपका माइलेज अलग-अलग हो सकता है।

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

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


5
नमस्ते, जैसा कि jfm3 के उत्तर में कहा गया है, toggle-read-onlyकेवल फाइल की बफर की स्थिति को पढ़ता है। यदि आप फ़ाइल के उपयोग के मोड को बदलना चाहते हैं diredया chmod +wफ़ाइल पर शेल कमांड के रूप में निष्पादित करना चाहते हैं ।
danielpoe

सच है, यह है कि आप मोड कैसे बदलेंगे। हालाँकि, यदि आप एक बफ़र पर रीड-ओनली मोड को टॉगल करते हैं जो केवल पढ़ने वाली फ़ाइल पर इंगित करता है जो आपके पास है, तो आप इसे संपादित कर सकेंगे और अपने बदलाव लिख पाएंगे (निश्चित रूप से एक पुष्टिकरण प्रश्न होगा)।
बॉब क्रॉस

उपरोक्त टिप्पणियों पर अनुवर्ती और उत्तर में पाठ जोड़ा गया।
बॉब क्रॉस

5
Emacs के हाल के संस्करणों में, टॉगल-रीड-ओनली को रीड-ओनली-मोड से बदल दिया गया है।
बेन की

15

सुनिश्चित करें कि आप 'फ़ाइल' को 'बफर' के साथ भ्रमित नहीं कर रहे हैं। आप केवल-पढ़ने के लिए और C-x C-q( toggle-read-only) के साथ बफ़र सेट कर सकते हैं । यदि आपके पास पढ़ने की अनुमति है, लेकिन लिख नहीं है, तो एक फ़ाइल, जब आप फ़ाइल पर जाते हैं तो आपको जो बफर मिलता है ( C-x C-fया find-file) स्वचालित रूप से रीड-ओनली मोड में डाल दिया जाएगा। यदि आप फ़ाइल सिस्टम में फ़ाइल पर अनुमतियाँ बदलना चाहते हैं, तो संभवतः diredउस निर्देशिका पर शुरू करें जिसमें फ़ाइल शामिल है। बिंदी के लिए प्रलेखन जानकारी में पाया जा सकता है; C-h i (emacs)dired RET


inc। एक आदमी को मछली सिखाना ...
user234461

12

जो मैंने पाया है M-x set-file-modes filename mode

इसने मेरे विंडोज विस्टा बॉक्स पर काम किया। उदाहरण के लिए:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


मेरी राय में, यह पूछे गए सटीक प्रश्न का सही उत्तर है।
मथियास डाहल

1
इस प्रक्रिया में, यह काम किया है: (set-file-modes FILE 438)(जहां 438 दशमलव 2#0110110110या उसके बराबर है 666)।
कौशल मोदी

7

जैसा कि वहाँ किसी और ने उल्लेख किया है: एमएक्स टॉगल-रीड-ओनली काम करेगा।

हालाँकि, अब इसे हटा दिया गया है और Mx रीड-ओनली-मोड इसे करने का वर्तमान तरीका है, कि इसे Cx Cq की- बाइंडिंग के लिए सेट किया गया है ।



6

यदि केवल बफ़र (और फ़ाइल नहीं) केवल-पढ़ने के लिए है, तो आप उपयोग कर सकते हैं toggle-read-only, जो आमतौर पर बाध्य है C-x C-q

यदि फ़ाइल स्वयं ही पढ़ने के लिए है, हालाँकि, आपको निम्न फ़ंक्शन उपयोगी मिल सकता है:

(defun set-buffer-file-writable ()
  "Make the file shown in the current buffer writable.
Make the buffer writable as well."
  (interactive)
  (unix-output "chmod" "+w" (buffer-file-name))
  (toggle-read-only nil)
  (message (trim-right '(?\n) (unix-output "ls" "-l" (buffer-file-name)))))

फ़ंक्शन पर निर्भर करता है unix-outputऔर trim-right:

(defun unix-output (command &rest args)
  "Run a unix command and, if it returns 0, return the output as a string.
Otherwise, signal an error.  The error message is the first line of the output."
  (let ((output-buffer (generate-new-buffer "*stdout*")))
    (unwind-protect
     (let ((return-value (apply 'call-process command nil
                    output-buffer nil args)))
       (set-buffer output-buffer)
       (save-excursion 
         (unless (= return-value 0)
           (goto-char (point-min))
           (end-of-line)
           (if (= (point-min) (point))
           (error "Command failed: %s%s" command
              (with-output-to-string
                  (dolist (arg args)
                (princ " ")
                (princ arg))))
           (error "%s" (buffer-substring-no-properties (point-min) 
                                   (point)))))
         (buffer-substring-no-properties (point-min) (point-max))))
      (kill-buffer output-buffer))))

(defun trim-right (bag string &optional start end)
  (setq bag (if (eq bag t) '(?\  ?\n ?\t ?\v ?\r ?\f) bag)
    start (or start 0)
    end (or end (length string)))
  (while (and (> end 0)
          (member (aref string (1- end)) bag))
    (decf end))
  (substring string start end))

कार्यों को अपने में रखें ~/.emacs.el, उनका मूल्यांकन करें (या emacs को पुनरारंभ करें)। इसके बाद आप फ़ाइल को वर्तमान बफ़र में लिख सकते हैं M-x set-buffer-file-writable


जब मैं इस कोड के साथ अपने .emacs को संकलित करने का प्रयास करता हूं, तो मुझे संदेश मिलता है "चेतावनी: सेट-बफर द्वारा पराजित-बचाओ-भ्रमण"।
एलन

1
@ एलन, को set-bufferबाहर करने के लिए संपादित किया गया save-excursion
Vebjorn Ljosa

उस बदलाव के लिए धन्यवाद, जिसने चेतावनी को खत्म कर दिया। हालाँकि, वहाँ एक और है: "चेतावनी: समारोह पैकेज से` subseq 'रनटाइम पर बुलाया। " जब मैंने अपने .emacs को जोड़ा (eval-When-compile () cl)) की आवश्यकता होने पर भी मैं इससे छुटकारा नहीं पा सका।
एलन

इस धागे को देखें । मैंने कोड को संपादित किया है और अब के subseqसाथ बदल दिया है substring। कि चेतावनी से बचना चाहिए।
वेबजर्न लोजोसा 19

अब जब मैं 24 Emacs पर चला गया हूं, तो मुझे संदेश "चेतावनी: फ़ंक्शन 'डेफ' को परिभाषित करने के लिए नहीं जाना जाता है।"
एलन

3

यदि आप फ़ाइलों की निर्देशिका (dired) देख रहे हैं, तो आप Shift + Mफ़ाइल नाम पर उपयोग कर सकते हैं और दर्ज कर सकते हैं modespec, chmodकमांड में उपयोग की जाने वाली समान विशेषताएँ ।
M modespec <RET>

निर्देशिका में फाइलों पर अन्य उपयोगी कमांड देखें http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html


0

मैंने Vebjorn Ljosa के समाधान की कोशिश की, और यह पता चला कि कम से कम मेरे Emacs (22.3.1) में 'ट्रिम-राइट' के रूप में ऐसा कोई फ़ंक्शन नहीं है, जिसका उपयोग chodod आउटपुट के अंत में एक बेकार न्यूलाइन को हटाने के लिए किया जाता है।

कॉल को 'ट्रिम-राइट' में निकालने से मदद मिली, लेकिन अतिरिक्त पंक्ति के कारण स्थिति पंक्ति को "उछाल" बना दिया।


इसे शामिल करना भूल गए ... अब जोड़ा गया।
वेबजर्न लोजोसा

0

C-x C-qव्यर्थ का। क्योंकि फ़ाइल को सहेजने के लिए आपकी अनुमति की भी आवश्यकता होती है।

मैं Spacemacs का उपयोग करता हूं । यह मुझे इस प्रश्न को हल करने के लिए एक सुविधाजनक कार्य देता है। कोड निम्नलिखित है।

(defun spacemacs/sudo-edit (&optional arg)
  (interactive "p")
  (if (or arg (not buffer-file-name))
      (find-file (concat "/sudo:root@localhost:" (ido-read-file-name "File: ")))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

मैंने कॉल की spacemacs/sudo-edit emacs में एक फ़ाइल खोलने के लिए करता और अपना पासवर्ड इनपुट करता हूं, मैं बिना रीड-ओनली मोड के फाइल को बदल सकता हूं।

आप जैसे कोई नया फ़ंक्शन लिख सकते हैं spacemacs/sudo-edit

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