ファイルが読み取り専用モードに設定されている場合、Emacs 内から書き込みモードに変更するにはどうすればよいですか?
9 に答える
Mx 読み取り専用モード
非常に古いバージョンの Emacs では、コマンドは次のとおりでした。
Mx トグル読み取り専用
私の Windows ボックスでは、Alt-x でメタ プロンプトを表示し、「read-only-mode」と入力して正しい elisp 関数を呼び出します。
デフォルトのキーボード バインディングを使用している場合は、
Cx Cq
(「Control-X Control-Q」と声に出して読みます)は同じ効果があります。ただし、emacs は本質的に無限に再構成可能であるため、マイレージは異なる場合があることを忘れないでください。
コメントからのフォローアップ:バッファの書き込み可能ステータスは、ファイルの書き込み可能パーミッションを変更しないことに注意してください。読み取り専用ファイルに書き出そうとすると、確認メッセージが表示されます。ただし、ファイルを所有している場合は、ファイルのアクセス許可を変更せずに変更を書き出すことができます。
これは、書き込み権限の追加、変更の書き出し、書き込み権限の削除という複数の手順を実行することなく、ファイルをすばやく変更したい場合に非常に便利です。私はこの最後の手順を忘れがちで、重要な可能性のあるファイルを開いたままにしておくと、後で偶発的に変更される可能性があります。
「ファイル」と「バッファ」を混同しないように注意してください。C-x C-q
バッファを読み取り専用に設定し、 ( )で再び元に戻すことができますtoggle-read-only
。ファイルの読み取り権限はあるが書き込み権限がない場合、ファイル (C-x C-f
またはfind-file
) にアクセスしたときに取得するバッファーは、自動的に読み取り専用モードになります。ファイル システム内のファイルのアクセス許可を変更する場合は、そのdired
ファイルを含むディレクトリから開始することをお勧めします。dired のドキュメントは info にあります。C-h i (emacs)dired RET
.
私が見つけたのはM-x set-file-modes filename mode
Windows Vista ボックスで動作しました。例えば:M-x set-file-modes <RET> ReadOnlyFile.txt <RET> 0666
他の誰かが言及したように: Mx toggle-read-onlyは機能します。
しかし、これは現在非推奨であり、Mx read-only-modeが現在の方法であり、Cx Cqキーバインドに設定されています。
CTRL + X+CTRL + Q
(ファイルではなく) バッファのみが読み取り専用の場合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
。
ファイルのディレクトリ (dired) を見ている場合は、ファイル名に を使用して、コマンドで使用されるのと同じ属性Shift + M
を入力できます。modespec
chmod
M modespec <RET>
http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.htmlのディレクトリ リストにあるファイルに対するその他の便利なコマンドを参照して ください。
Vebjorn Ljosa のソリューションを試してみたところ、少なくとも私の Emacs (22.3.1) には、chmod 出力の最後にある不要な改行を削除するために使用される「trim-right」などの機能がないことがわかりました。
「trim-right」への呼び出しを削除することは役に立ちましたが、余分な改行のためにステータス行が「バウンス」しました。