Emacs kullanan bir dosya için okuma / yazma modunu nasıl değiştiririm?


126

Bir dosya salt okunur moduna ayarlandıysa, onu Emacs içinden yazma moduna ve tersine nasıl değiştirebilirim?

Yanıtlar:


178

Mx geçişli salt okunur

veya Emacs'in daha yeni sürümlerinde

Mx salt okunur modu

Windows kutumda bu, meta komut istemini açmak için Alt-x anlamına gelir ve doğru elisp işlevini çağırmak için "salt okunur" yazılır.

Varsayılan klavye bağlamalarını kullanıyorsanız,

Cx Cq

("Control-X Control-Q" olarak yüksek sesle okuduğunuz) aynı etkiye sahip olacaktır. Bununla birlikte, emacs'in esasen sonsuz şekilde yeniden yapılandırılabilir olduğu göz önüne alındığında, kilometrenizin değişebileceğini unutmayın.

Yorumların gelen takibi: Eğer tampon yazılabilir durum dosyasının yazılabilir izni değişmez unutmamalıdır. Salt okunur bir dosyaya yazmaya çalışırsanız , bir onay mesajı görürsünüz. Dosyayı kendi Ancak, yaptığınız değişiklikleri yazabiliriz olmadan dosya izinlerini değiştirerek.

Yazma izni ekleme, değişiklikleri yazma, yazma iznini kaldırma gibi birden çok adımdan geçmek zorunda kalmadan bir dosyada hızlı bir değişiklik yapmak istiyorsanız bu çok kullanışlıdır. Son adımı unutmaya meyilliyim, potansiyel olarak kritik dosyaları daha sonra yanlışlıkla değişikliklere açık bırakıyorum.


5
Merhaba, jfm3'ten gelen yanıtta belirtildiği gibi toggle-read-onlysadece dosyanın değil, tamponun salt okunur durumunu değiştirir. Dosya modunu değiştirmek istiyorsanız, dosya üzerinde bir kabuk komutu olarak kullanın diredveya çalıştırın chmod +w.
danielpoe

Doğru, modu böyle değiştirirsin. Ancak, sahip olduğunuz salt okunur bir dosyayı işaret eden bir arabellekte salt okunur modunu değiştirirseniz, onu düzenleyebilir ve değişikliklerinizi yazabilirsiniz (elbette bir onay sorusu olacaktır).
Bob Cross

Yukarıdaki yorumları takip etti ve yanıta metin eklendi.
Bob Cross

5
Emacs'in son sürümlerinde, salt okunur, salt okunur moduyla değiştirildi.
Ben Key

15

"Dosya" yı "arabellek" ile karıştırmadığınızdan emin olun. C-x C-q( toggle-read-only) İle arabellekleri salt okunur ve tekrar geri ayarlayabilirsiniz . Bir dosyayı okuma izniniz varsa ancak yazma izniniz varsa, dosyayı ( C-x C-fveya find-file) ziyaret ettiğinizde aldığınız arabellek otomatik olarak salt okunur moda alınacaktır. Dosya sistemindeki bir dosyanın izinlerini değiştirmek istiyorsanız, belki direddosyayı içeren dizinden başlayabilirsiniz . Yönlendirilen belgeler, bilgi bölümünde bulunabilir; C-h i (emacs)dired RET.


inc. Bir adama balık
tutmayı

12

Bulduğum şey M-x set-file-modes filename mode

Windows Vista kutumda çalıştı. Örneğin:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


Bence sorulan sorunun tam olarak doğru cevabı bu.
Mathias Dahl

1
Elisp'de bu işe yaradı: (set-file-modes FILE 438)(burada 438, 2#0110110110veya değerinin ondalık eşdeğeridir 666).
Kaushal Modi

7

Yukarıda başka biri tarafından belirtildiği gibi: Mx geçiş-salt okunur çalışacaktır.

Ancak, bu artık kullanımdan kaldırılmıştır ve Mx salt okunur modu bunu yapmanın şu anki yoludur, Cx Cq tuş bağlama olarak ayarlanmıştır .



6

Yalnızca arabellek (ve dosya değil) salt okunursa, kullanabilirsiniz toggle-read-only, ki bu genellikleC-x C-q .

Ancak dosyanın kendisi salt okunursa, aşağıdaki işlevi yararlı bulabilirsiniz:

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

İşlev aşağıdakilere bağlıdır unix-outputve 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))

Fonksiyonları kendinize yerleştirin ~/.emacs.el, değerlendirin (veya emac'leri yeniden başlatın). Daha sonra mevcut arabellekteki dosyayı ile yazılabilir hale getirebilirsiniz M-x set-buffer-file-writable.


.Emac'larımı bu kodla derlemeye çalıştığımda, "Uyarı: kaydetme-gezinme, set-buffer tarafından yenildi" mesajını alıyorum.
Alan

1
@Alan, set-bufferdışını koymak için düzenlendi save-excursion.
Vebjorn Ljosa

Uyarıyı ortadan kaldıran bu değişiklik için teşekkürler. Ancak, bir tane daha var: "Uyarı: çalışma zamanında çağrılan cl paketinden" subseq 'işlevi. " Emac'lerime (eval-when-compile (required 'cl)) eklediğimde bile bundan kurtulamadım.
Alan

Bu konuya bakın . Kodu düzenledim ve şimdi subseqile değiştirdim substring. Bu uyarıdan kaçınmalıdır.
Vebjorn Ljosa

Artık Emacs 24'e geçtiğime göre, "Uyarı:" decf 'işlevinin tanımlandığı bilinmiyor "mesajını alıyorum.
Alan


0

Vebjorn Ljosa'nın çözümünü denedim ve en azından Emacs'ımda (22.3.1) chmod çıktısının sonunda işe yaramaz bir yeni satırı kaldırmak için kullanılan 'trim-right' gibi bir işlev olmadığı ortaya çıktı.

'Düzeltme' çağrısının kaldırılması yardımcı oldu, ancak fazladan satırsonu nedeniyle durum satırının "geri dönmesine" neden oldu.


Dahil etmeyi unuttum… şimdi eklendi.
Vebjorn Ljosa

0

C-x C-qişe yaramaz. Çünkü bir dosyayı kaydetmek için de izne ihtiyacınız var.

Kullandığım Spacemacs . Bu soruyu çözmek için bana uygun bir işlev veriyor. Kod takip ediyor.

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

Ararım spacemacs/sudo-editEmacs'de bir dosya açmak için ve şifremi giriyorum, dosyayı salt okunur modu olmadan değiştirebiliyorum.

Gibi yeni bir fonksiyon yazabilirsiniz spacemacs/sudo-edit.

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.