Antworten:
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.
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-f
oder 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 dired
dem Verzeichnis, das die Datei enthält. Dokumentation für dired finden Sie in info; C-h i (emacs)dired RET
.
inc
.
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
(set-file-modes FILE 438)
(wobei 438 das Dezimaläquivalent von 2#0110110110
oder ist 666
).
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 .
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-output
und 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
.
set-buffer
Außenseite der save-excursion
.
subseq
mit substring
jetzt. Das sollte die Warnung vermeiden.
Wenn Sie sich ein Verzeichnis von Dateien ansehen (dired), können Sie Shift + M
einen Dateinamen verwenden und modespec
die gleichen Attribute eingeben , die im chmod
Befehl verwendet wurden.
M modespec <RET>
Weitere nützliche Befehle für Dateien finden Sie in einer Verzeichnisliste unter http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html
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".
C-x C-q
ist 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
.
toggle-read-only
nur der schreibgeschützte Status des Puffers und nicht der Datei umgeschaltet . Wenn Sie den Modus der Datei ändern möchten, verwenden Sie die Dateidired
oder führen Sie siechmod +w
als Shell-Befehl aus.