emacs file file-permissions

¿Cómo cambio el modo de lectura/escritura para un archivo usando Emacs?



file file-permissions (9)

Si un archivo está configurado para modo de solo lectura, ¿cómo lo cambio al modo de escritura y viceversa desde dentro de Emacs?


Mx toggle-read-only

o en versiones más recientes de Emacs

Mx modo de solo lectura

En mi cuadro de Windows, eso equivale a Alt-x para abrir el indicador de meta y escribir "alternar-solo-leer" para llamar a la función elisp correcta.

Si está utilizando los enlaces predeterminados del teclado,

Cx Cq

(que leerá en voz alta como "Control-X Control-Q") tendrá el mismo efecto. Recuerde, sin embargo, dado que emacs es esencialmente infinitamente reconfigurable, su millaje puede variar.

A continuación del comentario: debe tener en cuenta que el estado de escritura del búfer no cambia el permiso de escritura del archivo. Si intentas escribir en un archivo de solo lectura, verás un mensaje de confirmación. Sin embargo, si posee el archivo, puede escribir sus cambios sin cambiar los permisos en el archivo.

Esto es muy conveniente si desea realizar un cambio rápido en un archivo sin tener que pasar por los múltiples pasos de agregar permiso de escritura, escribir cambios, eliminar permiso de escritura. Tiendo a olvidar ese último paso, dejando archivos potencialmente críticos abiertos para cambios accidentales más adelante.


Asegúrese de no confundir ''archivo'' con ''buffer''. Puede configurar almacenamientos intermedios para que sean de solo lectura y viceversa con Cx Cq ( toggle-read-only ). Si tiene permiso para leer, pero no escribe, un archivo, el búfer que obtiene cuando visita el archivo ( Cx Cf o find-file ) se colocará en modo de solo lectura automáticamente. Si desea cambiar los permisos de un archivo en el sistema de archivos, quizás comience con dired en el directorio que contiene el archivo. La documentación para dired se puede encontrar en la información; Ch i (emacs)dired RET .


Como lo mencionó alguien más: Mx toggle-read-only funcionaría.

Sin embargo, esto ahora está en desuso y el modo de solo lectura de Mx es la forma actual de hacerlo, que está establecido en Cx Cq keybinding.


Lo que encontré es el Mx set-file-modes filename mode

Funcionó en mi caja de Windows Vista. Por ejemplo: Mx set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


Probé la solución de Vebjorn Ljosa, y resultó que al menos en mi Emacs (22.3.1) no hay una función como ''recortar-derecha'', que se usa para eliminar una nueva línea inútil al final de la salida de chmod.

Eliminar la llamada a ''recortar-derecha'' ayudó, pero hizo que la fila de estado "rebotara" debido a la nueva línea adicional.


Si está buscando un directorio de archivos (dired), puede usar Shift + M en un nombre de archivo e ingresar el modespec , los mismos atributos utilizados en el comando chmod .
M modespec <RET>

Vea los otros comandos útiles en los archivos en una lista de directorios en http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html


Si solo el buffer (y no el archivo) es de solo lectura, puede usar toggle-read-only , que generalmente está vinculado a Cx Cq .

Sin embargo, si el archivo en sí es de solo lectura, puede encontrar la siguiente función útil:

(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 función depende 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))

Coloque las funciones en su ~/.emacs.el , ~/.emacs.el (o reinicie emacs). A continuación, puede hacer que el archivo en el búfer actual se pueda escribir con Mx set-buffer-file-writable .


Cx Cq es inútil. Porque también necesita el permiso para guardar un archivo.

Yo uso Spacemacs . Me da una función conveniente para resolver esta pregunta. El código está siguiendo.

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

Llamo a spacemacs/sudo-edit para abrir un archivo en emacs e ingreso mi contraseña, puedo cambiar el archivo sin modo de solo lectura.

Puede escribir una nueva función como spacemacs/sudo-edit .


CTRL + X + CTRL + Q