Come posso cambiare la modalità di lettura / scrittura per un file usando Emacs?


126

Se un file è impostato in modalità di sola lettura, come posso modificarlo in modalità di scrittura e viceversa all'interno di Emacs?

Risposte:


178

Mx attiva / disattiva sola lettura

o nelle versioni più recenti di Emacs

Mx modalità di sola lettura

Nella mia finestra di Windows, ciò equivale a Alt-x per visualizzare il meta prompt e digitando "toggle-read-only" per chiamare la corretta funzione elisp.

Se stai utilizzando le associazioni di tastiera predefinite,

Cx Cq

(che leggi ad alta voce come "Control-X Control-Q") avrà lo stesso effetto. Ricorda, tuttavia, dato che emacs è essenzialmente riconfigurabile all'infinito, il tuo chilometraggio può variare.

A seguito del commento: si noti che lo stato scrivibile del buffer non modifica l'autorizzazione scrivibile del file. Se provi a scrivere su un file di sola lettura , vedrai un messaggio di conferma. Tuttavia, se si possiede il file, è possibile scrivere le modifiche senza modificare le autorizzazioni sul file.

Questo è molto utile se desideri apportare una rapida modifica a un file senza dover eseguire i vari passaggi di aggiunta autorizzazione di scrittura, scrittura delle modifiche, rimozione dell'autorizzazione di scrittura. Tendo a dimenticare l'ultimo passaggio, lasciando aperti file potenzialmente critici per modifiche accidentali in seguito.


5
Ciao, come affermato nella risposta di jfm3 toggle-read-onlyattiva / disattiva solo lo stato di sola lettura del buffer e non del file. Se si desidera modificare la modalità del file, utilizzare diredo eseguire chmod +wcome comando shell sul file.
danielpoe,

È vero, è così che cambieresti la modalità. Tuttavia, se si attiva la modalità di sola lettura su un buffer che punta a un file di sola lettura che si possiede, sarà possibile modificarlo e scrivere le modifiche (ci sarà una domanda di conferma, ovviamente).
Bob Cross,

Seguito dai commenti sopra e aggiunto testo alla risposta.
Bob Cross,

5
Nelle versioni recenti di Emacs, la modalità di sola lettura è stata sostituita con la modalità di sola lettura.
Ben Key,

15

Assicurati di non confondere 'file' con 'buffer'. È possibile impostare i buffer in sola lettura e viceversa con C-x C-q( toggle-read-only). Se si dispone dell'autorizzazione per leggere, ma non per scrivere, un file, il buffer che si ottiene quando si visita il file ( C-x C-fo find-file) verrà messo automaticamente in modalità di sola lettura. Se si desidera modificare le autorizzazioni su un file nel file system, forse iniziare con diredla directory che contiene il file. La documentazione per dired è disponibile nelle informazioni; C-h i (emacs)dired RET.


inc. Insegna a un uomo a pescare ...
user234461

12

Quello che ho trovato è M-x set-file-modes filename mode

Ha funzionato sul mio box di Windows Vista. Per esempio:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


Secondo me, questa è la risposta giusta alla domanda esatta fatta.
Mathias Dahl,

1
In elisp, questo ha funzionato: (set-file-modes FILE 438)(dove 438 è l'equivalente decimale di 2#0110110110o 666).
Kaushal Modi,

7

Come menzionato lassù da qualcun altro: Mx toggle-sola lettura funzionerebbe.

Tuttavia, questo è ora deprecato e la modalità di sola lettura Mx è il modo attuale per farlo, che è impostato su Cx Cq keybinding.



6

Se solo il buffer (e non il file) è di sola lettura, è possibile utilizzare toggle-read-only, che di solito è associato C-x C-q.

Se il file stesso è di sola lettura, tuttavia, potresti trovare utile la seguente funzione:

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

La funzione dipende unix-outpute 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))

Inserisci le funzioni nel tuo ~/.emacs.el, valutale (o riavvia emacs). È quindi possibile rendere scrivibile il file nel buffer corrente con M-x set-buffer-file-writable.


Quando provo a compilare i miei .emacs con questo codice, ricevo il messaggio "Attenzione: save-excursion sconfitto da set-buffer".
Alan

1
@Alan, modificato per mettere l' set-bufferesterno del file save-excursion.
Vebjorn Ljosa,

grazie per quel cambiamento, che ha eliminato l'avvertimento. Tuttavia, ce n'è un altro: "Attenzione: funzione` subseq 'dal pacchetto cl chiamato in fase di esecuzione. " Non riuscivo a liberarmene nemmeno quando ho aggiunto (eval-when-compile (richiedi 'cl)) al mio .emacs.
Alan,

Vedi questa discussione . Ho modificato il codice e sostituito subseqcon substringora. Ciò dovrebbe evitare l'avvertimento.
Vebjorn Ljosa,

Ora che sono passato a Emacs 24, ricevo il messaggio "Avvertenza: la funzione" decf "non è nota per essere definita."
Alan,


0

Ho provato la soluzione di Vebjorn Ljosa e ho scoperto che almeno nel mio Emacs (22.3.1) non esiste una funzione come "trim-right", che viene utilizzata per rimuovere una newline inutile alla fine dell'output di chmod.

La rimozione della chiamata a "trim-right" ha aiutato, ma ha fatto "rimbalzare" la riga di stato a causa della nuova riga aggiuntiva.


Hai dimenticato di includerlo ... aggiunto ora.
Vebjorn Ljosa,

0

C-x C-qè inutile. Perché hai anche bisogno dell'autorizzazione per salvare un file.

Uso Spacemacs . Mi dà una comoda funzione per risolvere questa domanda. Il codice sta seguendo.

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

Chiamo spacemacs/sudo-editper aprire un file in emacs e inserire la mia password, posso cambiare il file senza modalità di sola lettura.

Puoi scrivere una nuova funzione come spacemacs/sudo-edit.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.