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 2009

確かに、それがモードを変更する方法です。ただし、所有する読み取り専用ファイルを指すバッファーで読み取り専用モードを切り替えると、そのファイルを編集して変更を書き出すことができます(もちろん、確認の質問があります)。
Bob Cross、

上記のコメントのフォローアップと回答へのテキストの追加。
ボブ・クロス

5
Emacsの最近のバージョンでは、toggle-read-onlyがread-only-modeに置き換えられました。
ベンキー

15

「ファイル」と「バッファ」を混同しないように注意してください。C-x C-qtoggle-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#0110110110orに相当666)。
Kaushal Modi

7

他の誰かがそこで述べたように:Mx toggle-read-onlyが機能します。

ただし、これは現在廃止されており、Mx read-only-modeCx 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-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))

関数をに配置して~/.emacs.el評価します(またはemacsを再起動します)。その後、現在のバッファ内のファイルをで書き込み可能にすることができますM-x set-buffer-file-writable


このコードを使用して.emacsをコンパイルしようとすると、「警告:set-bufferによって無効化されたsave-excursion」というメッセージが表示されます。
アラン

1
@アラン、set-buffer外側に置くように編集save-excursion
Vebjorn Ljosa 2013

警告を削除したその変更に感謝します。ただし、「警告:実行時に呼び出されるclパッケージの関数 `subseq '」もあります。.emacsに(eval-when-compile(require 'cl))を追加しても、それを取り除くことができませんでした。
アラン

このスレッドを参照してください。私はコードを編集subseqしてsubstring今と置き換えました。これで警告は回避されます。
Vebjorn Ljosa 2013

Emacs 24に移動したので、「警告:関数 `decf 'が定義されていることがわかりません」というメッセージが表示されます。
アラン


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-edit、私は読み取り専用モードなしでファイルを変更することができ、Emacsと入力パスワードでファイルを開きます。

のような新しい関数を書くことができますspacemacs/sudo-edit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.