web-dev-qa-db-fra.com

Comment changer le mode lecture / écriture pour un fichier utilisant Emacs?

Si un fichier est défini en mode lecture seule, comment puis-je le changer en mode écriture et vice versa depuis Emacs?

121
Ray Vega

M-x bascule en lecture seule

ou dans des versions plus récentes d'Emacs

M-x mode lecture seule

Sur ma machine Windows, cela revient à Alt-x pour afficher la méta-invite et taper "bascule en lecture seule" pour appeler la fonction elisp correcte.

Si vous utilisez les liaisons de clavier par défaut,

C-x C-q

(que vous lisez à haute voix sous "Control-X Control-Q") aura le même effet. Rappelez-vous toutefois qu'emacs étant essentiellement reconfigurable à l'infini, votre kilométrage peut varier.

Suite du commentaire: vous devez noter que le statut en écriture du tampon ne modifie pas l’autorisation en écriture du fichier. Si vous essayez d'écrire en lecture seule fichier, vous verrez un message de confirmation. Cependant, si vous possédez le fichier, vous pouvez écrire vos modifications sans changer les autorisations sur le fichier.

Ceci est très pratique si vous souhaitez modifier rapidement un fichier sans avoir à passer par plusieurs étapes: ajouter une autorisation d'écriture, écrire des modifications, supprimer une autorisation d'écriture. J'ai tendance à oublier cette dernière étape, laissant les fichiers potentiellement critiques ouverts pour des modifications accidentelles ultérieurement.

173
Bob Cross

Assurez-vous de ne pas confondre "fichier" avec "tampon". Vous pouvez définir les mémoires tampon en lecture seule et inversement avec C-x C-q (toggle-read-only). Si vous êtes autorisé à lire, mais pas à écrire, un fichier, le tampon obtenu lors de la consultation du fichier (C-x C-f Ou find-file) Sera automatiquement mis en lecture seule. Si vous souhaitez modifier les autorisations sur un fichier du système de fichiers, commencez peut-être par dired dans le répertoire contenant le fichier. La documentation de dired se trouve dans info; C-h i (emacs)dired RET.

14
jfm3

Ce que j'ai trouvé c'est M-x set-file-modes filename mode

Cela a fonctionné à ma boîte de Windows Vista. Par exemple: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

12
Dmytro Kuznetsov

Comme mentionné par quelqu'un d'autre: M-x à bascule en lecture seule fonctionnerait.

Cependant, ceci est maintenant obsolète et M-x en lecture seule-mode est le moyen actuel de le faire, il est défini sur C-x C-q raccourci clavier.

7
Borja Tarraso

CTRL + X + CTRL + Q 

7
anjanb

Si seul le tampon (et non le fichier) est en lecture seule, vous pouvez utiliser toggle-read-only, qui est généralement lié à C-x C-q.

Si le fichier lui-même est en lecture seule, vous pouvez trouver la fonction suivante utile:

(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 fonction dépend de unix-output et 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))

Placez les fonctions dans votre ~/.emacs.el, évaluez-les (ou redémarrez emacs). Vous pouvez alors rendre le fichier dans le tampon courant en écriture avec M-x set-buffer-file-writable.

6
Vebjorn Ljosa

Si vous regardez un répertoire de fichiers (dired), vous pouvez utiliser Shift + M sur un nom de fichier et entrez modespec, les mêmes attributs que ceux utilisés dans la commande chmod.
M modespec <RET>

Voir les autres commandes utiles sur les fichiers d'une liste de répertoires à l'adresse http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html

2
Louis Roehrs

C-x C-q est inutile. Parce que vous avez également besoin de l'autorisation pour enregistrer un fichier.

J'utilise Spacemacs . Cela me donne une fonction pratique pour résoudre cette question. Le code suit.

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

J'appelle spacemacs/Sudo-edit pour ouvrir un fichier dans emacs et saisir mon mot de passe, je peux modifier le fichier sans passer par le mode lecture seule.

Vous pouvez écrire une nouvelle fonction comme spacemacs/Sudo-edit.

0
Li Tianyi

J'ai essayé la solution de Vebjorn Ljosa, et il s'est avéré qu'au moins dans mon Emacs (22.3.1), la fonction 'trim-right' n'existe pas, elle est utilisée pour supprimer une nouvelle ligne inutile à la fin de la sortie chmod.

Supprimer l'appel de "trim-right" a aidé, mais a fait rebondir la ligne d'état en raison de la nouvelle ligne.

0
Markus Vartiainen