Bloquer les modifications dans un fichier en lecture seule

14

Lorsque vous utilisez Vim pour éditer un fichier en lecture seule, il fournira simplement un avertissement la première fois qu'il sera édité mais autorisera toutes les modifications. Je peux comprendre que ce comportement pourrait être utile pour quelqu'un qui a l'intention d'enregistrer le fichier sous un autre nom; mais j'ouvre parfois des fichiers auxquels je n'ai pas accès en écriture, puis j'oublie et j'apporte des modifications.

Est-il possible d'entrer dans un mode où Vim permettra au fichier d'être visualisé mais bloquera toute option qui apporte des modifications?

ZeroKelvinKeyboard
la source

Réponses:

13

J'ai trouvé une solution. Le réglage nomodifiableempêche le fichier d'être modifié (comme utilisé dans les fenêtres d'aide). J'ai créé une fonction simple pour définir ou désactiver en modifiablefonction de si readonlyest défini et attaché à un 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
ZeroKelvinKeyboard
la source
4
Vous pouvez le raccourcir en faisant:let &modifiable = !&readonly
Martin Tournoij
@Carpetsmoker Beaucoup mieux en tant que doublure, merci! Cependant, il faudrait tout de même: autocmd BufRead * let &modifiable = !&readonly
ZeroKelvinKeyboard
Avec cela, après avoir ouvert un readonlyfichier puis créé un nouveau tampon, le nouveau tampon se termine nomodifiable.
Praxeolitic
Merci de l'avoir signalé, je ne l'avais pas remarqué. Je ne sais pas comment tester un nouveau tampon.
ZeroKelvinKeyboard
1
@Praxeolitic: Je viens de poster une réponse qui devrait résoudre ce problème, faites-moi savoir si cela fonctionne.
s4y
7

Ajoutez ceci à votre .vimrc:

autocmd BufRead * let &l:modifiable = !&readonly
s4y
la source
Cela s'appuie sur la réponse de @ ZeroKelvinKeyboard pour n'affecter que le tampon actuel.
s4y
0

Dans la mesure où les réponses ci-dessus sont correctes, il y a une autre chose à prendre en compte: tant que le fichier est en "lecture seule", il ne devrait y avoir aucun moyen de modifier le contenu du fichier à moins que vous ne soyez le propriétaire du fichier ou ont le droit de rendre ce fichier accessible en écriture. Et même alors, vim n'écrit pas les modifications dans le fichier, sauf si vous remplacez explicitement l'état "lecture seule" par ": w!".

Si vous pouvez en fait modifier un fichier qui est censé être en lecture seule, vous voudrez peut-être revérifier les droits, il peut y avoir une mauvaise configuration de la sécurité. Si vous ne rendez que vim incapable de modifier le fichier, d'autres moyens de modification seront toujours en place, donc si le fichier ne doit pas être modifié, il devrait avoir les droits définis correctement. Dans Windows, vous pouvez forcer le fichier à être en lecture seule en refusant explicitement le droit de modification à tout le monde, sous Linux, vous pouvez utiliser l'attribut étendu "immuable" (chattr + i).

mikky
la source
2
Désolé si je n'ai pas été très clair. Cette question ne concernait pas la modification accidentelle d'un fichier en lecture seule; Je voulais m'empêcher de pouvoir éditer le tampon d'un fichier pour lequel je n'avais pas accès en écriture. Parfois, j'ouvre accidentellement des fichiers de configuration système en tant qu'utilisateur normal plutôt qu'en tant qu'utilisateur root. Dans ce cas, je n'ai pas accès en écriture au fichier, donc le tampon apparaît en lecture seule mais Vim me permettra toujours de modifier le tampon. Lorsque j'essaie de sauvegarder, je ne peux pas car je n'ai pas accès en écriture. Je voulais que Vim bloque les modifications du tampon dans ce cas.
ZeroKelvinKeyboard
Ah, je vois. J'ai eu l'idée que vous vouliez cela comme une sécurité intégrée. Ignorez ma réponse alors :)
mikky
OP signifie que lorsque l'on ouvre un fichier en lecture seule dans le système d'exploitation, mais qu'il / elle ne souhaite pas (ou ne juge pas approprié) apporter des modifications, et veut se limiter à ne pas le faire. Je pense exactement la même chose, allant donc ici de Google!
Violapterin