Comment changer le mode lecture / écriture d'un fichier à l'aide d'Emacs?


126

Si un fichier est configuré en mode lecture seule, comment le changer en mode écriture et vice versa depuis Emacs?

Réponses:


178

Mx bascule en lecture seule

ou dans des versions plus récentes d'Emacs

Mode lecture seule MX

Sur ma boîte Windows, cela revient à Alt-x pour afficher l'invite méta et en tapant "toggle-read-only" pour appeler la fonction elisp correcte.

Si vous utilisez les liaisons clavier par défaut,

Cx Cq

(que vous lisez à haute voix "Control-X Control-Q") aura le même effet. N'oubliez pas, cependant, étant donné qu'emacs est essentiellement reconfigurable à l'infini, votre kilométrage peut varier.

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

Ceci est très pratique si vous souhaitez apporter une modification rapide à un fichier sans avoir à passer par les multiples étapes d'ajout de l'autorisation d'écriture, d'écriture des modifications, de suppression de l'autorisation d'écriture. J'ai tendance à oublier cette dernière étape, en laissant les fichiers potentiellement critiques ouverts pour des modifications accidentelles plus tard.


5
Salut, comme indiqué dans la réponse de jfm3 toggle-read-onlyne fait basculer que l'état de lecture seule du tampon et non du fichier. Si vous souhaitez changer le mode du fichier, utilisez diredou exécutez chmod +wcomme une commande shell sur le fichier.
danielpoe

Certes, c'est ainsi que vous changeriez de mode. Cependant, si vous basculez en mode lecture seule sur un tampon qui pointe vers un fichier en lecture seule que vous possédez, vous pourrez le modifier et écrire vos modifications (il y aura une question de confirmation, bien sûr).
Bob Cross

Suivi des commentaires ci-dessus et ajout de texte à la réponse.
Bob Cross

5
Dans les versions récentes d'Emacs, le basculement en lecture seule a été remplacé par le mode lecture seule.
Ben Key

15

Assurez-vous de ne pas confondre «fichier» avec «tampon». Vous pouvez définir les tampons en lecture seule et inversement avec C-x C-q( toggle-read-only). Si vous avez l'autorisation de lire, mais pas d'écrire, un fichier, le tampon que vous obtenez lorsque vous visitez le fichier ( C-x C-fou find-file) sera automatiquement mis en mode lecture seule. Si vous souhaitez modifier les autorisations sur un fichier dans le système de fichiers, commencez peut-être par diredsur le répertoire contenant le fichier. La documentation pour dired peut être trouvée dans info; C-h i (emacs)dired RET.


inc. Apprendre à un homme à pêcher ...
user234461

12

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

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


À mon avis, c'est la bonne réponse à la question exacte posée.
Mathias Dahl

1
En elisp, cela a fonctionné: (set-file-modes FILE 438)(où 438 est l'équivalent décimal de 2#0110110110ou 666).
Kaushal Modi

7

Comme mentionné là-haut par quelqu'un d'autre: Mx toggle-read-only fonctionnerait.

Cependant, cela est maintenant obsolète et le mode lecture seule Mx est la façon actuelle de le faire, il est défini sur la liaison de touches Cx Cq .



6

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, cependant, 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-outputet 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 ensuite rendre le fichier dans le tampon actuel accessible en écriture avec M-x set-buffer-file-writable.


Quand j'essaye de compiler mon .emacs avec ce code, j'obtiens le message "Attention: save-excursion vaincu par set-buffer".
Alan

1
@Alan, édité pour mettre l' set-bufferextérieur du fichier save-excursion.
Vebjorn Ljosa

merci pour ce changement, qui a éliminé l'avertissement. Cependant, il y en a un autre: "Attention: la fonction` subsq 'du package cl a été appelée lors de l'exécution. " Je ne pouvais pas m'en débarrasser même lorsque j'ai ajouté (eval-when-compile (require 'cl)) à mon .emacs.
Alan

Voir ce fil . J'ai édité le code et remplacé subseqpar substringmaintenant. Cela devrait éviter l'avertissement.
Vebjorn Ljosa

Maintenant que je suis passé à Emacs 24, j'obtiens le message "Attention: la fonction` decf 'n'est pas connue pour être définie. "
Alan


0

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

La suppression de l'appel à 'trim-right' a aidé, mais a fait rebondir la ligne d'état en raison de la nouvelle ligne supplémentaire.


J'ai oublié de l'inclure… ajouté maintenant.
Vebjorn Ljosa

0

C-x C-qest 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-editpour ouvrir un fichier dans emacs et entrer mon mot de passe, je peux changer le fichier sans mode lecture seule.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.