Jak zmienić tryb odczytu/zapisu dla pliku za pomocą Emacsa?

Jeśli plik jest ustawiony na tryb Tylko do odczytu, jak zmienić go na tryb zapisu i odwrotnie z poziomu Emacsa?

Author: Ray Vega, 2008-10-08

9 answers

M-x Przełącznik-tylko do odczytu

Lub w nowszych wersjach Emacsa

M - x Read-only-mode

W moim oknie Windows, To oznacza Alt-x, aby wywołać meta prompt i wpisując "toggle-read-only", aby wywołać poprawną funkcję elisp.

Jeśli używasz domyślnych wiązań klawiatury,

C-x C-q

(które czytasz na głos jako "Control-X Control-Q") będzie miało ten sam efekt. Pamiętaj jednak, że emacs jest zasadniczo nieskończenie konfigurowalny przebieg może się różnić.

kontynuując komentarz: Należy zauważyć, że zapisywalny status bufora nie zmienia uprawnień zapisu pliku. Jeśli spróbujesz zapisać plik Tylko do odczytu , zobaczysz komunikat z potwierdzeniem. Jeśli jednak posiadasz plik, możesz zapisać swoje zmiany bez zmieniania uprawnień w pliku.

Jest to bardzo wygodne, jeśli chcesz dokonaj szybkiej zmiany pliku bez konieczności przechodzenia przez wiele kroków dodawania uprawnień do zapisu, zapisywania zmian, usuwania uprawnień do zapisu. Zazwyczaj zapominam o tym ostatnim kroku, pozostawiając potencjalnie krytyczne pliki otwarte na przypadkowe zmiany później.
 163
Author: Bob Cross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 08:42:40

Upewnij się, że nie pomyliłeś pliku z buforem. Można ustawić bufory tylko do odczytu i z powrotem z C-x C-q (toggle-read-only). Jeśli masz uprawnienia do odczytu, ale nie zapisu pliku, bufor uzyskany podczas odwiedzania pliku (C-x C-f lub find-file) zostanie automatycznie umieszczony w trybie tylko do odczytu. Jeśli chcesz zmienić uprawnienia do pliku w systemie plików, zacznij od dired w katalogu, który zawiera plik. Dokumentacja dired znajduje się w info; C-h i (emacs)dired RET.

 14
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 15:52:31

To co znalazłem to M-x set-file-modes filename mode

To działało w moim Windows Vista box. Na przykład: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

 12
Author: Dmytro Kuznetsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-09 10:19:30

Jeśli tylko bufor (a nie Plik) jest tylko do odczytu, możesz użyć toggle-read-only, który jest zwykle związany z C-x C-q.

Jeśli jednak sam plik jest tylko do odczytu, może okazać się przydatna następująca funkcja:

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

Funkcja zależy od unix-output i 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))

Umieść funkcje w swoim ~/.emacs.el, oceń je (lub uruchom ponownie Emacsa). Następnie plik w bieżącym buforze można zapisać za pomocą M-x set-buffer-file-writable.

 6
Author: Vebjorn Ljosa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 19:03:36

Jak wspomniał ktoś inny: m-x toggle-read-only zadziałałoby.

Jest to jednak obecnie przestarzałe i m-x read-only-mode jest bieżącym sposobem, aby to zrobić, że jest ustawiony na C-x C-q przypisywanie klawiszy.

 6
Author: Borja Tarraso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 13:45:26

CTRL + X + CTRL + Q

 6
Author: anjanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 07:34:29

Jeśli patrzysz na katalog plików (dired), możesz użyć Shift + M Na nazwie pliku i wprowadzić modespec, te same atrybuty używane w poleceniu chmod.
M modespec <RET>

Zobacz inne przydatne polecenia na plikach w katalogu na http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html

 2
Author: Louis Roehrs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-05 08:02:40

Wypróbowałem rozwiązanie Vebjorna Ljosa i okazało się, że przynajmniej w moim Emacsie (22.3.1) nie ma takiej funkcji jak 'Trim-right', która służy do usuwania bezużytecznego znaku nowego wiersza na końcu wyjścia chmod.

Usunięcie wywołania 'trim-right' pomogło, ale sprawiło, że wiersz statusu "bounce" z powodu dodatkowej nowej linii.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 07:50:00

C-x C-q jest bezużyteczny. Ponieważ potrzebujesz również uprawnienia do zapisania pliku.

Używam Spacemacs . Daje mi wygodną funkcję do rozwiązania tego pytania. Kod jest następujący.

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

Wywołuję spacemacs/sudo-edit aby otworzyć plik w Emacsie i wprowadzić hasło, mogę zmienić plik bez trybu tylko do odczytu.

Możesz napisać nową funkcję jak spacemacs/sudo-edit.

 0
Author: Li Tianyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 07:32:27