回答:
このstackoverflow回答から、skinpによって
:w !sudo tee %
書き込み権限のないファイルを編集する前に、sudoを忘れることがよくあります。そのファイルを保存してアクセス権エラーが発生した場合、そのvimコマンドを発行するだけで、一時ファイルに保存せずにファイルを保存し、再度コピーすることができます。
これに私を投票しないでください。この答えを実装することはお勧めしませんが、それはrkthkrが求めている答えです。
rkthkr氏:
しかし、vimを再起動してrootとして実行するのは良いことです
これを行う方法は、:!sudo vim %
ipozgajで説明したように、引数としての%(サブ引数も)が現在のバッファーへのパスに置き換えられます。(パスワードの入力を求められる場合があります。)最終的に、rootが所有する新しいvimプロセスになります。これは元のvimプロセスの子プロセスです。間抜けだね?psでは次のようになります。
~# ps afo pid,ppid,user,stat,comm
PID PPID USER STAT COMMAND
16187 30478 rbronosky Ss bash
16510 16187 rbronosky R+ \_ ps
30482 30478 rbronosky Ss bash
16244 30482 rbronosky S+ \_ vim
16318 16244 root S+ \_ vim
ファイルを含むディレクトリへの書き込み権限があり、そのファイルを編集した場合、スワップファイルが終了するという警告が表示される場合があります。[R] ecoverを選択すると、親vimプロセスによって行われた変更のほとんどが反映されます。(*スワップの更新はタイミングがとられているか、デルタのしきい値を持っていると思います。すでにこれに時間を費やしすぎているので、調査する気にはなりません。)まだvimで... 2番目のvimプロセスを開きました。覚えてる?
さて、すべてのことを言って...私はこれを行うことはほとんどありません。たぶん、コーヒーが足りなかったり、コーヒーの量が少なかったので、ルートとしてさらにいくつかのファイルを編集する必要があることに気づいたら...これを試してみるかもしれません。システム管理の14年間で、私は決して経験しませんでした。しかし、私の希望するソリューション(dbrが提供するとおり)に不満を表明するまで、私はこれについて考えたことはありませんでした。
:w !sudo tee %
ことはできないので、これは良い答えだと思います。
私は通常、それを$ HOME / tmp / apache.confの一時ファイルに保存します(たとえば)
sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf
これは、変更をマージするための余分な作業ですが、成果がありました。利便性と望ましくない変更に対する測定との間の良い方法であることがわかりました
それ以前は、ACLを考えたり、対応するグループをファイルに割り当てたりしていましたが、ほとんどの場合うまくいきませんでした。所有権を変更するのを忘れたか、そうしないつもりでファイルを変更していました。
これは、現在まで管理されていないファイルにのみ当てはまります。使用する全体的なソリューションは、人々がローカルでファイルを編集し、適切なサーバーで変更をテストするgitリポジトリを備えたpuppetです。
私が通常行うことは、必ずしも最速というわけではありませんが、確かに安全ですが、次のようなことをすることです(例としてnsswitch.confを使用):
:w! ~/%
vimを終了し、次を実行します。
sudo vim nsswitch.conf
1GdG
:r ~/%
これにより、すべての行が削除され、変更および更新されたバージョンが読み込まれ、その場所で編集されます。ホームディレクトリを使用すると、アクセス権があるかどうかを考える必要がなくなり、/ tmpよりもプライベートになります。これはファイル全体の置換であることに注意してください。すべての変更を追加したくない場合は、選択する必要があります。
これらの回答のいずれかに頭痛が伴うにもかかわらず、変更を失う理由はありません。