現在の問題に応じて、いくつかの異なるアプローチがあるようです:
<オール>:set readonly
がある場合 できます:w!
を使用 強制書き込み、または:set noreadonly
を発行 次に、通常の:w
を使用します
- 問題:
:w !sudo tee %
.これにより、バッファがtee
に書き込まれます pipe を受け取るコマンド ファイルに書き込むことができます。そして、tee は sudo 権限で実行されるため、tee はファイルを変更できます。
:w! ~/tempfile.ext
を使用 変更を一時ファイルに書き込み、その一時ファイルをディレクトリに移動する手段を講じます (一時ファイルをディレクトリの所有者/管理者に送信します)。
詳細については、こちらをご覧ください:
<オール>ショートカット
よくあることですが、問題 #2 (許可 問題、sudo で )、あなたの /etc/vim/vimrc
にできます (または ~/.vimrc
) 次のショートカット:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
次に、 :w!!
と入力するだけです sudo で保存する 力。ここでは説明しませんが、上記の参考文献には多くのショートカットが含まれています。
これを行うには 2 つの方法が考えられます。
最初の方法はファイルの所有者であることを前提としていますが、ファイルは読み取り専用です。
vi の感嘆符サフィックスを書き込みコマンド (:w!) に使用するだけで、独自の READONLY ファイルを強制的に上書きできます。もちろん、これは、現在のフォルダーでの書き込みと実行のアクセス許可があることを前提としています。
:w!
vi は元の READONLY ファイルを上書きします。
2 番目の方法は、他の誰かがファイルを所有していて、変更をそのファイルに保存したいと考えている場合です。
これを実現する 1 つの方法は、元のファイルに加えられた変更を vi 内から ed スクリプトとして保存することです。この ed スクリプトは、後で vi の外部で ed ライン エディターを使用して元のファイル (または他の同様のファイル) に適用できます。
現在の編集セッションを ed スクリプトとして保存する方法は、元のファイル名と編集済みの vi バッファーを標準入力として diff ユーティリティに --ed コマンド ライン スイッチを使用して渡すことです。つまり、違いを ed スクリプトとして表示します。
したがって、編集された vi バッファーを想定して、次の手順を実行します
:.,$!diff --ed [original_file] -
これにより、現在のバッファ (.,$!) 内のすべての行が、元のファイルを現在のバッファの内容に変換するために必要な diff によって生成された ed スクリプト (diff --ed [original_file] -) に置き換えられます。次に、この ed スクリプトを安全な場所に保存し、書き込み可能な元のファイルのバージョンにスクリプトを適用します。そのため、スクリプトを書き込み可能な場所 (ログイン フォルダーなど) に保存します。
:w ~/my_ed_script
vi を終了し、この ed スクリプトを使用して、最初に保存できなかった編集済みファイルを取得します。これを bash コマンド ライン プロンプト「$」から実行する方法は次のとおりです。
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
このコマンド シーケンスを言葉で表すと、生成したスクリプトを diff で連結し、ed 書き込みコマンド 'w' を ed の標準入力にエコーします。次に、Ed はこのスクリプトを元のファイルの書き込み可能なコピーに適用し、変更されたバッファの変更をファイルに書き戻します。
これは、vi で実行された作業を、vi、diff、および ed を使用して他の誰かが所有していたファイルに保存する方法です。