web-dev-qa-db-ja.com

Emacsを使用してファイルの読み取り/書き込みモードを変更するにはどうすればよいですか?

ファイルが読み取り専用モードに設定されている場合、Emacs内から書き込みモードに変更するにはどうすればよいですか?

121
Ray Vega

M-xトグル読み取り専用

またはEmacsの最新バージョン

M-x読み取り専用モード

私のWindowsボックスでは、Alt-xでメタプロンプトが表示され、「toggle-read-only」と入力して正しいelisp関数が呼び出されます。

デフォルトのキーボードバインディングを使用している場合、

C-x C-q

(「Control-X Control-Q」と読み上げます)同じ効果があります。ただし、emacsは本質的に無限に再構成可能であることを考えると、走行距離は異なる場合があります。

コメントの続き:バッファの書き込み可能ステータスは、ファイルの書き込み可能パーミッションを変更しないことに注意してください。読み取り専用fileに書き込もうとすると、確認メッセージが表示されます。ただし、ファイルを所有している場合は、変更を書き出すことができますwithoutファイルの権限を変更します。

これは、書き込み権限の追加、変更の書き出し、書き込み権限の削除の複数の手順を実行することなく、ファイルをすばやく変更したい場合に非常に便利です。私はその最後のステップを忘れがちで、潜在的に重要なファイルを開いたままにして、後で誤って変更することがあります。

173
Bob Cross

「ファイル」と「バッファ」を混同しないようにしてください。 _C-x C-q_(_toggle-read-only_)を使用して、バッファーを読み取り専用に設定し、元に戻すことができます。ファイルの読み取り権限はあるが書き込み権限がない場合、ファイルにアクセスしたときに取得するバッファー(_C-x C-f_または_find-file_)は自動的に読み取り専用モードになります。ファイルシステム内のファイルのアクセス許可を変更する場合は、ファイルを含むディレクトリのdiredで開始するのがよいでしょう。 diredのドキュメントはinfoにあります。 C-h i (emacs)dired RET

14
jfm3

私が見つけたのはM-x set-file-modes filename mode

それは私のWindows Vistaボックスで機能しました。例えば: M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666

12

他の誰かがそこに述べたように:M-x toggle-read-onlyは動作します。

ただし、これは現在非推奨であり、M-x読み取り専用モードが現在の方法であり、C-x C-q keybindingに設定されています。

7
Borja Tarraso

CTRL + X + CTRL + Q 

7
anjanb

バッファのみ(ファイルではなく)が読み取り専用の場合、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を使用して、現在のバッファー内のファイルを書き込み可能にすることができます。

6
Vebjorn Ljosa

ファイルのディレクトリ(ディレクトリ)を表示している場合、ファイル名にShift + Mを使用し、modespecコマンドで使用される属性と同じchmodを入力できます。
M modespec <RET>

http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html にあるディレクトリリスト内のファイルに関するその他の便利なコマンドを参照してください。

2
Louis Roehrs

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のような新しい関数を書くことができます。

0
Li Tianyi

Vebjorn Ljosaのソリューションを試してみましたが、少なくとも私のEmacs(22.3.1)には、chmod出力の最後にある不要な改行を削除するために使用される 'trim-right'などの機能がありませんでした。

'trim-right'への呼び出しを削除することは役立ちましたが、余分な改行のためにステータス行が "バウンス"されました。

0