Blokowanie zmian w pliku tylko do odczytu

14

Kiedy używasz Vima do edycji pliku tylko do odczytu, dostarczy on ostrzeżenie przy pierwszej edycji, ale pozwoli na wprowadzenie jakichkolwiek zmian. Rozumiem, że to zachowanie może być przydatne dla kogoś, kto zamierza zapisać plik pod inną nazwą; ale czasami otwieram pliki, do których nie mam dostępu do zapisu, a następnie zapominam i wprowadzam zmiany.

Czy można wejść w tryb, w którym Vim pozwoli na przeglądanie pliku, ale zablokuje dowolną opcję, która wprowadza zmiany?

ZeroKelvinKeyboard
źródło

Odpowiedzi:

13

Znalazłem rozwiązanie. Ustawienie nomodifiableuniemożliwia edycję pliku (jak w oknach pomocy). Stworzyłem prostą funkcję do ustawienia lub rozbrojenia w modifiablezależności od tego, czy readonlyjest ustawiony i podłączyłem go do 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
źródło
4
Możesz go skrócić, wykonując:let &modifiable = !&readonly
Martin Tournoij
@Carpetsmoker Znacznie lepiej jako jeden liniowiec, dzięki! Jednak nadal musiałoby to być: autocmd BufRead * let &modifiable = !&readonly
ZeroKelvinKeyboard
Dzięki temu, po otwarciu readonlypliku, a następnie utworzeniu nowego bufora, nowy bufor kończy się nomodifiable.
Praxeolitic
Dzięki za zwrócenie na to uwagi, nie zauważyłem. Nie jestem pewien, jak przetestować nowy bufor.
ZeroKelvinKeyboard
1
@Praxeolitic: Właśnie opublikowałem odpowiedź, która powinna rozwiązać ten problem, daj mi znać, czy to działa.
s4y 11.11.16
7

Dodaj to do swojego .vimrc:

autocmd BufRead * let &l:modifiable = !&readonly
s4y
źródło
Opiera się to na odpowiedzi @ ZeroKelvinKeyboard, aby wpływać tylko na bieżący bufor.
s4y
0

Ponieważ powyższe odpowiedzi są prawidłowe, należy wziąć pod uwagę jeszcze jedną rzecz: dopóki plik jest „tylko do odczytu”, nie powinno być możliwości zmiany zawartości pliku, chyba że jesteś właścicielem pliku lub mieć prawo do zapisu tego pliku. I nawet wtedy vim nie zapisuje zmian w pliku, chyba że jawnie zastąpisz stan „tylko do odczytu” przez „: w!”.

Jeśli w rzeczywistości możesz edytować plik, który ma być tylko do odczytu, możesz ponownie sprawdzić uprawnienia, może to oznaczać błąd w konfiguracji zabezpieczeń. Jeśli sprawisz, że vim nie będzie mógł edytować pliku, inne sposoby edycji będą nadal obowiązywały, więc jeśli plik nie ma zostać zmieniony, powinien mieć ustawione odpowiednie uprawnienia. W systemie Windows możesz wymusić, aby plik był tylko do odczytu, wyraźnie odmawiając wszystkim prawa do zmiany, w systemie Linux możesz użyć atrybutu rozszerzonego „niezmiennego” (chattr + i).

mikky
źródło
2
Przepraszam, jeśli nie byłem bardzo jasny. To pytanie nie dotyczyło przypadkowej zmiany pliku tylko do odczytu; Chciałem powstrzymać się od możliwości edycji bufora pliku, dla którego nie miałem dostępu do zapisu. Czasami przypadkowo otwieram pliki konfiguracji systemu jako zwykły użytkownik, a nie użytkownik root. W tym przypadku nie mam dostępu do zapisu do pliku, więc bufor pojawia się jako tylko do odczytu, ale Vim nadal pozwoli mi edytować bufor. Kiedy próbuję zapisać, nie mogę, ponieważ nie mam dostępu do zapisu. W tym przypadku chciałem, aby Vim zablokował zmiany w buforze.
ZeroKelvinKeyboard
O, rozumiem. Wpadłem na pomysł, że chciałeś tego jako zabezpieczenia przed awarią. Zignoruj ​​więc moją odpowiedź :)
mikky
OP oznacza, że ​​kiedy ktoś otwiera plik nie tylko do odczytu w systemie operacyjnym, ale obecnie nie chce (lub uważa za stosowne) dokonać zmian i chce się ograniczyć. Myślę dokładnie tak samo, dlatego wybieram się tutaj z Google!
Violapterin