Emacs를 사용하여 파일의 읽기 / 쓰기 모드를 어떻게 변경합니까?


126

파일이 읽기 전용 모드로 설정되어 있으면 Emacs 내에서 파일을 쓰기 모드로 변경하거나 그 반대로 변경하려면 어떻게해야합니까?

답변:


178

MX 토글 읽기 전용

또는 최신 버전의 Emacs

MX 읽기 전용 모드

내 Windows 상자에서 Alt-x에 도달하면 메타 프롬프트가 표시되고 "toggle-read-only"를 입력하여 올바른 elisp 함수를 호출합니다.

기본 키보드 바인딩을 사용하는 경우

Cx Cq

( "Control-X Control-Q"라고 큰 소리로 읽음) 효과는 동일합니다. 그러나 emacs가 본질적으로 무한정 재구성 가능하다는 점을 감안하면 마일리지가 다를 수 있습니다.

주석에서 후속 조치 : 버퍼의 쓰기 가능 상태는 파일의 쓰기 가능 권한을 변경하지 않습니다. 읽기 전용 파일 에 쓰려고 하면 확인 메시지가 나타납니다. 그러나 파일을 소유 한 경우 파일에 대한 권한을 변경 하지 않고 변경 사항 작성할 수 있습니다 .

쓰기 권한 추가, 변경 쓰기, 쓰기 권한 제거의 여러 단계를 거치지 않고 파일을 빠르게 변경하려는 경우 매우 편리합니다. 마지막 단계는 잊어 버리고 나중에 실수로 변경 될 수 있도록 잠재적으로 중요한 파일을 열어 둡니다.


5
안녕, jfm3의 답변에 명시된 바와 같이 toggle-read-only파일이 아닌 버퍼의 읽기 전용 상태 만 토글됩니다. 파일 모드를 변경하려면 파일 에서 쉘 명령으로 사용 dired하거나 실행 chmod +w하십시오.
danielpoe

사실, 이것이 모드를 변경하는 방법입니다. 그러나 소유 한 읽기 전용 파일을 가리키는 버퍼에서 읽기 전용 모드를 전환하면 해당 파일을 편집하고 변경 사항을 기록 할 수 있습니다 (물론 확인 질문이 있음).
Bob Cross

위의 의견을 따르고 답변에 텍스트를 추가했습니다.
Bob Cross

5
최신 버전의 Emacs에서 토글 읽기 전용이 읽기 전용 모드로 대체되었습니다.
벤 키

15

'file'과 'buffer'를 혼동하지 마십시오. C-x C-q( toggle-read-only)를 사용 하여 버퍼를 읽기 전용으로 설정하고 다시 되돌릴 수 있습니다 . 파일을 읽을 수는 있지만 쓸 수는 없지만 파일을 방문 할 때 얻게되는 버퍼 ( C-x C-f또는 find-file)는 자동으로 읽기 전용 모드로 설정됩니다. 파일 시스템의 파일에 대한 권한을 변경하려면 파일 dired이 포함 된 디렉토리에서 시작 하십시오. dired에 대한 설명서는 info에서 찾을 수 있습니다. C-h i (emacs)dired RET.


inc. 남자에게 물고기를 가르쳐 ...
user234461

12

내가 찾은 것은 M-x set-file-modes filename mode

내 Windows Vista 상자에서 작동했습니다. 예를 들면 다음과 같습니다.M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


제 생각에 이것은 정확한 질문에 대한 정답입니다.
Mathias Dahl

1
elisp에서는 다음과 같이 작동했습니다. (set-file-modes FILE 438)(438는 10과 동등한 2#0110110110또는 666)
Kaushal Modi 2016 년

7

다른 사람이 언급했듯이 Mx 토글 읽기 전용 이 작동합니다.

그러나 이것은 더 이상 사용되지 않으며 Mx 읽기 전용 모드 는 현재 Cx Cq 키 바인딩으로 설정되어 있습니다.



6

파일이 아닌 버퍼 만 읽기 전용 인 경우 toggle-read-only일반적으로에 바인딩 된을 사용할 수 있습니다 C-x C-q.

그러나 파일 자체가 읽기 전용 인 경우 다음 기능이 유용 할 수 있습니다.

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

이 함수에 의존 unix-output하고 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))

에 기능을 배치 ~/.emacs.el하고 평가하거나 emacs를 다시 시작하십시오. 그런 다음을 사용하여 현재 버퍼의 파일을 쓸 수있게 만들 수 있습니다 M-x set-buffer-file-writable.


이 코드를 사용하여 .emacs를 컴파일하려고하면 "경고 : set-buffer에 의해 저장 여행이 패배했습니다"라는 메시지가 표시됩니다.
Alan

1
@Alan은 set-buffer외부 를 넣도록 수정되었습니다 save-excursion.
Vebjorn Ljosa

그 변화에 감사하여 경고를 제거했습니다. 그러나 "경고 : 런타임시 cl 패키지의`subseq 함수"가 있습니다. 내 .emacs에 (eval-compile 할 때 ( 'cl) 필요) 추가했을 때조차도 그것을 제거 할 수 없었습니다.
Alan

이 스레드를 참조하십시오 . 코드를 편집하고 지금 교체 subseq했습니다 substring. 경고를 피해야합니다.
Vebjorn Ljosa

이제 Emacs 24로 넘어 가서 "경고 :`decf '함수가 정의되어 있지 않습니다"라는 메시지가 나타납니다.
Alan


0

나는 Vebjorn Ljosa의 솔루션을 시험해 보았고 적어도 내 Emacs (22.3.1)에는 chmod 출력의 끝에 쓸모없는 줄 바꿈을 제거하는 데 사용되는 'trim-right'와 같은 기능이 없다는 것이 밝혀졌습니다.

'trim-right'에 대한 호출을 제거하면 도움이되었지만 추가 줄 바꿈으로 인해 상태 행이 "반송"되었습니다.


포함하는 것을 잊어 버렸습니다 ... 지금 추가되었습니다.
Vebjorn Ljosa

0

C-x C-q쓸모가 없습니다. 또한 파일을 저장할 수있는 권한이 필요하기 때문입니다.

Spacemacs를 사용 합니다 . 이 질문을 해결하는 편리한 기능을 제공합니다. 코드는 다음과 같습니다.

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

나는 전화 spacemacs/sudo-editemacs에서 파일을 열고 비밀번호를 입력하기 위해 하면 읽기 전용 모드없이 파일을 변경할 수 있습니다.

와 같은 새로운 함수를 작성할 수 있습니다 spacemacs/sudo-edit.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.