it-swarm.com.de

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

Wie ändere ich eine Datei in Emacs in den Schreibmodus und umgekehrt, wenn sie schreibgeschützt ist?

121
Ray Vega

M-x kann nur gelesen werden

oder in neueren Versionen von Emacs

M-x Nur-Lese-Modus

Auf meiner Windows-Box entspricht dies Alt-x, um die Meta-Eingabeaufforderung aufzurufen und "Nur-Lesen-Umschalten" einzugeben, um die richtige Elisp-Funktion aufzurufen.

Wenn Sie die Standardtastaturbelegung verwenden,

C-x C-q

(die Sie laut als "Control-X Control-Q" vorlesen) haben den gleichen Effekt. Bedenken Sie jedoch, dass Ihr Kilometerstand variieren kann, da der Emacs im Wesentlichen unendlich rekonfigurierbar ist.

Im Anschluss an den Kommentar: Sie sollten beachten, dass der Schreibstatus des Puffers die Schreibberechtigung 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 ändern.

Dies ist sehr praktisch, wenn Sie eine Datei schnell ändern möchten, ohne die mehreren Schritte zum Hinzufügen von Schreibberechtigungen, zum Ausschreiben von Änderungen und zum 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.

173
Bob Cross

Stellen Sie sicher, dass Sie "Datei" nicht mit "Puffer" verwechseln. Mit C-x C-q (toggle-read-only) Können Sie Puffer 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 Aufrufen der Datei erhalten (C-x C-f Oder find-file), 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 in dem Verzeichnis, das die Datei enthält. Dokumentation für dired finden Sie in info; C-h i (emacs)dired RET.

14
jfm3

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

12

Wie oben von jemand anderem erwähnt: M-x umschalten-schreibgeschützt würde funktionieren.

Dies ist jedoch jetzt veraltet und M-x Nur-Lese-Modus ist die aktuelle Methode, um dies zu tun. Es ist auf C-x C-q eingestellt.

7
Borja Tarraso

CTRL + X + CTRL + Q 

7
anjanb

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

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 ist abhängig 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, Werten Sie sie aus (oder starten Sie emacs neu). Anschließend können Sie die Datei im aktuellen Puffer mit M-x set-buffer-file-writable Beschreibbar machen.

6
Vebjorn Ljosa

Wenn Sie sich ein Dateiverzeichnis ansehen (dired), können Sie Shift + M auf einen Dateinamen und geben Sie modespec ein, die gleichen Attribute, die im Befehl chmod verwendet wurden.
M modespec <RET>

Weitere nützliche Befehle für Dateien in einem Verzeichnis finden Sie unter http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html

2
Louis Roehrs

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:[email protected]:" (ido-read-file-name "File: ")))
    (find-alternate-file (concat "/Sudo:[email protected]:" buffer-file-name))))

Ich rufe spacemacs/Sudo-edit Um eine Datei in Emacs zu öffnen und mein Passwort einzugeben, kann ich die Datei ohne Schreibschutz ändern.

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

0
Li Tianyi

Ich habe die Lösung von Vebjorn Ljosa ausprobiert, und es stellte sich heraus, dass es in meinem Emacs (22.3.1) keine Funktion wie 'trim-right' gibt, die zum Entfernen einer nutzlosen Newline am Ende der chmod-Ausgabe verwendet wird.

Das Aufheben des Aufrufs von 'trim-right' hat geholfen, aber die Statuszeile wurde wegen des zusätzlichen Zeilenumbruchs "abgehackt".

0