Làm cách nào để thay đổi chế độ đọc / ghi cho tệp bằng Emacs?


126

Nếu một tệp được đặt thành chế độ chỉ đọc, làm thế nào để tôi thay đổi nó thành chế độ ghi và ngược lại từ bên trong Emacs?

Câu trả lời:


178

Mx chuyển đổi chỉ đọc

hoặc trong các phiên bản gần đây hơn của Emacs

Chế độ chỉ đọc Mx

Trên hộp Windows của tôi, số tiền đó tương ứng với Alt-x để hiển thị dấu nhắc meta và gõ "chỉ chuyển đổi chỉ đọc" để gọi hàm elisp chính xác.

Nếu bạn đang sử dụng các ràng buộc bàn phím mặc định,

Cx Cq

(mà bạn đọc to là "Control-X Control-Q") sẽ có tác dụng tương tự. Tuy nhiên, hãy nhớ rằng emacs về cơ bản là có thể cấu hình lại, số dặm của bạn có thể thay đổi.

Theo dõi từ bình luận: bạn nên lưu ý rằng trạng thái có thể ghi của bộ đệm không thay đổi sự cho phép có thể ghi của tệp. Nếu bạn cố gắng viết ra một tệp chỉ đọc , bạn sẽ thấy một thông báo xác nhận. Tuy nhiên, nếu bạn sở hữu tệp, bạn có thể viết ra các thay đổi của mình mà không thay đổi quyền trên tệp.

Điều này rất thuận tiện nếu bạn muốn thay đổi nhanh chóng thành một tệp mà không phải trải qua nhiều bước thêm quyền ghi, viết thay đổi, xóa quyền ghi. Tôi có xu hướng quên bước cuối cùng đó, để lại các tệp quan trọng có khả năng mở cho các thay đổi ngẫu nhiên sau này.


5
Xin chào, như đã nêu trong câu trả lời từ jfm3 toggle-read-onlychỉ bật trạng thái chỉ đọc của bộ đệm không phải của tệp. Nếu bạn muốn thay đổi chế độ của tệp, hãy sử dụng diredhoặc thực thi chmod +wnhư một lệnh shell trên tệp.
danielpoe

Đúng, đó là cách bạn sẽ thay đổi chế độ. Tuy nhiên, nếu bạn chuyển chế độ chỉ đọc trên bộ đệm trỏ đến tệp chỉ đọc mà bạn sở hữu, bạn sẽ có thể chỉnh sửa nó và viết ra các thay đổi của mình (tất nhiên sẽ có câu hỏi xác nhận).
Bob Cross

Theo dõi các ý kiến ​​trên và thêm văn bản vào câu trả lời.
Bob Cross

5
Trong các phiên bản gần đây của Emacs, chuyển đổi chỉ đọc đã được thay thế bằng chế độ chỉ đọc.
Ben Key

15

Hãy chắc chắn rằng bạn không nhầm lẫn 'tập tin' với 'bộ đệm'. Bạn có thể đặt bộ đệm thành chỉ đọc và quay lại với C-x C-q( toggle-read-only). Nếu bạn có quyền đọc, nhưng không ghi, một tệp, bộ đệm bạn nhận được khi bạn truy cập tệp ( C-x C-fhoặc find-file) sẽ tự động được đặt ở chế độ chỉ đọc. Nếu bạn muốn thay đổi quyền trên một tệp trong hệ thống tệp, có thể bắt đầu bằng diredthư mục chứa tệp. Tài liệu cho dired có thể được tìm thấy trong thông tin; C-h i (emacs)dired RET.


inc. Dạy một người đàn ông câu cá ...
user234461

12

Những gì tôi tìm thấy là M-x set-file-modes filename mode

Nó hoạt động ở hộp Windows Vista của tôi. Ví dụ:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666


Theo tôi, đây là câu trả lời đúng cho câu hỏi chính xác.
Mathias Dahl

1
Trong elisp, điều này đã làm việc: (set-file-modes FILE 438)(trong đó 438 là số thập phân tương đương 2#0110110110hoặc 666).
Kaushal Modi

7

Như đã đề cập ở trên bởi một người khác: Mx toggle-read-only sẽ hoạt động.

Tuy nhiên, điều này hiện không được chấp nhận và chế độ chỉ đọc Mx là cách hiện tại để thực hiện, nó được đặt thành liên kết phím Cx Cq .



6

Nếu chỉ có bộ đệm (và không phải tệp) là chỉ đọc, bạn có thể sử dụng toggle-read-only, thường được ràng buộc C-x C-q.

Tuy nhiên, nếu bản thân tệp chỉ đọc, bạn có thể thấy chức năng sau đây hữu ích:

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

Hàm phụ thuộc vào unix-outputtrim-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))

Đặt các chức năng trong của bạn ~/.emacs.el, đánh giá chúng (hoặc khởi động lại emacs). Sau đó, bạn có thể làm cho tệp trong bộ đệm hiện tại có thể ghi với M-x set-buffer-file-writable.


Khi tôi cố gắng biên dịch .emacs của mình bằng mã này, tôi nhận được thông báo "Cảnh báo: lưu-tham quan bị đánh bại bởi bộ đệm".
Alan

1
@Alan, chỉnh sửa để đặt set-bufferbên ngoài save-excursion.
Vebjorn Ljosa

cảm ơn vì sự thay đổi đó đã loại bỏ cảnh báo Tuy nhiên, có một cái khác: "Cảnh báo: Hàm` subseq 'từ gói cl được gọi khi chạy. " Tôi không thể loại bỏ điều đó ngay cả khi tôi đã thêm (eval-when-compile (yêu cầu 'cl)) vào .emacs của tôi.
Alan

Xem chủ đề này . Tôi đã chỉnh sửa mã và thay thế subseqbằng substringbây giờ. Điều đó nên tránh cảnh báo.
Vebjorn Ljosa

Bây giờ tôi đã chuyển sang Emacs 24, tôi nhận được thông báo "Cảnh báo: không xác định được chức năng` decf '. "
Alan


0

Tôi đã thử giải pháp của Vebjorn Ljosa và hóa ra ít nhất trong Emacs của tôi (22.3.1) không có chức năng như "trim-right", được sử dụng để xóa một dòng mới vô dụng ở cuối đầu ra chmod.

Xóa cuộc gọi thành 'trim-right', nhưng làm cho hàng trạng thái "nảy" vì có thêm dòng mới.


Quên bao gồm nó ngay bây giờ.
Vebjorn Ljosa

0

C-x C-qlà vô dụng Bởi vì bạn cũng cần sự cho phép để lưu một tập tin.

Tôi sử dụng Spacemacs . Nó cho tôi một chức năng thuận tiện để giải quyết câu hỏi này. Các mã đang theo sau.

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

Tôi gọi spacemacs/sudo-edit để mở một tệp trong emacs và nhập mật khẩu của mình, tôi có thể thay đổi tệp mà không cần chế độ chỉ đọc.

Bạn có thể viết một chức năng mới như thế nào spacemacs/sudo-edit.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.