Risposte:
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.
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-f
o 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 dired
la 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 ...
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
(set-file-modes FILE 438)
(dove 438 è l'equivalente decimale di 2#0110110110
o 666
).
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.
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-output
e 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
.
set-buffer
esterno del file save-excursion
.
subseq
con substring
ora. Ciò dovrebbe evitare l'avvertimento.
Se stai guardando una directory di file (dired), puoi usare Shift + M
un nome file e inserire modespec
gli stessi attributi usati nel chmod
comando.
M modespec <RET>
Vedi gli altri comandi utili sui file in un elenco di directory su http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html
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.
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-edit
per 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
.
toggle-read-only
attiva / disattiva solo lo stato di sola lettura del buffer e non del file. Se si desidera modificare la modalità del file, utilizzaredired
o eseguirechmod +w
come comando shell sul file.