読み取り専用ファイルへの変更のブロック


14

Vimを使用して読み取り専用ファイルを編集する場合、最初の編集時に警告が表示されるだけで、変更を加えることができます。この振る舞いは、ファイルを別の名前で保存しようとしている人にとって有用であると理解できます。しかし、書き込みアクセス権のないファイルを開いてから、忘れて変更を加えることがあります。

Vimがファイルの閲覧を許可するが、変更を加えるオプションをブロックするモードに入ることは可能ですか?

回答:


13

私は解決策を見つけました。設定nomodifiableすると、ファイルが編集されなくなります(ヘルプウィンドウで使用)。設定さmodifiableれているかどうかに応じて設定または設定解除する単純な関数を作成readonlyし、autocmdにアタッチしました。

" Don't allow editing of read only files
autocmd BufRead * call RONoEdit()

function! RONoEdit()
  if &readonly == 1
    set nomodifiable
  else
    set modifiable
  endif
endfunction

4
以下を行うことで短くすることができます。let &modifiable = !&readonly
Martin Tournoij

@Carpetsmokerワンライナーとしてはるかに良い、ありがとう!しかし、それはまだでなければならない: autocmd BufRead * let &modifiable = !&readonly
ZeroKelvinKeyboard

これにより、readonlyファイルを開いて新しいバッファを作成した後、新しいバッファが終了しnomodifiableます。
プラクセオリック

それを指摘してくれてありがとう、気づかなかった。新しいバッファをテストする方法がわかりません。
ZeroKelvinKeyboard

1
@Praxeolitic:これに対処するための答えを投稿ましたが、機能するかどうかを教えてください。
s4y

7

これを.vimrcに追加します。

autocmd BufRead * let &l:modifiable = !&readonly

これは、@ ZeroKelvinKeyboardの回答に基づいて構築され、現在のバッファーにのみ影響を与えます。
s4y

0

上記の答えが正しい限り、考慮すべきもう1つの点があります。ファイルが「読み取り専用」である限り、ファイルの所有者でない限り、ファイルの内容を変更する方法はないはずです。そのファイルを書き込み可能にする権利があります。その場合でも、「:w!」によって「読み取り専用」状態を明示的にオーバーライドしない限り、vimはファイルに変更を書き込みません。

読み取り専用であるはずのファイルを実際に編集できる場合は、権限を再確認したい場合があります。セキュリティの構成が間違っている可能性があります。vimがファイルを編集できないようにした場合、他の編集方法が引き続き有効になるため、ファイルを変更しない場合は、適切に設定された権限が必要です。Windowsでは、すべてのユーザーに対して変更を明示的に拒否することにより、ファイルを強制的に読み取り専用にすることができます。Linuxでは、「不変」拡張属性(chattr + i)を使用できます。


2
よくわからない場合は申し訳ありません。この質問は、誤って読み取り専用ファイルを変更することではありません。書き込みアクセス権のないファイルのバッファを編集できないようにしたかったのです。システム設定ファイルをrootユーザーではなく通常のユーザーとして誤って開くことがあります。この場合、ファイルへの書き込みアクセス権がないため、バッファーは読み取り専用として表示されますが、Vimではバッファーを編集できます。保存しようとすると、書き込みアクセス権がないため保存できません。この場合、Vimがバッファーへの変更をブロックすることを望みました。
ZeroKelvinKeyboard

ああ、分かった。フェールセーフとしてこれを望んでいるというアイデアを得ました。私の答えを無視してください:)
mikky

OPとは、OSで読み取り専用ではないファイルを開いたときに、現在変更を行いたくない(または適切だと考えている)ため、自分自身を制限しないことを意味します。私はまったく同じことを考えているので、Googleからここに行きます!
ビオラプテリン16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.