Si un fichier est défini en mode lecture seule, comment puis-je le changer en mode écriture et vice versa depuis Emacs?
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.
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
.
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
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.
CTRL + X + CTRL + Q
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
.
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
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
.
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.