Réponses:
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.
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-f
ou 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 dired
sur 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 ...
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
(set-file-modes FILE 438)
(où 438 est l'équivalent décimal de 2#0110110110
ou 666
).
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 .
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-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 ensuite rendre le fichier dans le tampon actuel accessible en écriture avec M-x set-buffer-file-writable
.
set-buffer
extérieur du fichier save-excursion
.
subseq
par substring
maintenant. Cela devrait éviter l'avertissement.
Si vous recherchez un répertoire de fichiers (dired), vous pouvez utiliser Shift + M
sur un nom de fichier et entrer modespec
les mêmes attributs que ceux utilisés dans la chmod
commande.
M modespec <RET>
Voir les autres commandes utiles sur les fichiers dans une liste de répertoires à http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html
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.
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 entrer mon mot de passe, je peux changer le fichier sans mode lecture seule.
Vous pouvez écrire une nouvelle fonction comme spacemacs/sudo-edit
.
toggle-read-only
ne fait basculer que l'état de lecture seule du tampon et non du fichier. Si vous souhaitez changer le mode du fichier, utilisezdired
ou exécutezchmod +w
comme une commande shell sur le fichier.