ファイルが読み取り専用モードに設定されている場合、Emacs内から書き込みモードに変更するにはどうすればよいですか?
M-xトグル読み取り専用
またはEmacsの最新バージョン
M-x読み取り専用モード
私のWindowsボックスでは、Alt-xでメタプロンプトが表示され、「toggle-read-only」と入力して正しいelisp関数が呼び出されます。
デフォルトのキーボードバインディングを使用している場合、
C-x C-q
(「Control-X Control-Q」と読み上げます)同じ効果があります。ただし、emacsは本質的に無限に再構成可能であることを考えると、走行距離は異なる場合があります。
コメントの続き:バッファの書き込み可能ステータスは、ファイルの書き込み可能パーミッションを変更しないことに注意してください。読み取り専用fileに書き込もうとすると、確認メッセージが表示されます。ただし、ファイルを所有している場合は、変更を書き出すことができますwithoutファイルの権限を変更します。
これは、書き込み権限の追加、変更の書き出し、書き込み権限の削除の複数の手順を実行することなく、ファイルをすばやく変更したい場合に非常に便利です。私はその最後のステップを忘れがちで、潜在的に重要なファイルを開いたままにして、後で誤って変更することがあります。
「ファイル」と「バッファ」を混同しないようにしてください。 _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
他の誰かがそこに述べたように:M-x toggle-read-onlyは動作します。
ただし、これは現在非推奨であり、M-x読み取り専用モードが現在の方法であり、C-x C-q keybindingに設定されています。
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
を使用して、現在のバッファー内のファイルを書き込み可能にすることができます。
ファイルのディレクトリ(ディレクトリ)を表示している場合、ファイル名にShift + M
を使用し、modespec
コマンドで使用される属性と同じchmod
を入力できます。M modespec <RET>
http://www.gnu.org/s/libtool/manual/emacs/Operating-on-Files.html にあるディレクトリリスト内のファイルに関するその他の便利なコマンドを参照してください。
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
のような新しい関数を書くことができます。
Vebjorn Ljosaのソリューションを試してみましたが、少なくとも私のEmacs(22.3.1)には、chmod出力の最後にある不要な改行を削除するために使用される 'trim-right'などの機能がありませんでした。
'trim-right'への呼び出しを削除することは役立ちましたが、余分な改行のためにステータス行が "バウンス"されました。