Domanda

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

È stato utile?

Soluzione

  

M-x toggle-sola lettura

o nelle versioni più recenti di Emacs

  

M-x sola lettura

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

Se si utilizzano le associazioni di tastiera predefinite,

  

C-x C-q

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

In seguito al commento: dovresti notare che lo stato scrivibile del buffer non cambia l'autorizzazione scrivibile del file. Se provi a scrivere su un file di sola lettura, vedrai un messaggio di conferma. Tuttavia, se possiedi il file, puoi scrivere le modifiche senza modificando le autorizzazioni sul file.

Questo è molto utile se si desidera 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.

Altri suggerimenti

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 nella directory che contiene il file. La documentazione per dired è disponibile in informazioni; C-h i (emacs)dired RET.

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

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

Come menzionato lassù da qualcun altro: M-x attiva / disattiva sola lettura funzionerebbe.

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

CTRL + X + CTRL + Q & nbsp; & nbsp; & nbsp; & nbsp;

Se solo il buffer (e non il file) è di sola lettura, è possibile utilizzare toggle-read-only, che di solito è associato a 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 da 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.

Se stai guardando una directory di file (dired), puoi usare Shift + M su un nome file e inserire modespec, gli stessi attributi usati nel comando chmod.
M modespec <RET>

Vedi gli altri comandi utili sui file in un elenco di directory all'indirizzo 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 di output di chmod.

La rimozione della chiamata a 'trim-right' ha aiutato, ma ha reso la riga di stato " bounce " 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 <=>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top