Pergunta

Se um arquivo é definido como modo somente leitura, como faço para mudar para o modo de gravação e vice-versa pelo Emacs?

Foi útil?

Solução

M-x de alternância-read-only

ou em versões mais recentes do Emacs

M-x read-only-mode

Em minha caixa do Windows, que equivale a Alt-x para abrir a meta de digitação rápida e "toggle-read-only" para chamar a função elisp correta.

Se você estiver usando as ligações de teclado padrão,

C-X-C q

(que você leu em voz alta como "Controle-X Control-Q") terá o mesmo efeito. Lembre-se, no entanto, dado que o Emacs é essencialmente infinitamente re-configurável, sua milhagem pode variar.

No seguimento do comentário: você deve observar que o estado gravável do buffer de não alterar a permissão gravável do arquivo. Se você tentar escrever para uma leitura única arquivo , você verá uma mensagem de confirmação. No entanto, se você possui o arquivo, você pode escrever as alterações sem alterar as permissões no arquivo.

Isto é muito conveniente se você gostaria de fazer uma mudança rápida para um arquivo sem ter que ir através das várias etapas de permissão de escrita add, escreva mudanças, permissão remove gravação. I tendem a esquecer que a última etapa, deixando os arquivos potencialmente críticos abrir para alterações acidentais mais tarde.

Outras dicas

Certifique-se de que você não está confundindo 'arquivo' com 'buffer'. Você pode definir buffers para somente leitura e de volta com C-x C-q (toggle-read-only). Se você tem permissão para ler, mas não escrita, um arquivo, o buffer que você começa quando você visita o arquivo (C-x C-f ou find-file) será colocado em modo de somente leitura automaticamente. Se você deseja alterar as permissões em um arquivo no sistema de arquivos, talvez começar com dired no diretório que contém o arquivo. Documentação para dired pode ser encontrada em info; C-h i (emacs)dired RET.

O que eu achei é M-x set-file-modes filename mode

Ele trabalhou na minha caixa de Windows Vista. Por exemplo: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

Como mencionado acima lá por outra pessoa:. M-x de alternância de leitura-only iria funcionar

No entanto, este é agora obsoleto e Mx read-only-mode é o caminho atual para fazê-lo, que ele está definido para Cx Cq atalhos de teclado.

CTRL + X + CTRL + Q

Se apenas o tampão (e não o arquivo) é somente leitura, você pode usar toggle-read-only, que normalmente é obrigado a C-x C-q.

Se o arquivo em si é só de leitura, no entanto, você pode encontrar a seguinte função ú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)))))

A função depende unix-output e 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 as funções na sua ~/.emacs.el, avaliá-los (ou emacs reinicialização). Você pode então fazer o arquivo na gravável buffer atual com M-x set-buffer-file-writable.

Se você está olhando para um diretório de arquivos (dired), então você pode usar Shift + M em um nome de arquivo e digite o modespec, os mesmos atributos usado no comando chmod.
M modespec <RET>

Veja os outros comandos úteis em arquivos em uma listagem de diretório em http://www.gnu.org/s/libtool /manual/emacs/Operating-on-Files.html

Eu tentei a solução da Vebjorn Ljosa, e descobriu-se que pelo menos na minha Emacs (22.3.1) não existe tal função como 'guarnição-direito', que é usado para a remoção de uma nova linha inútil no final de saída chmod.

Retirar a chamada para 'guarnição direito' ajudou, mas fez o status de linha "rejeição" por causa da nova linha extra.

C-x C-q é inútil. Porque a sua também precisa da permissão para salvar um arquivo.

Eu uso Spacemacs . Isso me dá uma função conveniente para resolver esta questão. O código está a seguir.

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

Eu chamo spacemacs/sudo-edit para abrir um arquivo no emacs e entrada de minha senha, eu posso mudar o arquivo sem modo de somente leitura.

Você pode escrever uma nova função como spacemacs/sudo-edit.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top