Wie ändere ich den Lese- / Schreibmodus für eine Datei mit Emacs?


126

Wenn eine Datei auf den Nur-Lese-Modus eingestellt ist, wie ändere ich sie in Emacs in den Schreibmodus und umgekehrt?

Antworten:


178

Mx schreibgeschützt

oder in neueren Versionen von Emacs

Mx Nur-Lese-Modus

Auf meiner Windows-Box entspricht dies Alt-x, um die Meta-Eingabeaufforderung aufzurufen, und geben Sie "schreibgeschützt umschalten" ein, um die richtige Elisp-Funktion aufzurufen.

Wenn Sie die Standardtastaturbindungen verwenden,

Cx Cq

(was Sie als "Control-X Control-Q" vorlesen) hat den gleichen Effekt. Denken Sie jedoch daran, dass Ihr Kilometerstand variieren kann, da Emacs im Wesentlichen unendlich neu konfigurierbar ist.

Nach dem Kommentar: Sie sollten beachten, dass der beschreibbare Status des Puffers die beschreibbare Berechtigung der Datei nicht ändert. Wenn Sie versuchen, in eine schreibgeschützte Datei zu schreiben, wird eine Bestätigungsmeldung angezeigt. Wenn Sie jedoch Eigentümer der Datei sind, können Sie Ihre Änderungen ausschreiben, ohne die Berechtigungen für die Datei zu ändern.

Dies ist sehr praktisch, wenn Sie eine Datei schnell ändern möchten, ohne die verschiedenen Schritte zum Hinzufügen von Schreibberechtigungen, Schreiben von Änderungen und Entfernen von Schreibberechtigungen ausführen zu müssen. Ich neige dazu, diesen letzten Schritt zu vergessen und potenziell kritische Dateien für versehentliche Änderungen später offen zu lassen.


5
Hallo, wie in der Antwort von jfm3 angegeben, wird toggle-read-onlynur der schreibgeschützte Status des Puffers und nicht der Datei umgeschaltet . Wenn Sie den Modus der Datei ändern möchten, verwenden Sie die Datei diredoder führen Sie sie chmod +wals Shell-Befehl aus.
Danielpoe

Richtig, so würden Sie den Modus ändern. Wenn Sie jedoch den schreibgeschützten Modus für einen Puffer umschalten, der auf eine schreibgeschützte Datei verweist, die Sie besitzen, können Sie diese bearbeiten und Ihre Änderungen aufschreiben (es wird natürlich eine Bestätigungsfrage geben).
Bob Cross

Verfolgte die obigen Kommentare und fügte der Antwort Text hinzu.
Bob Cross

5
In neueren Versionen von Emacs wurde das schreibgeschützte Umschalten durch den schreibgeschützten Modus ersetzt.
Ben Key

15

Stellen Sie sicher, dass Sie "Datei" nicht mit "Puffer" verwechseln. Sie können die Puffer mit C-x C-q( toggle-read-only) auf schreibgeschützt und wieder zurück setzen . Wenn Sie die Berechtigung haben, eine Datei zu lesen, aber nicht zu schreiben, wird der Puffer, den Sie beim Besuch der Datei ( C-x C-foder find-file) erhalten, automatisch in den schreibgeschützten Modus versetzt. Wenn Sie die Berechtigungen für eine Datei im Dateisystem ändern möchten, beginnen Sie möglicherweise mit direddem Verzeichnis, das die Datei enthält. Dokumentation für dired finden Sie in info; C-h i (emacs)dired RET.


inc.
Bringen Sie

12

Was ich gefunden habe ist M-x set-file-modes filename mode

Es funktionierte auf meiner Windows Vista-Box. Beispielsweise:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


Meiner Meinung nach ist dies die richtige Antwort auf die genaue gestellte Frage.
Mathias Dahl

1
In elisp funktionierte dies: (set-file-modes FILE 438)(wobei 438 das Dezimaläquivalent von 2#0110110110oder ist 666).
Kaushal Modi

7

Wie dort oben von jemand anderem erwähnt: Mx schreibgeschützt würde funktionieren.

Dies ist jedoch jetzt veraltet und der schreibgeschützte Mx-Modus ist der derzeitige Weg, dies zu tun, da er auf die Cx-Cq-Tastenkombination eingestellt ist .



6

Wenn nur der Puffer (und nicht die Datei) schreibgeschützt ist, können Sie verwenden toggle-read-only, an den normalerweise gebunden ist C-x C-q.

Wenn die Datei selbst schreibgeschützt ist, ist die folgende Funktion möglicherweise hilfreich:

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

Die Funktion hängt ab von unix-outputund 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))

Platzieren Sie die Funktionen in Ihrem ~/.emacs.el, bewerten Sie sie (oder starten Sie Emacs neu). Sie können dann die Datei im aktuellen Puffer mit beschreibbar machen M-x set-buffer-file-writable.


Wenn ich versuche, meine .emacs mit diesem Code zu kompilieren, wird die Meldung "Warnung: Save-Exkursion durch Set-Buffer besiegt" angezeigt.
Alan

1
@ Alan, bearbeitet, um die set-bufferAußenseite der save-excursion.
Vebjorn Ljosa

Vielen Dank für diese Änderung, die die Warnung beseitigt hat. Es gibt jedoch noch eine andere: "Warnung: Funktion` subseq 'aus dem zur Laufzeit aufgerufenen cl-Paket. " Ich konnte das nicht loswerden, selbst wenn ich meinen .emacs (eval-when-compile (require 'cl)) hinzufügte.
Alan

Siehe diesen Thread . Ich habe den Code und ersetzt bearbeitet subseqmit substringjetzt. Das sollte die Warnung vermeiden.
Vebjorn Ljosa

Nachdem ich zu Emacs 24 übergegangen bin, wird die Meldung "Warnung: Es ist nicht bekannt, dass die Funktion" decf "definiert ist."
Alan


0

Ich habe die Lösung von Vebjorn Ljosa ausprobiert und es stellte sich heraus, dass es zumindest in meinem Emacs (22.3.1) keine Funktion wie "Trim-Right" gibt, mit der eine nutzlose Newline am Ende der chmod-Ausgabe entfernt wird.

Das Entfernen des Aufrufs von "Rechts trimmen" hat geholfen, aber die Statuszeile wurde aufgrund des zusätzlichen Zeilenumbruchs "abprallend".


Ich habe vergessen, es aufzunehmen ... jetzt hinzugefügt.
Vebjorn Ljosa

0

C-x C-qist nutzlos. Weil Sie auch die Berechtigung zum Speichern einer Datei benötigen.

Ich benutze Spacemacs . Es gibt mir eine bequeme Funktion, um diese Frage zu lösen. Der Code folgt.

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

Ich rufe spacemacs/sudo-edit an, um eine Datei in Emacs zu öffnen und mein Passwort einzugeben. Ich kann die Datei ohne schreibgeschützten Modus ändern.

Sie können eine neue Funktion wie schreiben spacemacs/sudo-edit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.