128 votes

Comment changer le mode de lecture/écriture d'un fichier en utilisant Emacs ?

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

180voto

Bob Cross Points 13552

M-x toggle-read-only (basculer en lecture seule)

Sur ma machine Windows, cela revient à Alt-x pour faire apparaître l'invite méta et à taper "toggle-read-only" pour appeler la bonne fonction elisp.

Si vous utilisez les liaisons clavier par défaut,

C-x C-q

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

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

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

5 votes

Bonjour, comme indiqué dans la réponse de jfm3 toggle-read-only ne fait que basculer l'état de lecture seule du tampon, pas du fichier. Si vous voulez changer le mode du fichier, utilisez la commande dired ou exécuter chmod +w comme une commande shell sur le fichier.

0 votes

C'est vrai, c'est comme ça qu'on change le mode. Cependant, si vous basculez en mode lecture seule sur un tampon qui pointe vers un fichier en lecture seule dont vous êtes le propriétaire, vous pourrez le modifier et écrire vos changements (il y aura une question de confirmation, bien sûr).

0 votes

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

15voto

jfm3 Points 13666

Assurez-vous que vous ne confondez pas "fichier" et "tampon". Vous pouvez faire passer les tampons en lecture seule et inversement à l'aide de la commande C-x C-q ( toggle-read-only ). Si vous avez la permission de lire, mais pas d'écrire, un fichier, le tampon que vous obtenez lorsque vous visitez le fichier ( C-x C-f o find-file ) seront automatiquement mis en mode lecture seule. Si vous voulez changer les permissions d'un fichier dans le système de fichiers, vous pouvez commencer avec dired sur le répertoire qui contient le fichier. La documentation pour dired peut être trouvée dans info ; C-h i (emacs)dired RET .

13voto

Dmitry Kuznetsov Points 133

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

Cela a fonctionné sur mon ordinateur Windows Vista. Par exemple : M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

0 votes

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

1 votes

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

7voto

anjanb Points 5579

OU CTRL X + CTRL Q.

0 votes

Explication ? L'OP a dit "file", pas "buf".

6voto

Vebjorn Ljosa Points 6215

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 .

Cependant, 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 y 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 et les évaluer (ou redémarrer emacs). Vous pouvez ensuite rendre le fichier dans le tampon courant accessible en écriture avec M-x set-buffer-file-writable .

0 votes

Lorsque j'essaie de compiler mon .emacs avec ce code, j'obtiens le message "Warning : save-excursion defeated by set-buffer".

1 votes

@Alan, modifié pour mettre le set-buffer en dehors de la save-excursion .

0 votes

Merci pour cette modification, qui a éliminé l'avertissement. Cependant, il y en a un autre : "Avertissement : Function `subseq' from cl package called at runtime". Je n'ai pas pu m'en débarrasser même en ajoutant (eval-when-compile (require 'cl)) à mon .emacs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X