2008-10-08 13 views

Respuesta

150

Mx toggle-read-only

o en versiones más recientes de Emacs

Mx sólo lectura en modo

En mi caja de Windows, que las cantidades a Alt-x para que aparezca el indicador de meta y escriba "alternar-leer-solo" para llamar a la función elisp correcta.

Si está utilizando los enlaces de teclado por defecto,

C-x C-q

(que se lee 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.

En seguimiento al comentario:, debe tener en cuenta que el estado de escritura del búfer no cambia el permiso de escritura del archivo. Si intenta escribir en un archivo de solo lectura , verá un mensaje de confirmación. Sin embargo, si posee el archivo, puede escribir sus cambios sin cambiando 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.

+5

Hola, como se indica en la respuesta de jfm3 'toggle-read-only' solo se alterna el estado de solo lectura del búfer que no está en el archivo. Si desea cambiar el modo del archivo, use 'dired' o ejecute' chmod + w' como un comando de shell en el archivo. – danielpoe

+0

Es cierto, así es como cambiaría el modo. Sin embargo, si alternas el modo de solo lectura en un búfer que apunta a un archivo de solo lectura que posees, podrás editarlo y escribir tus cambios (habrá una pregunta de confirmación, por supuesto). –

+0

Seguido de los comentarios anteriores y texto agregado a la respuesta. –

5

CTRL + X +CTRL + Q        

14

asegurarse de que no está confuso 'archivo' con 'buffer'. Puede configurar almacenamientos intermedios para que sean de solo lectura y viceversa con C-x C-q (toggle-read-only). Si tiene permiso para leer, pero no escribe, un archivo, el búfer que obtiene cuando visita el archivo (C-x C-f o find-file) se pondrá automáticamente en modo de solo lectura. 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; C-h i (emacs)dired RET.

6

Si solo el búfer (y no el archivo) es de solo lectura, puede usar toggle-read-only, que generalmente está vinculado a C-x C-q.

Si el archivo en sí es, sin embargo, es posible que la siguiente función de utilidad de sólo lectura:

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

lugar las funciones de su ~/.emacs.el, evaluarlos (o reiniciar emacs). A continuación, puede hacer que el archivo en el búfer actual se pueda escribir con M-x set-buffer-file-writable.

+0

Cuando intento compilar mis .emacs con este código, aparece el mensaje "Advertencia: save-excursion derrotado por set-buffer". – Alan

+1

@Alan, editado para poner 'set-buffer' fuera de' save-excursion'. –

+0

gracias por ese cambio, que eliminó la advertencia. Sin embargo, hay otro: "Advertencia: Función 'subseq' del paquete cl llamado en tiempo de ejecución." No pude deshacerme de eso incluso cuando agregué (eval-when-compile (require 'cl)) a mis .emacs. – Alan

0

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 utiliza 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 "rebote" debido a la nueva línea adicional.

+0

Se olvidó de incluirlo ... agregado ahora. –

12

Lo que encontré es M-x set-file-modes filename mode

Se trabajó en mi caja de Windows Vista. Por ejemplo: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

+0

En mi opinión, esta es la respuesta correcta a la pregunta exacta. –

+1

En elisp, esto funcionó: '(set-file-modes FILE 438)' (donde 438 es el equivalente decimal de '2 # 0110110110' o' 666'). –

2

Si usted está buscando en un directorio de archivos (dired), entonces se puede utilizar Shift + M en un nombre de archivo y entrar en el modespec, los mismos atributos que se utilizan en el comando chmod.
M modespec <RET>

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

5

Como se ha mencionado arriba allí por otra persona: M-x de palanca lectura de sólo funcionaría.

Sin embargo, esto es ahora obsoleto y M-x solamente en modo lectura es la forma actual para hacerlo, que se establece en C-x C-q combinación de teclas.

0

C-x C-q 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:[email protected]:" (ido-read-file-name "File: "))) 
    (find-alternate-file (concat "/sudo:[email protected]:" buffer-file-name)))) 

llamo spacemacs/sudo-edit para abrir un archivo en emacs y entrada de contraseña, puedo cambiar el archivo sin el modo de sólo lectura.

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

Cuestiones relacionadas